diff options
| author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2019-02-11 20:51:08 -0500 |
|---|---|---|
| committer | Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> | 2019-03-01 05:55:06 -0500 |
| commit | 5278f65107b15c999cb8a16ee0142015cff6a690 (patch) | |
| tree | 062b34d16eb7f0d28df42490cca2d66d358dcff8 | |
| parent | d82ca49f3e8aa300819cd6c917cfd65ab998fccf (diff) | |
PCI: imx6: Add code to request/control "pcie_aux" clock for i.MX8MQ
The PCIe IP block has an additional clock, "pcie_aux", that needs to
be controlled by the driver. Add code to support it.
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Fabio Estevam <fabio.estevam@nxp.com>
Cc: Chris Healy <cphealy@gmail.com>
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Leonard Crestez <leonard.crestez@nxp.com>
Cc: "A.s. Dong" <aisheng.dong@nxp.com>
Cc: Richard Zhu <hongxing.zhu@nxp.com>
Cc: linux-imx@nxp.com
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-pci@vger.kernel.org
Cc: Rob Herring <robh@kernel.org>
Cc: devicetree@vger.kernel.org
| -rw-r--r-- | drivers/pci/controller/dwc/pci-imx6.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c index 64c74334f7d0..f5a16fd15be5 100644 --- a/drivers/pci/controller/dwc/pci-imx6.c +++ b/drivers/pci/controller/dwc/pci-imx6.c | |||
| @@ -66,6 +66,7 @@ struct imx6_pcie { | |||
| 66 | struct clk *pcie_phy; | 66 | struct clk *pcie_phy; |
| 67 | struct clk *pcie_inbound_axi; | 67 | struct clk *pcie_inbound_axi; |
| 68 | struct clk *pcie; | 68 | struct clk *pcie; |
| 69 | struct clk *pcie_aux; | ||
| 69 | struct regmap *iomuxc_gpr; | 70 | struct regmap *iomuxc_gpr; |
| 70 | u32 controller_id; | 71 | u32 controller_id; |
| 71 | struct reset_control *pciephy_reset; | 72 | struct reset_control *pciephy_reset; |
| @@ -459,6 +460,12 @@ static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie) | |||
| 459 | case IMX7D: | 460 | case IMX7D: |
| 460 | break; | 461 | break; |
| 461 | case IMX8MQ: | 462 | case IMX8MQ: |
| 463 | ret = clk_prepare_enable(imx6_pcie->pcie_aux); | ||
| 464 | if (ret) { | ||
| 465 | dev_err(dev, "unable to enable pcie_aux clock\n"); | ||
| 466 | break; | ||
| 467 | } | ||
| 468 | |||
| 462 | offset = imx6_pcie_grp_offset(imx6_pcie); | 469 | offset = imx6_pcie_grp_offset(imx6_pcie); |
| 463 | /* | 470 | /* |
| 464 | * Set the over ride low and enabled | 471 | * Set the over ride low and enabled |
| @@ -976,6 +983,9 @@ static void imx6_pcie_clk_disable(struct imx6_pcie *imx6_pcie) | |||
| 976 | IMX7D_GPR12_PCIE_PHY_REFCLK_SEL, | 983 | IMX7D_GPR12_PCIE_PHY_REFCLK_SEL, |
| 977 | IMX7D_GPR12_PCIE_PHY_REFCLK_SEL); | 984 | IMX7D_GPR12_PCIE_PHY_REFCLK_SEL); |
| 978 | break; | 985 | break; |
| 986 | case IMX8MQ: | ||
| 987 | clk_disable_unprepare(imx6_pcie->pcie_aux); | ||
| 988 | break; | ||
| 979 | default: | 989 | default: |
| 980 | break; | 990 | break; |
| 981 | } | 991 | } |
| @@ -1121,8 +1131,14 @@ static int imx6_pcie_probe(struct platform_device *pdev) | |||
| 1121 | return PTR_ERR(imx6_pcie->pcie_inbound_axi); | 1131 | return PTR_ERR(imx6_pcie->pcie_inbound_axi); |
| 1122 | } | 1132 | } |
| 1123 | break; | 1133 | break; |
| 1124 | case IMX7D: | ||
| 1125 | case IMX8MQ: | 1134 | case IMX8MQ: |
| 1135 | imx6_pcie->pcie_aux = devm_clk_get(dev, "pcie_aux"); | ||
| 1136 | if (IS_ERR(imx6_pcie->pcie_aux)) { | ||
| 1137 | dev_err(dev, "pcie_aux clock source missing or invalid\n"); | ||
| 1138 | return PTR_ERR(imx6_pcie->pcie_aux); | ||
| 1139 | } | ||
| 1140 | /* fall through */ | ||
| 1141 | case IMX7D: | ||
| 1126 | if (dbi_base->start == IMX8MQ_PCIE2_BASE_ADDR) | 1142 | if (dbi_base->start == IMX8MQ_PCIE2_BASE_ADDR) |
| 1127 | imx6_pcie->controller_id = 1; | 1143 | imx6_pcie->controller_id = 1; |
| 1128 | 1144 | ||
