diff options
author | Stefan Agner <stefan.agner@toradex.com> | 2018-01-17 11:23:53 +0100 |
---|---|---|
committer | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2020-02-09 22:45:45 +0100 |
commit | 03e68a4ec8760bbb6b2407711d9bbbd16d2a374c (patch) | |
tree | 3ad5a2408dae6a83dc38c3efd71f9ffbe073009a /drivers | |
parent | e20669366f65de681abbf0dd580792281b7858ac (diff) |
PCI: imx6: add external clock support for i.MX8QM
Add external reference clock via clock tree. This allows to model
the shared reference clock provided via PCIE_SATA_REFCLK100M_P/N
properly.
Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
(cherry picked from commit db22e75903386929c76188978f28b3bf355322a0)
Conflicts:
drivers/pci/host/pci-imx6.c
Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
(cherry picked from commit 57364eca822fb2803b6aa93257e93e0d4242282d)
(cherry picked from commit f32040d9607bf3e7de57cf05733ae0b5d27b5640)
(cherry picked from commit 1c51d5cc8d041a5dfe3a1793bb3767450cab3c1a)
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pci/dwc/pci-imx6.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/pci/dwc/pci-imx6.c b/drivers/pci/dwc/pci-imx6.c index f122842821f2..6717a6627887 100644 --- a/drivers/pci/dwc/pci-imx6.c +++ b/drivers/pci/dwc/pci-imx6.c @@ -80,9 +80,10 @@ struct imx_pcie { struct clk *pcie_inbound_axi; struct clk *pcie_per; struct clk *pcie; + struct clk *pcie_ext; struct clk *pcie_ext_src; struct regmap *iomuxc_gpr; - enum imx_pcie_variants variant; + enum imx_pcie_variants variant; u32 hsio_cfg; u32 tx_deemph_gen1; u32 tx_deemph_gen2_3p5db; @@ -779,6 +780,12 @@ static int imx_pcie_deassert_core_reset(struct imx_pcie *imx_pcie) goto err_pcie_bus; } + ret = clk_prepare_enable(imx_pcie->pcie_ext); + if (ret) { + dev_err(dev, "unable to enable pcie_ext clock\n"); + goto err_pcie_bus; + } + ret = clk_prepare_enable(imx_pcie->pcie_phy); if (ret) { dev_err(dev, "unable to enable pcie_phy clock\n"); @@ -2418,15 +2425,18 @@ static int imx_pcie_probe(struct platform_device *pdev) if (of_property_read_u32(node, "ext_osc", &imx_pcie->ext_osc) < 0) imx_pcie->ext_osc = 0; - if (imx_pcie->ext_osc && (imx_pcie->variant == IMX6QP)) { + if (imx_pcie->ext_osc && (imx_pcie->variant == IMX6QP || + imx_pcie->variant == IMX8QM)) { /* Change the pcie_bus clock to pcie external OSC */ - imx_pcie->pcie_bus = devm_clk_get(&pdev->dev, "pcie_ext"); - if (IS_ERR(imx_pcie->pcie_bus)) { + imx_pcie->pcie_ext = devm_clk_get(&pdev->dev, "pcie_ext"); + if (IS_ERR(imx_pcie->pcie_ext)) { dev_err(&pdev->dev, - "pcie_bus clock source missing or invalid\n"); - return PTR_ERR(imx_pcie->pcie_bus); + "pcie_ext clock source missing or invalid\n"); + return PTR_ERR(imx_pcie->pcie_ext); } + } + if (imx_pcie->ext_osc && (imx_pcie->variant == IMX6QP)) { imx_pcie->pcie_ext_src = devm_clk_get(&pdev->dev, "pcie_ext_src"); if (IS_ERR(imx_pcie->pcie_ext_src)) { |