summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/controller/dwc/pci-imx6.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c
index 663f41df33ab..b130a9282101 100644
--- a/drivers/pci/controller/dwc/pci-imx6.c
+++ b/drivers/pci/controller/dwc/pci-imx6.c
@@ -1148,6 +1148,12 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie)
dev_err(dev, "failed to disable vpcie regulator: %d\n",
ret);
}
+
+ /* Some boards don't have PCIe reset GPIO. */
+ if (imx6_pcie->reset_gpiod) {
+ gpiod_set_value_cansleep(imx6_pcie->reset_gpiod,
+ !imx6_pcie->gpio_active_high);
+ }
}
static void imx6_pcie_set_l1_latency(struct imx6_pcie *imx6_pcie)
@@ -1223,16 +1229,6 @@ static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
break;
}
- /* Some boards don't have PCIe reset GPIO. */
- if (imx6_pcie->reset_gpiod) {
- gpiod_set_value_cansleep(imx6_pcie->reset_gpiod,
- !imx6_pcie->gpio_active_high);
- msleep(100);
- gpiod_set_value_cansleep(imx6_pcie->reset_gpiod,
- imx6_pcie->gpio_active_high);
- msleep(20);
- }
-
switch (imx6_pcie->drvdata->variant) {
case IMX8QM:
case IMX8QM_EP:
@@ -1403,6 +1399,19 @@ static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
break;
}
+ /* Some boards don't have PCIe reset GPIO. */
+ if (imx6_pcie->reset_gpiod) {
+ msleep(100);
+ gpiod_set_value_cansleep(imx6_pcie->reset_gpiod,
+ imx6_pcie->gpio_active_high);
+ /*
+ * PCI Express Base Specification:
+ * A delay of at least 100ms is required after PERST# is
+ * de-asserted before issuing any Configuration Requests
+ */
+ msleep(100);
+ }
+
return 0;
err_pll: