diff options
author | Stefan Eichenberger <stefan.eichenberger@toradex.com> | 2023-11-08 11:37:54 +0100 |
---|---|---|
committer | Stefan Eichenberger <eichest@gmail.com> | 2023-11-08 11:43:06 +0100 |
commit | 5ee7c6180bd5d7f7fc0a3c43b8de5dd2fc763f01 (patch) | |
tree | 5e582df5fcbc14cd4e1dbb6752fd783e3bbbaad4 | |
parent | 6f32493eb88ebc38bad93edb48dffa0607450c4e (diff) |
Revert "PCI: imx6: Turn off regulator when system is in suspend mode"
This reverts commit 6f32493eb88ebc38bad93edb48dffa0607450c4e.
This commit seems to introduce an issue on Colibri iMX8X. The
rcu_preempt detects a stall and the system can't continue booting:
[ 1.177262] debugfs: Directory 'mipi1' with parent 'pm_genpd' already present!
[ 1.269919] imx6q-pcie 5f010000.pcie: PCIe PLL lock timeout
[ 22.507669] rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
[ 22.513885] rcu: 1-...0: (1 ticks this GP) idle=231/1/0x4000000000000000 softirq=63/63 fqs=2205
[ 85.543667] rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
Upstream-Status: Inappropriate [Other]
The iMX8X PCIe is not supported by upstream yet
Signed-off-by: Stefan Eichenberger <eichest@gmail.com>
-rw-r--r-- | drivers/pci/controller/dwc/pci-imx6.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c index af39ab4d0416..f0f57f4f6d01 100644 --- a/drivers/pci/controller/dwc/pci-imx6.c +++ b/drivers/pci/controller/dwc/pci-imx6.c @@ -1114,6 +1114,14 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie) break; } + if (imx6_pcie->vpcie && regulator_is_enabled(imx6_pcie->vpcie) > 0) { + int ret = regulator_disable(imx6_pcie->vpcie); + + if (ret) + dev_err(dev, "failed to disable vpcie regulator: %d\n", + ret); + } + /* Some boards don't have PCIe reset GPIO. */ if (gpio_is_valid(imx6_pcie->reset_gpio)) gpio_set_value_cansleep(imx6_pcie->reset_gpio, @@ -1154,7 +1162,7 @@ static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) int ret, i; u32 val, tmp; - if (imx6_pcie->vpcie) { + if (imx6_pcie->vpcie && !regulator_is_enabled(imx6_pcie->vpcie)) { ret = regulator_enable(imx6_pcie->vpcie); if (ret) { dev_err(dev, "failed to enable vpcie regulator: %d\n", @@ -1348,12 +1356,9 @@ static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) return 0; err_vpcie: - if (imx6_pcie->vpcie) { - ret = regulator_disable(imx6_pcie->vpcie); - if (ret) - dev_err(dev, "failed to disable vpcie regulator: %d\n", - ret); - } + if (imx6_pcie->vpcie) + regulator_disable(imx6_pcie->vpcie); + return ret; } @@ -2277,9 +2282,6 @@ static int imx6_pcie_suspend_noirq(struct device *dev) imx6_pcie_clk_disable(imx6_pcie); } - if (imx6_pcie->vpcie) - regulator_disable(imx6_pcie->vpcie); - return 0; } |