diff options
| -rw-r--r-- | drivers/pci/controller/dwc/pci-imx6.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c index fc652d15a054..24c373020adc 100644 --- a/drivers/pci/controller/dwc/pci-imx6.c +++ b/drivers/pci/controller/dwc/pci-imx6.c @@ -901,9 +901,6 @@ static void imx_pcie_assert_core_reset(struct imx_pcie *imx_pcie) if (imx_pcie->drvdata->core_reset) imx_pcie->drvdata->core_reset(imx_pcie, true); - - /* Some boards don't have PCIe reset GPIO. */ - gpiod_set_value_cansleep(imx_pcie->reset_gpiod, 1); } static void imx_pcie_deassert_core_reset(struct imx_pcie *imx_pcie) @@ -912,14 +909,6 @@ static void imx_pcie_deassert_core_reset(struct imx_pcie *imx_pcie) if (imx_pcie->drvdata->core_reset) imx_pcie->drvdata->core_reset(imx_pcie, false); - - /* Some boards don't have PCIe reset GPIO. */ - if (imx_pcie->reset_gpiod) { - msleep(100); - gpiod_set_value_cansleep(imx_pcie->reset_gpiod, 0); - /* Wait for 100ms after PERST# deassertion (PCIe r5.0, 6.6.1) */ - msleep(100); - } } static int imx_pcie_wait_for_speed_change(struct imx_pcie *imx_pcie) @@ -1231,6 +1220,19 @@ static void imx_pcie_disable_device(struct pci_host_bridge *bridge, imx_pcie_remove_lut(imx_pcie, pci_dev_id(pdev)); } +static void imx_pcie_assert_perst(struct imx_pcie *imx_pcie, bool assert) +{ + if (assert) { + gpiod_set_value_cansleep(imx_pcie->reset_gpiod, 1); + } else { + if (imx_pcie->reset_gpiod) { + msleep(PCIE_T_PVPERL_MS); + gpiod_set_value_cansleep(imx_pcie->reset_gpiod, 0); + msleep(PCIE_RESET_CONFIG_WAIT_MS); + } + } +} + static int imx_pcie_host_init(struct dw_pcie_rp *pp) { struct dw_pcie *pci = to_dw_pcie_from_pp(pp); @@ -1253,6 +1255,7 @@ static int imx_pcie_host_init(struct dw_pcie_rp *pp) } imx_pcie_assert_core_reset(imx_pcie); + imx_pcie_assert_perst(imx_pcie, true); if (imx_pcie->drvdata->init_phy) imx_pcie->drvdata->init_phy(imx_pcie); @@ -1291,6 +1294,7 @@ static int imx_pcie_host_init(struct dw_pcie_rp *pp) imx_pcie_ltssm_disable(dev); imx_pcie_deassert_core_reset(imx_pcie); + imx_pcie_assert_perst(imx_pcie, false); if (imx_pcie->drvdata->wait_pll_lock) { ret = imx_pcie->drvdata->wait_pll_lock(imx_pcie); @@ -1587,6 +1591,7 @@ static int imx_pcie_suspend_noirq(struct device *dev) * clock which saves some power. */ imx_pcie_assert_core_reset(imx_pcie); + imx_pcie_assert_perst(imx_pcie, true); imx_pcie->drvdata->enable_ref_clk(imx_pcie, false); } else { return dw_pcie_suspend_noirq(imx_pcie->pci); @@ -1608,6 +1613,7 @@ static int imx_pcie_resume_noirq(struct device *dev) if (ret) return ret; imx_pcie_deassert_core_reset(imx_pcie); + imx_pcie_assert_perst(imx_pcie, false); /* * Using PCIE_TEST_PD seems to disable MSI and powers down the @@ -1845,6 +1851,7 @@ static void imx_pcie_shutdown(struct platform_device *pdev) /* bring down link, so bootloader gets clean state in case of reboot */ imx_pcie_assert_core_reset(imx_pcie); + imx_pcie_assert_perst(imx_pcie, true); } static const struct imx_pcie_drvdata drvdata[] = { |
