diff options
author | Oleksandr Suvorov <oleksandr.suvorov@toradex.com> | 2019-08-30 12:42:02 +0300 |
---|---|---|
committer | Oleksandr Suvorov <oleksandr.suvorov@toradex.com> | 2019-09-02 11:53:34 +0300 |
commit | c1e7d4fc8c1b9bd599eed9cf848eff3ed9a34637 (patch) | |
tree | f634298eb8462c4b22769b47580752bc6e15a7ce /drivers/pci | |
parent | dfe32b2cf59cf8d33e13a884381eeed7b88f13d2 (diff) |
Revert "MLK-18433 PCI: imx: remove the lpcg_xxx clocks in driver"
This reverts commit 68a026f4d3d8d79185c0b1bcc1e74985e1322466.
The clock pcie_per is required to be held to avoid crash of pcie driver
on system suspend.
Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov@toradex.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/dwc/pci-imx6.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/pci/dwc/pci-imx6.c b/drivers/pci/dwc/pci-imx6.c index 7855ded3102f..5ecae3b160be 100644 --- a/drivers/pci/dwc/pci-imx6.c +++ b/drivers/pci/dwc/pci-imx6.c @@ -78,6 +78,7 @@ struct imx_pcie { struct clk *pcie_bus; struct clk *pcie_phy; struct clk *pcie_inbound_axi; + struct clk *pcie_per; struct clk *pcie; struct clk *pcie_ext; struct clk *pcie_ext_src; @@ -640,8 +641,17 @@ static int imx_pcie_enable_ref_clk(struct imx_pcie *imx_pcie) case IMX8QXP: case IMX8QM: ret = clk_prepare_enable(imx_pcie->pcie_inbound_axi); - if (ret) + if (ret) { dev_err(dev, "unable to enable pcie_axi clock\n"); + break; + } + ret = clk_prepare_enable(imx_pcie->pcie_per); + if (ret) { + dev_err(dev, "unable to enable pcie_per clock\n"); + clk_disable_unprepare(imx_pcie->pcie_inbound_axi); + break; + } + break; } @@ -1499,6 +1509,7 @@ static void pci_imx_clk_disable(struct device *dev) break; case IMX8QXP: case IMX8QM: + clk_disable_unprepare(imx_pcie->pcie_per); clk_disable_unprepare(imx_pcie->pcie_inbound_axi); break; } @@ -2496,6 +2507,12 @@ static int imx_pcie_probe(struct platform_device *pdev) ("fsl,imx6sx-iomuxc-gpr"); } else if (imx_pcie->variant == IMX8QM || imx_pcie->variant == IMX8QXP) { + imx_pcie->pcie_per = devm_clk_get(dev, "pcie_per"); + if (IS_ERR(imx_pcie->pcie_per)) { + dev_err(dev, "pcie_per clock source missing or invalid\n"); + return PTR_ERR(imx_pcie->pcie_per); + } + imx_pcie->iomuxc_gpr = syscon_regmap_lookup_by_phandle(node, "hsio"); imx_pcie->pcie_inbound_axi = devm_clk_get(&pdev->dev, |