summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorStefan Agner <stefan.agner@toradex.com>2018-01-17 11:23:53 +0100
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2020-02-09 22:45:45 +0100
commit03e68a4ec8760bbb6b2407711d9bbbd16d2a374c (patch)
tree3ad5a2408dae6a83dc38c3efd71f9ffbe073009a /drivers
parente20669366f65de681abbf0dd580792281b7858ac (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.c22
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)) {