summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Agner <stefan.agner@toradex.com>2018-01-17 11:23:53 +0100
committerStefan Agner <stefan.agner@toradex.com>2018-01-31 17:57:10 +0100
commitdb22e75903386929c76188978f28b3bf355322a0 (patch)
tree158457bc6e1160398ff5e5d3d00e16a71bc3440e
parent12bf961b9bf2507ddbbfd35f3da82472bba544da (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>
-rw-r--r--drivers/pci/host/pci-imx6.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 9f025a956fbf..a92679e13eb0 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -75,6 +75,7 @@ struct imx6_pcie {
struct clk *pcie_phy;
struct clk *pcie_per;
struct clk *pcie;
+ struct clk *pcie_ext;
struct clk *pcie_ext_src;
struct regmap *iomuxc_gpr;
enum imx6_pcie_variants variant;
@@ -658,12 +659,20 @@ static int imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
if (imx6_pcie->ext_osc && (imx6_pcie->variant == IMX6QP))
clk_set_parent(imx6_pcie->pcie_bus,
imx6_pcie->pcie_ext_src);
+
ret = clk_prepare_enable(imx6_pcie->pcie_bus);
if (ret) {
dev_err(pp->dev, "unable to enable pcie_bus clock\n");
goto err_pcie_bus;
}
+ ret = clk_prepare_enable(imx6_pcie->pcie_ext);
+ if (ret) {
+ dev_err(pp->dev, "unable to enable pcie_ext clock\n");
+ goto err_pcie_bus;
+ }
+
+
ret = clk_prepare_enable(imx6_pcie->pcie_phy);
if (ret) {
dev_err(dev, "unable to enable pcie_phy clock\n");
@@ -2027,15 +2036,18 @@ static int imx6_pcie_probe(struct platform_device *pdev)
if (of_property_read_u32(node, "ext_osc", &imx6_pcie->ext_osc) < 0)
imx6_pcie->ext_osc = 0;
- if (imx6_pcie->ext_osc && (imx6_pcie->variant == IMX6QP)) {
+ if (imx6_pcie->ext_osc && (imx6_pcie->variant == IMX6QP ||
+ imx6_pcie->variant == IMX8QM)) {
/* Change the pcie_bus clock to pcie external OSC */
- imx6_pcie->pcie_bus = devm_clk_get(&pdev->dev, "pcie_ext");
- if (IS_ERR(imx6_pcie->pcie_bus)) {
+ imx6_pcie->pcie_ext = devm_clk_get(&pdev->dev, "pcie_ext");
+ if (IS_ERR(imx6_pcie->pcie_ext)) {
dev_err(&pdev->dev,
- "pcie_bus clock source missing or invalid\n");
- return PTR_ERR(imx6_pcie->pcie_bus);
+ "pcie_ext clock source missing or invalid\n");
+ return PTR_ERR(imx6_pcie->pcie_ext);
}
+ }
+ if (imx6_pcie->ext_osc && (imx6_pcie->variant == IMX6QP)) {
imx6_pcie->pcie_ext_src = devm_clk_get(&pdev->dev,
"pcie_ext_src");
if (IS_ERR(imx6_pcie->pcie_ext_src)) {