summaryrefslogtreecommitdiff
path: root/drivers/pci
diff options
context:
space:
mode:
authorOleksandr Suvorov <oleksandr.suvorov@toradex.com>2019-08-30 12:42:02 +0300
committerOleksandr Suvorov <oleksandr.suvorov@toradex.com>2019-09-02 11:53:34 +0300
commitc1e7d4fc8c1b9bd599eed9cf848eff3ed9a34637 (patch)
treef634298eb8462c4b22769b47580752bc6e15a7ce /drivers/pci
parentdfe32b2cf59cf8d33e13a884381eeed7b88f13d2 (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.c19
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,