PCI: tegra: Put PEX CLK & BIAS pads in DPD mode
authorManikanta Maddireddy <mmaddireddy@nvidia.com>
Tue, 18 Jun 2019 18:02:03 +0000 (23:32 +0530)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Thu, 20 Jun 2019 16:40:48 +0000 (17:40 +0100)
In Tegra210 AFI design has clamp value for the BIAS pad as 0, which keeps
the bias pad in non power down mode. This is leading to power consumption
of 2 mW in BIAS pad, even if the PCIe partition is powergated. To avoid
unnecessary power consumption, put PEX CLK & BIAS pads in deep power down
mode when PCIe partition is power gated.

Signed-off-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Thierry Reding <treding@nvidia.com>
drivers/pci/controller/pci-tegra.c

index 6be4ea72da92f70b1dffb3a09335f724a07684c9..0fd1c1a8c1b9f8bfec9e1477713d8ec4a5b73717 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/of_platform.h>
 #include <linux/pci.h>
 #include <linux/phy/phy.h>
+#include <linux/pinctrl/consumer.h>
 #include <linux/platform_device.h>
 #include <linux/reset.h>
 #include <linux/sizes.h>
@@ -2853,6 +2854,7 @@ static int __maybe_unused tegra_pcie_pm_suspend(struct device *dev)
        if (IS_ENABLED(CONFIG_PCI_MSI))
                tegra_pcie_disable_msi(pcie);
 
+       pinctrl_pm_select_idle_state(dev);
        tegra_pcie_power_off(pcie);
 
        return 0;
@@ -2868,6 +2870,13 @@ static int __maybe_unused tegra_pcie_pm_resume(struct device *dev)
                dev_err(dev, "tegra pcie power on fail: %d\n", err);
                return err;
        }
+
+       err = pinctrl_pm_select_default_state(dev);
+       if (err < 0) {
+               dev_err(dev, "failed to disable PCIe IO DPD: %d\n", err);
+               goto poweroff;
+       }
+
        tegra_pcie_enable_controller(pcie);
        tegra_pcie_setup_translations(pcie);
 
@@ -2877,7 +2886,7 @@ static int __maybe_unused tegra_pcie_pm_resume(struct device *dev)
        err = clk_prepare_enable(pcie->pex_clk);
        if (err) {
                dev_err(dev, "failed to enable PEX clock: %d\n", err);
-               goto poweroff;
+               goto pex_dpd_enable;
        }
 
        reset_control_deassert(pcie->pex_rst);
@@ -2898,6 +2907,8 @@ static int __maybe_unused tegra_pcie_pm_resume(struct device *dev)
 disable_pex_clk:
        reset_control_assert(pcie->pex_rst);
        clk_disable_unprepare(pcie->pex_clk);
+pex_dpd_enable:
+       pinctrl_pm_select_idle_state(dev);
 poweroff:
        tegra_pcie_power_off(pcie);