diff options
-rw-r--r-- | drivers/pci/controller/dwc/pci-imx6.c | 29 |
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: |