summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Eichenberger <stefan.eichenberger@toradex.com>2023-11-08 11:37:54 +0100
committerStefan Eichenberger <eichest@gmail.com>2023-11-08 11:43:06 +0100
commit5ee7c6180bd5d7f7fc0a3c43b8de5dd2fc763f01 (patch)
tree5e582df5fcbc14cd4e1dbb6752fd783e3bbbaad4
parent6f32493eb88ebc38bad93edb48dffa0607450c4e (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.c22
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;
}