diff options
author | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2018-10-31 12:35:12 +0100 |
---|---|---|
committer | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2019-06-21 14:30:48 +0200 |
commit | f014b5b3b3abafa7a7529dde499acab94c0160e0 (patch) | |
tree | 3971a47f40f58ed1e7f2e27464e05a846c7c902a /drivers/ata/ahci_imx.c | |
parent | 68a026f4d3d8d79185c0b1bcc1e74985e1322466 (diff) |
ata: imx: 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.
This is analogous to what we did for PCIe in commit db22e7590338
("PCI: imx6: add external clock support for i.MX8QM").
Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
(cherry picked from commit 4b2d05c05c9e775abf7218ad7a4b52c2d220dd14)
Conflicts:
drivers/ata/ahci_imx.c
Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
(cherry picked from commit da0aa53df04d82eb15cecab90d98e6696d882923)
(cherry picked from commit 52683295a0ad72808f997be5548ec592828c61a1)
Diffstat (limited to 'drivers/ata/ahci_imx.c')
-rw-r--r-- | drivers/ata/ahci_imx.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c index 96892576aeae..73e2c84ded94 100644 --- a/drivers/ata/ahci_imx.c +++ b/drivers/ata/ahci_imx.c @@ -145,6 +145,7 @@ struct imx_ahci_priv { struct clk *phy_pclk0; struct clk *phy_pclk1; void __iomem *phy_base; + struct clk *sata_ext; int clkreq_gpio; struct regmap *gpr; bool no_device; @@ -759,10 +760,14 @@ static int imx_sata_enable(struct ahci_host_priv *hpriv) if (ret) return ret; - ret = clk_prepare_enable(imxpriv->sata_ref_clk); + ret = clk_prepare_enable(imxpriv->sata_ext); if (ret < 0) goto disable_regulator; + ret = clk_prepare_enable(imxpriv->sata_ref_clk); + if (ret < 0) + goto disable_ext; + if (imxpriv->type == AHCI_IMX6Q || imxpriv->type == AHCI_IMX6QP) { /* * set PHY Paremeters, two steps to configure the GPR13, @@ -817,6 +822,8 @@ static int imx_sata_enable(struct ahci_host_priv *hpriv) disable_clk: clk_disable_unprepare(imxpriv->sata_ref_clk); +disable_ext: + clk_disable_unprepare(imxpriv->sata_ext); disable_regulator: ahci_platform_disable_regulators(hpriv); @@ -846,6 +853,8 @@ static void imx_sata_disable(struct ahci_host_priv *hpriv) } clk_disable_unprepare(imxpriv->sata_ref_clk); + clk_disable_unprepare(imxpriv->sata_ext); + ahci_platform_disable_regulators(hpriv); } @@ -1301,6 +1310,12 @@ static int imx_ahci_probe(struct platform_device *pdev) return PTR_ERR(imxpriv->sata_clk); } + imxpriv->sata_ext = devm_clk_get(dev, "sata_ext"); + if (IS_ERR(imxpriv->sata_ext)) { + dev_err(dev, "can't get sata_ext clock.\n"); + return PTR_ERR(imxpriv->sata_ext); + } + imxpriv->sata_ref_clk = devm_clk_get(dev, "sata_ref"); if (IS_ERR(imxpriv->sata_ref_clk)) { dev_err(dev, "can't get sata_ref clock.\n"); |