* [PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN
@ 2013-11-20 10:17 Marek Vasut
2013-11-20 10:17 ` [PATCH V4 2/6] ahci: imx: Pull out the clock enable/disable calls Marek Vasut
` (5 more replies)
0 siblings, 6 replies; 15+ messages in thread
From: Marek Vasut @ 2013-11-20 10:17 UTC (permalink / raw)
To: linux-arm-kernel
We must clear this IMX6Q_GPR13_SATA_MPLL_CLK_EN bit on i.MX6Q, otherwise
Linux will fail to find the attached drive on some boards.
This entire fix was:
Reported-by: Eric Nelson <eric.nelson@boundarydevices.com>
Signed-off-by: Marek Vasut <marex@denx.de>
---
drivers/ata/ahci_imx.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
index ae2d73f..478921b 100644
--- a/drivers/ata/ahci_imx.c
+++ b/drivers/ata/ahci_imx.c
@@ -125,6 +125,7 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
| IMX6Q_GPR13_SATA_TX_BOOST_MASK
| IMX6Q_GPR13_SATA_TX_LVL_MASK
| IMX6Q_GPR13_SATA_TX_EDGE_RATE
+ | IMX6Q_GPR13_SATA_MPLL_CLK_EN
, IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB
| IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M
| IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F
--
1.8.4.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH V4 2/6] ahci: imx: Pull out the clock enable/disable calls
2013-11-20 10:17 [PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
@ 2013-11-20 10:17 ` Marek Vasut
2013-11-20 12:55 ` Shawn Guo
2013-11-20 10:17 ` [PATCH V4 3/6] ahci: imx: Add i.MX53 support Marek Vasut
` (4 subsequent siblings)
5 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2013-11-20 10:17 UTC (permalink / raw)
To: linux-arm-kernel
The same code for enabling and disabling SATA clock was found in multiple
places in the driver. Implement functions that enable/disable the SATA clock
and use them in such places instead of duplicating the code.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Richard Zhu <r65037@freescale.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Linux-IDE <linux-ide@vger.kernel.org>
---
drivers/ata/ahci_imx.c | 130 +++++++++++++++++++++++++++----------------------
1 file changed, 71 insertions(+), 59 deletions(-)
V2: Move the OR sign from the begining of the line to the end of the line in
the regmap_update_bits() call.
V3: Move the PHY configuration programming out of the clock_enable function
and into the probe() function.
V4: Rebase on top of new 1/6 patch.
Remove clk_prepare_enable() being called twice in imx_sata_clock_enable()
since it was a rebase artifact.
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
index 478921b..8e0dbd4 100644
--- a/drivers/ata/ahci_imx.c
+++ b/drivers/ata/ahci_imx.c
@@ -47,6 +47,34 @@ static int ahci_imx_hotplug;
module_param_named(hotplug, ahci_imx_hotplug, int, 0644);
MODULE_PARM_DESC(hotplug, "AHCI IMX hot-plug support (0=Don't support, 1=support)");
+static int imx_sata_clock_enable(struct device *dev)
+{
+ struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
+ int ret;
+
+ ret = clk_prepare_enable(imxpriv->sata_ref_clk);
+ if (ret < 0) {
+ dev_err(dev, "prepare-enable sata_ref clock err:%d\n", ret);
+ return ret;
+ }
+
+ regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
+ IMX6Q_GPR13_SATA_MPLL_CLK_EN,
+ IMX6Q_GPR13_SATA_MPLL_CLK_EN);
+
+ return 0;
+}
+
+static void imx_sata_clock_disable(struct device *dev)
+{
+ struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
+
+ regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
+ IMX6Q_GPR13_SATA_MPLL_CLK_EN,
+ !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
+ clk_disable_unprepare(imxpriv->sata_ref_clk);
+}
+
static void ahci_imx_error_handler(struct ata_port *ap)
{
u32 reg_val;
@@ -72,10 +100,7 @@ static void ahci_imx_error_handler(struct ata_port *ap)
*/
reg_val = readl(mmio + PORT_PHY_CTL);
writel(reg_val | PORT_PHY_CTL_PDDQ_LOC, mmio + PORT_PHY_CTL);
- regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
- IMX6Q_GPR13_SATA_MPLL_CLK_EN,
- !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
- clk_disable_unprepare(imxpriv->sata_ref_clk);
+ imx_sata_clock_disable(ap->dev);
imxpriv->no_device = true;
}
@@ -97,45 +122,10 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
unsigned int reg_val;
struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
- imxpriv->gpr =
- syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
- if (IS_ERR(imxpriv->gpr)) {
- dev_err(dev, "failed to find fsl,imx6q-iomux-gpr regmap\n");
- return PTR_ERR(imxpriv->gpr);
- }
-
- ret = clk_prepare_enable(imxpriv->sata_ref_clk);
- if (ret < 0) {
- dev_err(dev, "prepare-enable sata_ref clock err:%d\n", ret);
+ ret = imx_sata_clock_enable(dev);
+ if (ret < 0)
return ret;
- }
- /*
- * set PHY Paremeters, two steps to configure the GPR13,
- * one write for rest of parameters, mask of first write
- * is 0x07fffffd, and the other one write for setting
- * the mpll_clk_en.
- */
- regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK
- | IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK
- | IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK
- | IMX6Q_GPR13_SATA_SPD_MODE_MASK
- | IMX6Q_GPR13_SATA_MPLL_SS_EN
- | IMX6Q_GPR13_SATA_TX_ATTEN_MASK
- | IMX6Q_GPR13_SATA_TX_BOOST_MASK
- | IMX6Q_GPR13_SATA_TX_LVL_MASK
- | IMX6Q_GPR13_SATA_TX_EDGE_RATE
- | IMX6Q_GPR13_SATA_MPLL_CLK_EN
- , IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB
- | IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M
- | IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F
- | IMX6Q_GPR13_SATA_SPD_MODE_3P0G
- | IMX6Q_GPR13_SATA_MPLL_SS_EN
- | IMX6Q_GPR13_SATA_TX_ATTEN_9_16
- | IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB
- | IMX6Q_GPR13_SATA_TX_LVL_1_025_V);
- regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_MPLL_CLK_EN,
- IMX6Q_GPR13_SATA_MPLL_CLK_EN);
usleep_range(100, 200);
/*
@@ -164,11 +154,7 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
static void imx6q_sata_exit(struct device *dev)
{
- struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
-
- regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_MPLL_CLK_EN,
- !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
- clk_disable_unprepare(imxpriv->sata_ref_clk);
+ imx_sata_clock_disable(dev);
}
static int imx_ahci_suspend(struct device *dev)
@@ -179,12 +165,8 @@ static int imx_ahci_suspend(struct device *dev)
* If no_device is set, The CLKs had been gated off in the
* initialization so don't do it again here.
*/
- if (!imxpriv->no_device) {
- regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
- IMX6Q_GPR13_SATA_MPLL_CLK_EN,
- !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
- clk_disable_unprepare(imxpriv->sata_ref_clk);
- }
+ if (!imxpriv->no_device)
+ imx_sata_clock_disable(dev);
return 0;
}
@@ -195,15 +177,10 @@ static int imx_ahci_resume(struct device *dev)
int ret;
if (!imxpriv->no_device) {
- ret = clk_prepare_enable(imxpriv->sata_ref_clk);
- if (ret < 0) {
- dev_err(dev, "pre-enable sata_ref clock err:%d\n", ret);
+ ret = imx_sata_clock_enable(dev);
+ if (ret < 0)
return ret;
- }
- regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
- IMX6Q_GPR13_SATA_MPLL_CLK_EN,
- IMX6Q_GPR13_SATA_MPLL_CLK_EN);
usleep_range(1000, 2000);
}
@@ -290,6 +267,41 @@ static int imx_ahci_probe(struct platform_device *pdev)
ahci_dev->dma_mask = &ahci_dev->coherent_dma_mask;
ahci_dev->of_node = dev->of_node;
+ imxpriv->gpr =
+ syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
+
+ if (IS_ERR(imxpriv->gpr)) {
+ dev_err(dev, "failed to find fsl,imx6q-iomux-gpr regmap\n");
+ ret = PTR_ERR(imxpriv->gpr);
+ goto err_out;
+ }
+
+ /*
+ * Set PHY Paremeters, two steps to configure the GPR13,
+ * one write for rest of parameters, mask of first write
+ * is 0x07fffffd, and the other one write for setting
+ * the mpll_clk_en happens in imx_sata_clock_enable().
+ */
+ regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
+ IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK |
+ IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK |
+ IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK |
+ IMX6Q_GPR13_SATA_SPD_MODE_MASK |
+ IMX6Q_GPR13_SATA_MPLL_SS_EN |
+ IMX6Q_GPR13_SATA_TX_ATTEN_MASK |
+ IMX6Q_GPR13_SATA_TX_BOOST_MASK |
+ IMX6Q_GPR13_SATA_TX_LVL_MASK |
+ IMX6Q_GPR13_SATA_TX_EDGE_RATE |
+ IMX6Q_GPR13_SATA_MPLL_CLK_EN,
+ IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB |
+ IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M |
+ IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F |
+ IMX6Q_GPR13_SATA_SPD_MODE_3P0G |
+ IMX6Q_GPR13_SATA_MPLL_SS_EN |
+ IMX6Q_GPR13_SATA_TX_ATTEN_9_16 |
+ IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB |
+ IMX6Q_GPR13_SATA_TX_LVL_1_025_V);
+
ret = platform_device_add_resources(ahci_pdev, res, 2);
if (ret)
goto err_out;
--
1.8.4.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH V4 3/6] ahci: imx: Add i.MX53 support
2013-11-20 10:17 [PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
2013-11-20 10:17 ` [PATCH V4 2/6] ahci: imx: Pull out the clock enable/disable calls Marek Vasut
@ 2013-11-20 10:17 ` Marek Vasut
2013-11-20 10:17 ` [PATCH V2 4/6] ARM: imx: imx53: Add SATA PHY clock Marek Vasut
` (3 subsequent siblings)
5 siblings, 0 replies; 15+ messages in thread
From: Marek Vasut @ 2013-11-20 10:17 UTC (permalink / raw)
To: linux-arm-kernel
Add minor adjustments to support i.MX53 SATA port as well as i.MX6Q one.
The difference here is mostly the clock which need to be enabled and also
the lack of need of programming IOMUXC registers on i.MX53. All of which
is well handles in the clock enable/disable functions. Note that this patch
also cleans up the names of the common functions, so they don't read imx6q_*
but imx_* instead.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Richard Zhu <r65037@freescale.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Linux-IDE <linux-ide@vger.kernel.org>
---
drivers/ata/ahci_imx.c | 164 ++++++++++++++++++++++++++++++++-----------------
1 file changed, 106 insertions(+), 58 deletions(-)
V2: Rebase this patch to be coherent with formating change in 1/5 .
V3: Rebase this patch to be coherent with change in 1/5 .
V4: Use sata_ref_clk for both MX53 and MX6 instead of separate sata_phy_clk
for MX53.
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
index 8e0dbd4..6443b01 100644
--- a/drivers/ata/ahci_imx.c
+++ b/drivers/ata/ahci_imx.c
@@ -34,10 +34,21 @@ enum {
HOST_TIMER1MS = 0xe0, /* Timer 1-ms */
};
+enum ahci_imx_type {
+ AHCI_IMX53,
+ AHCI_IMX6Q,
+};
+
struct imx_ahci_priv {
struct platform_device *ahci_pdev;
+ enum ahci_imx_type type;
+
+ /* i.MX53 clock */
+ struct clk *sata_gate_clk;
+ /* Common clock */
struct clk *sata_ref_clk;
struct clk *ahb_clk;
+
struct regmap *gpr;
bool no_device;
bool first_time;
@@ -52,27 +63,50 @@ static int imx_sata_clock_enable(struct device *dev)
struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
int ret;
+ if (imxpriv->type == AHCI_IMX53) {
+ ret = clk_prepare_enable(imxpriv->sata_gate_clk);
+ if (ret < 0) {
+ dev_err(dev, "prepare-enable sata_gate clock err:%d\n",
+ ret);
+ return ret;
+ }
+ }
+
ret = clk_prepare_enable(imxpriv->sata_ref_clk);
if (ret < 0) {
- dev_err(dev, "prepare-enable sata_ref clock err:%d\n", ret);
- return ret;
+ dev_err(dev, "prepare-enable sata_ref clock err:%d\n",
+ ret);
+ goto clk_err;
}
- regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
- IMX6Q_GPR13_SATA_MPLL_CLK_EN,
- IMX6Q_GPR13_SATA_MPLL_CLK_EN);
+ if (imxpriv->type == AHCI_IMX6Q) {
+ regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
+ IMX6Q_GPR13_SATA_MPLL_CLK_EN,
+ IMX6Q_GPR13_SATA_MPLL_CLK_EN);
+ }
return 0;
+
+clk_err:
+ if (imxpriv->type == AHCI_IMX53)
+ clk_disable_unprepare(imxpriv->sata_gate_clk);
+ return ret;
}
static void imx_sata_clock_disable(struct device *dev)
{
struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
- regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
- IMX6Q_GPR13_SATA_MPLL_CLK_EN,
- !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
+ if (imxpriv->type == AHCI_IMX6Q) {
+ regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
+ IMX6Q_GPR13_SATA_MPLL_CLK_EN,
+ !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
+ }
+
clk_disable_unprepare(imxpriv->sata_ref_clk);
+
+ if (imxpriv->type == AHCI_IMX53)
+ clk_disable_unprepare(imxpriv->sata_gate_clk);
}
static void ahci_imx_error_handler(struct ata_port *ap)
@@ -116,7 +150,7 @@ static const struct ata_port_info ahci_imx_port_info = {
.port_ops = &ahci_imx_ops,
};
-static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
+static int imx_sata_init(struct device *dev, void __iomem *mmio)
{
int ret = 0;
unsigned int reg_val;
@@ -152,7 +186,7 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
return 0;
}
-static void imx6q_sata_exit(struct device *dev)
+static void imx_sata_exit(struct device *dev)
{
imx_sata_clock_disable(dev);
}
@@ -187,16 +221,18 @@ static int imx_ahci_resume(struct device *dev)
return 0;
}
-static struct ahci_platform_data imx6q_sata_pdata = {
- .init = imx6q_sata_init,
- .exit = imx6q_sata_exit,
- .ata_port_info = &ahci_imx_port_info,
- .suspend = imx_ahci_suspend,
- .resume = imx_ahci_resume,
+static struct ahci_platform_data imx_sata_pdata = {
+ .init = imx_sata_init,
+ .exit = imx_sata_exit,
+ .ata_port_info = &ahci_imx_port_info,
+ .suspend = imx_ahci_suspend,
+ .resume = imx_ahci_resume,
+
};
static const struct of_device_id imx_ahci_of_match[] = {
- { .compatible = "fsl,imx6q-ahci", .data = &imx6q_sata_pdata},
+ { .compatible = "fsl,imx53-ahci", .data = (void *)AHCI_IMX53 },
+ { .compatible = "fsl,imx6q-ahci", .data = (void *)AHCI_IMX6Q },
{},
};
MODULE_DEVICE_TABLE(of, imx_ahci_of_match);
@@ -206,12 +242,20 @@ static int imx_ahci_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct resource *mem, *irq, res[2];
const struct of_device_id *of_id;
+ enum ahci_imx_type type;
const struct ahci_platform_data *pdata = NULL;
struct imx_ahci_priv *imxpriv;
struct device *ahci_dev;
struct platform_device *ahci_pdev;
int ret;
+ of_id = of_match_device(imx_ahci_of_match, dev);
+ if (!of_id)
+ return -EINVAL;
+
+ type = (enum ahci_imx_type)of_id->data;
+ pdata = &imx_sata_pdata;
+
imxpriv = devm_kzalloc(dev, sizeof(*imxpriv), GFP_KERNEL);
if (!imxpriv) {
dev_err(dev, "can't alloc ahci_host_priv\n");
@@ -227,6 +271,8 @@ static int imx_ahci_probe(struct platform_device *pdev)
imxpriv->no_device = false;
imxpriv->first_time = true;
+ imxpriv->type = type;
+
imxpriv->ahb_clk = devm_clk_get(dev, "ahb");
if (IS_ERR(imxpriv->ahb_clk)) {
dev_err(dev, "can't get ahb clock.\n");
@@ -234,6 +280,15 @@ static int imx_ahci_probe(struct platform_device *pdev)
goto err_out;
}
+ if (type == AHCI_IMX53) {
+ imxpriv->sata_gate_clk = devm_clk_get(dev, "sata_gate");
+ if (IS_ERR(imxpriv->sata_gate_clk)) {
+ dev_err(dev, "can't get sata_gate clock.\n");
+ ret = PTR_ERR(imxpriv->sata_gate_clk);
+ goto err_out;
+ }
+ }
+
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");
@@ -244,14 +299,6 @@ static int imx_ahci_probe(struct platform_device *pdev)
imxpriv->ahci_pdev = ahci_pdev;
platform_set_drvdata(pdev, imxpriv);
- of_id = of_match_device(imx_ahci_of_match, dev);
- if (of_id) {
- pdata = of_id->data;
- } else {
- ret = -EINVAL;
- goto err_out;
- }
-
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!mem || !irq) {
@@ -267,41 +314,42 @@ static int imx_ahci_probe(struct platform_device *pdev)
ahci_dev->dma_mask = &ahci_dev->coherent_dma_mask;
ahci_dev->of_node = dev->of_node;
- imxpriv->gpr =
- syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
-
- if (IS_ERR(imxpriv->gpr)) {
- dev_err(dev, "failed to find fsl,imx6q-iomux-gpr regmap\n");
- ret = PTR_ERR(imxpriv->gpr);
- goto err_out;
+ if (type == AHCI_IMX6Q) {
+ imxpriv->gpr = syscon_regmap_lookup_by_compatible(
+ "fsl,imx6q-iomuxc-gpr");
+ if (IS_ERR(imxpriv->gpr)) {
+ dev_err(dev,
+ "failed to find fsl,imx6q-iomux-gpr regmap\n");
+ return PTR_ERR(imxpriv->gpr);
+ }
+
+ /*
+ * Set PHY Paremeters, two steps to configure the GPR13,
+ * one write for rest of parameters, mask of first write
+ * is 0x07fffffd, and the other one write for setting
+ * the mpll_clk_en happens in imx_sata_clock_enable().
+ */
+ regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
+ IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK |
+ IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK |
+ IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK |
+ IMX6Q_GPR13_SATA_SPD_MODE_MASK |
+ IMX6Q_GPR13_SATA_MPLL_SS_EN |
+ IMX6Q_GPR13_SATA_TX_ATTEN_MASK |
+ IMX6Q_GPR13_SATA_TX_BOOST_MASK |
+ IMX6Q_GPR13_SATA_TX_LVL_MASK |
+ IMX6Q_GPR13_SATA_TX_EDGE_RATE |
+ IMX6Q_GPR13_SATA_MPLL_CLK_EN,
+ IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB |
+ IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M |
+ IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F |
+ IMX6Q_GPR13_SATA_SPD_MODE_3P0G |
+ IMX6Q_GPR13_SATA_MPLL_SS_EN |
+ IMX6Q_GPR13_SATA_TX_ATTEN_9_16 |
+ IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB |
+ IMX6Q_GPR13_SATA_TX_LVL_1_025_V);
}
- /*
- * Set PHY Paremeters, two steps to configure the GPR13,
- * one write for rest of parameters, mask of first write
- * is 0x07fffffd, and the other one write for setting
- * the mpll_clk_en happens in imx_sata_clock_enable().
- */
- regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
- IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK |
- IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK |
- IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK |
- IMX6Q_GPR13_SATA_SPD_MODE_MASK |
- IMX6Q_GPR13_SATA_MPLL_SS_EN |
- IMX6Q_GPR13_SATA_TX_ATTEN_MASK |
- IMX6Q_GPR13_SATA_TX_BOOST_MASK |
- IMX6Q_GPR13_SATA_TX_LVL_MASK |
- IMX6Q_GPR13_SATA_TX_EDGE_RATE |
- IMX6Q_GPR13_SATA_MPLL_CLK_EN,
- IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB |
- IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M |
- IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F |
- IMX6Q_GPR13_SATA_SPD_MODE_3P0G |
- IMX6Q_GPR13_SATA_MPLL_SS_EN |
- IMX6Q_GPR13_SATA_TX_ATTEN_9_16 |
- IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB |
- IMX6Q_GPR13_SATA_TX_LVL_1_025_V);
-
ret = platform_device_add_resources(ahci_pdev, res, 2);
if (ret)
goto err_out;
--
1.8.4.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH V2 4/6] ARM: imx: imx53: Add SATA PHY clock
2013-11-20 10:17 [PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
2013-11-20 10:17 ` [PATCH V4 2/6] ahci: imx: Pull out the clock enable/disable calls Marek Vasut
2013-11-20 10:17 ` [PATCH V4 3/6] ahci: imx: Add i.MX53 support Marek Vasut
@ 2013-11-20 10:17 ` Marek Vasut
2013-11-20 10:17 ` [PATCH V2 5/6] ARM: dts: imx53: Add AHCI SATA DT node Marek Vasut
` (2 subsequent siblings)
5 siblings, 0 replies; 15+ messages in thread
From: Marek Vasut @ 2013-11-20 10:17 UTC (permalink / raw)
To: linux-arm-kernel
Add SATA PHY clock which are derived from the USB PHY1 clock. Note that this
patch derives the SATA PHY clock from USB PHY1 clock gate so that the SATA
driver can ungate both the SATA PHY clock and USB PHY1 clock for the SATA to
work correctly.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Richard Zhu <r65037@freescale.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Linux-IDE <linux-ide@vger.kernel.org>
---
arch/arm/mach-imx/clk-imx51-imx53.c | 1 +
include/dt-bindings/clock/imx5-clock.h | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
V2: Rename 'IMX5_CLK_SATA_PHY' to 'IMX5_CLK_SATA_REF' as well as
'sata_phy' to 'sata_ref' .
diff --git a/arch/arm/mach-imx/clk-imx51-imx53.c b/arch/arm/mach-imx/clk-imx51-imx53.c
index 07d275f..3f01df2 100644
--- a/arch/arm/mach-imx/clk-imx51-imx53.c
+++ b/arch/arm/mach-imx/clk-imx51-imx53.c
@@ -244,6 +244,7 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,
clk[IMX5_CLK_SPDIF0_GATE] = imx_clk_gate2("spdif0_gate", "spdif0_com_sel", MXC_CCM_CCGR5, 26);
clk[IMX5_CLK_SPDIF_IPG_GATE] = imx_clk_gate2("spdif_ipg_gate", "ipg", MXC_CCM_CCGR5, 30);
clk[IMX5_CLK_SAHARA_IPG_GATE] = imx_clk_gate2("sahara_ipg_gate", "ipg", MXC_CCM_CCGR4, 14);
+ clk[IMX5_CLK_SATA_REF] = imx_clk_fixed_factor("sata_ref", "usb_phy1_gate", 1, 1);
for (i = 0; i < ARRAY_SIZE(clk); i++)
if (IS_ERR(clk[i]))
diff --git a/include/dt-bindings/clock/imx5-clock.h b/include/dt-bindings/clock/imx5-clock.h
index 5c2f634..5f2667ec 100644
--- a/include/dt-bindings/clock/imx5-clock.h
+++ b/include/dt-bindings/clock/imx5-clock.h
@@ -197,6 +197,7 @@
#define IMX5_CLK_SPDIF_IPG_GATE 185
#define IMX5_CLK_OCRAM 186
#define IMX5_CLK_SAHARA_IPG_GATE 187
-#define IMX5_CLK_END 188
+#define IMX5_CLK_SATA_REF 188
+#define IMX5_CLK_END 189
#endif /* __DT_BINDINGS_CLOCK_IMX5_H */
--
1.8.4.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH V2 5/6] ARM: dts: imx53: Add AHCI SATA DT node
2013-11-20 10:17 [PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
` (2 preceding siblings ...)
2013-11-20 10:17 ` [PATCH V2 4/6] ARM: imx: imx53: Add SATA PHY clock Marek Vasut
@ 2013-11-20 10:17 ` Marek Vasut
2013-11-20 10:17 ` [PATCH 6/6] ARM: dts: imx53: Enable AHCI SATA for M53EVK Marek Vasut
2013-11-20 10:27 ` [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
5 siblings, 0 replies; 15+ messages in thread
From: Marek Vasut @ 2013-11-20 10:17 UTC (permalink / raw)
To: linux-arm-kernel
The AHCI-IMX driver now supports i.MX53 as well. Add DT node.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Richard Zhu <r65037@freescale.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Linux-IDE <linux-ide@vger.kernel.org>
---
arch/arm/boot/dts/imx53.dtsi | 11 +++++++++++
1 file changed, 11 insertions(+)
V2: Rename 'IMX5_CLK_SATA_PHY' to 'IMX5_CLK_SATA_REF' as well as
'sata_phy' to 'sata_ref' .
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi
index b330ef7..4b2053b 100644
--- a/arch/arm/boot/dts/imx53.dtsi
+++ b/arch/arm/boot/dts/imx53.dtsi
@@ -86,6 +86,17 @@
interrupt-parent = <&tzic>;
ranges;
+ sata: sata at 10000000 {
+ compatible = "fsl,imx53-ahci";
+ reg = <0x10000000 0x1000>;
+ interrupts = <28>;
+ clocks = <&clks IMX5_CLK_SATA_GATE>,
+ <&clks IMX5_CLK_SATA_REF>,
+ <&clks IMX5_CLK_AHB>;
+ clock-names = "sata_gate", "sata_ref", "ahb";
+ status = "disabled";
+ };
+
ipu: ipu at 18000000 {
#crtc-cells = <1>;
compatible = "fsl,imx53-ipu";
--
1.8.4.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 6/6] ARM: dts: imx53: Enable AHCI SATA for M53EVK
2013-11-20 10:17 [PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
` (3 preceding siblings ...)
2013-11-20 10:17 ` [PATCH V2 5/6] ARM: dts: imx53: Add AHCI SATA DT node Marek Vasut
@ 2013-11-20 10:17 ` Marek Vasut
2013-11-20 10:27 ` [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
5 siblings, 0 replies; 15+ messages in thread
From: Marek Vasut @ 2013-11-20 10:17 UTC (permalink / raw)
To: linux-arm-kernel
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Richard Zhu <r65037@freescale.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Linux-IDE <linux-ide@vger.kernel.org>
---
arch/arm/boot/dts/imx53-m53evk.dts | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/arch/arm/boot/dts/imx53-m53evk.dts b/arch/arm/boot/dts/imx53-m53evk.dts
index 7a006cb..c623774 100644
--- a/arch/arm/boot/dts/imx53-m53evk.dts
+++ b/arch/arm/boot/dts/imx53-m53evk.dts
@@ -315,6 +315,10 @@
status = "okay";
};
+&sata {
+ status = "okay";
+};
+
&ssi2 {
fsl,mode = "i2s-slave";
status = "okay";
--
1.8.4.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN
2013-11-20 10:17 [PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
` (4 preceding siblings ...)
2013-11-20 10:17 ` [PATCH 6/6] ARM: dts: imx53: Enable AHCI SATA for M53EVK Marek Vasut
@ 2013-11-20 10:27 ` Marek Vasut
2013-11-20 12:51 ` Shawn Guo
2013-11-20 14:59 ` Tejun Heo
5 siblings, 2 replies; 15+ messages in thread
From: Marek Vasut @ 2013-11-20 10:27 UTC (permalink / raw)
To: linux-arm-kernel
We must clear this IMX6Q_GPR13_SATA_MPLL_CLK_EN bit on i.MX6Q, otherwise
Linux will fail to find the attached drive on some boards.
This entire fix was:
Reported-by: Eric Nelson <eric.nelson@boundarydevices.com>
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Richard Zhu <r65037@freescale.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Linux-IDE <linux-ide@vger.kernel.org>
---
drivers/ata/ahci_imx.c | 1 +
1 file changed, 1 insertion(+)
RESEND: Fix the Cc here.
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
index ae2d73f..478921b 100644
--- a/drivers/ata/ahci_imx.c
+++ b/drivers/ata/ahci_imx.c
@@ -125,6 +125,7 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
| IMX6Q_GPR13_SATA_TX_BOOST_MASK
| IMX6Q_GPR13_SATA_TX_LVL_MASK
| IMX6Q_GPR13_SATA_TX_EDGE_RATE
+ | IMX6Q_GPR13_SATA_MPLL_CLK_EN
, IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB
| IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M
| IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F
--
1.8.4.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN
2013-11-20 10:27 ` [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
@ 2013-11-20 12:51 ` Shawn Guo
2013-11-20 14:59 ` Tejun Heo
1 sibling, 0 replies; 15+ messages in thread
From: Shawn Guo @ 2013-11-20 12:51 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Nov 20, 2013 at 11:27:22AM +0100, Marek Vasut wrote:
> We must clear this IMX6Q_GPR13_SATA_MPLL_CLK_EN bit on i.MX6Q, otherwise
> Linux will fail to find the attached drive on some boards.
>
> This entire fix was:
> Reported-by: Eric Nelson <eric.nelson@boundarydevices.com>
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Shawn Guo <shawn.guo@linaro.org>
> Cc: Richard Zhu <r65037@freescale.com>
> Cc: Tejun Heo <tj@kernel.org>
> Cc: Linux-IDE <linux-ide@vger.kernel.org>
> ---
> drivers/ata/ahci_imx.c | 1 +
> 1 file changed, 1 insertion(+)
>
> RESEND: Fix the Cc here.
>
> diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
> index ae2d73f..478921b 100644
> --- a/drivers/ata/ahci_imx.c
> +++ b/drivers/ata/ahci_imx.c
> @@ -125,6 +125,7 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
> | IMX6Q_GPR13_SATA_TX_BOOST_MASK
> | IMX6Q_GPR13_SATA_TX_LVL_MASK
> | IMX6Q_GPR13_SATA_TX_EDGE_RATE
> + | IMX6Q_GPR13_SATA_MPLL_CLK_EN
So shouldn't number 0x07fffffd in the comment right above the code be
updated to 0x07fffffe?
Shawn
> , IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB
> | IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M
> | IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F
> --
> 1.8.4.2
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH V4 2/6] ahci: imx: Pull out the clock enable/disable calls
2013-11-20 10:17 ` [PATCH V4 2/6] ahci: imx: Pull out the clock enable/disable calls Marek Vasut
@ 2013-11-20 12:55 ` Shawn Guo
0 siblings, 0 replies; 15+ messages in thread
From: Shawn Guo @ 2013-11-20 12:55 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Nov 20, 2013 at 11:17:35AM +0100, Marek Vasut wrote:
> The same code for enabling and disabling SATA clock was found in multiple
> places in the driver. Implement functions that enable/disable the SATA clock
> and use them in such places instead of duplicating the code.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Shawn Guo <shawn.guo@linaro.org>
> Cc: Richard Zhu <r65037@freescale.com>
> Cc: Tejun Heo <tj@kernel.org>
> Cc: Linux-IDE <linux-ide@vger.kernel.org>
> ---
> drivers/ata/ahci_imx.c | 130 +++++++++++++++++++++++++++----------------------
> 1 file changed, 71 insertions(+), 59 deletions(-)
>
> V2: Move the OR sign from the begining of the line to the end of the line in
> the regmap_update_bits() call.
> V3: Move the PHY configuration programming out of the clock_enable function
> and into the probe() function.
> V4: Rebase on top of new 1/6 patch.
> Remove clk_prepare_enable() being called twice in imx_sata_clock_enable()
> since it was a rebase artifact.
>
> diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
> index 478921b..8e0dbd4 100644
> --- a/drivers/ata/ahci_imx.c
> +++ b/drivers/ata/ahci_imx.c
> @@ -47,6 +47,34 @@ static int ahci_imx_hotplug;
> module_param_named(hotplug, ahci_imx_hotplug, int, 0644);
> MODULE_PARM_DESC(hotplug, "AHCI IMX hot-plug support (0=Don't support, 1=support)");
>
> +static int imx_sata_clock_enable(struct device *dev)
> +{
> + struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
> + int ret;
> +
> + ret = clk_prepare_enable(imxpriv->sata_ref_clk);
> + if (ret < 0) {
> + dev_err(dev, "prepare-enable sata_ref clock err:%d\n", ret);
> + return ret;
> + }
> +
> + regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
> + IMX6Q_GPR13_SATA_MPLL_CLK_EN,
> + IMX6Q_GPR13_SATA_MPLL_CLK_EN);
> +
> + return 0;
> +}
> +
> +static void imx_sata_clock_disable(struct device *dev)
> +{
> + struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
> +
> + regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
> + IMX6Q_GPR13_SATA_MPLL_CLK_EN,
> + !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
> + clk_disable_unprepare(imxpriv->sata_ref_clk);
> +}
> +
> static void ahci_imx_error_handler(struct ata_port *ap)
> {
> u32 reg_val;
> @@ -72,10 +100,7 @@ static void ahci_imx_error_handler(struct ata_port *ap)
> */
> reg_val = readl(mmio + PORT_PHY_CTL);
> writel(reg_val | PORT_PHY_CTL_PDDQ_LOC, mmio + PORT_PHY_CTL);
> - regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
> - IMX6Q_GPR13_SATA_MPLL_CLK_EN,
> - !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
> - clk_disable_unprepare(imxpriv->sata_ref_clk);
> + imx_sata_clock_disable(ap->dev);
> imxpriv->no_device = true;
> }
>
> @@ -97,45 +122,10 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
> unsigned int reg_val;
> struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
>
> - imxpriv->gpr =
> - syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
> - if (IS_ERR(imxpriv->gpr)) {
> - dev_err(dev, "failed to find fsl,imx6q-iomux-gpr regmap\n");
> - return PTR_ERR(imxpriv->gpr);
> - }
> -
> - ret = clk_prepare_enable(imxpriv->sata_ref_clk);
> - if (ret < 0) {
> - dev_err(dev, "prepare-enable sata_ref clock err:%d\n", ret);
> + ret = imx_sata_clock_enable(dev);
> + if (ret < 0)
> return ret;
> - }
>
> - /*
> - * set PHY Paremeters, two steps to configure the GPR13,
> - * one write for rest of parameters, mask of first write
> - * is 0x07fffffd, and the other one write for setting
> - * the mpll_clk_en.
> - */
> - regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK
> - | IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK
> - | IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK
> - | IMX6Q_GPR13_SATA_SPD_MODE_MASK
> - | IMX6Q_GPR13_SATA_MPLL_SS_EN
> - | IMX6Q_GPR13_SATA_TX_ATTEN_MASK
> - | IMX6Q_GPR13_SATA_TX_BOOST_MASK
> - | IMX6Q_GPR13_SATA_TX_LVL_MASK
> - | IMX6Q_GPR13_SATA_TX_EDGE_RATE
> - | IMX6Q_GPR13_SATA_MPLL_CLK_EN
> - , IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB
> - | IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M
> - | IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F
> - | IMX6Q_GPR13_SATA_SPD_MODE_3P0G
> - | IMX6Q_GPR13_SATA_MPLL_SS_EN
> - | IMX6Q_GPR13_SATA_TX_ATTEN_9_16
> - | IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB
> - | IMX6Q_GPR13_SATA_TX_LVL_1_025_V);
> - regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_MPLL_CLK_EN,
> - IMX6Q_GPR13_SATA_MPLL_CLK_EN);
> usleep_range(100, 200);
For the third time, can this usleep_range() be moved together with
IMX6Q_GPR13_SATA_MPLL_CLK_EN setting into imx_sata_clock_enable(), since
this sleep is specifically for SATA MPLL enabling?
Shawn
>
> /*
> @@ -164,11 +154,7 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
>
> static void imx6q_sata_exit(struct device *dev)
> {
> - struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent);
> -
> - regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_MPLL_CLK_EN,
> - !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
> - clk_disable_unprepare(imxpriv->sata_ref_clk);
> + imx_sata_clock_disable(dev);
> }
>
> static int imx_ahci_suspend(struct device *dev)
> @@ -179,12 +165,8 @@ static int imx_ahci_suspend(struct device *dev)
> * If no_device is set, The CLKs had been gated off in the
> * initialization so don't do it again here.
> */
> - if (!imxpriv->no_device) {
> - regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
> - IMX6Q_GPR13_SATA_MPLL_CLK_EN,
> - !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
> - clk_disable_unprepare(imxpriv->sata_ref_clk);
> - }
> + if (!imxpriv->no_device)
> + imx_sata_clock_disable(dev);
>
> return 0;
> }
> @@ -195,15 +177,10 @@ static int imx_ahci_resume(struct device *dev)
> int ret;
>
> if (!imxpriv->no_device) {
> - ret = clk_prepare_enable(imxpriv->sata_ref_clk);
> - if (ret < 0) {
> - dev_err(dev, "pre-enable sata_ref clock err:%d\n", ret);
> + ret = imx_sata_clock_enable(dev);
> + if (ret < 0)
> return ret;
> - }
>
> - regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
> - IMX6Q_GPR13_SATA_MPLL_CLK_EN,
> - IMX6Q_GPR13_SATA_MPLL_CLK_EN);
> usleep_range(1000, 2000);
> }
>
> @@ -290,6 +267,41 @@ static int imx_ahci_probe(struct platform_device *pdev)
> ahci_dev->dma_mask = &ahci_dev->coherent_dma_mask;
> ahci_dev->of_node = dev->of_node;
>
> + imxpriv->gpr =
> + syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
> +
> + if (IS_ERR(imxpriv->gpr)) {
> + dev_err(dev, "failed to find fsl,imx6q-iomux-gpr regmap\n");
> + ret = PTR_ERR(imxpriv->gpr);
> + goto err_out;
> + }
> +
> + /*
> + * Set PHY Paremeters, two steps to configure the GPR13,
> + * one write for rest of parameters, mask of first write
> + * is 0x07fffffd, and the other one write for setting
> + * the mpll_clk_en happens in imx_sata_clock_enable().
> + */
> + regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
> + IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK |
> + IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK |
> + IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK |
> + IMX6Q_GPR13_SATA_SPD_MODE_MASK |
> + IMX6Q_GPR13_SATA_MPLL_SS_EN |
> + IMX6Q_GPR13_SATA_TX_ATTEN_MASK |
> + IMX6Q_GPR13_SATA_TX_BOOST_MASK |
> + IMX6Q_GPR13_SATA_TX_LVL_MASK |
> + IMX6Q_GPR13_SATA_TX_EDGE_RATE |
> + IMX6Q_GPR13_SATA_MPLL_CLK_EN,
> + IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB |
> + IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M |
> + IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F |
> + IMX6Q_GPR13_SATA_SPD_MODE_3P0G |
> + IMX6Q_GPR13_SATA_MPLL_SS_EN |
> + IMX6Q_GPR13_SATA_TX_ATTEN_9_16 |
> + IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB |
> + IMX6Q_GPR13_SATA_TX_LVL_1_025_V);
> +
> ret = platform_device_add_resources(ahci_pdev, res, 2);
> if (ret)
> goto err_out;
> --
> 1.8.4.2
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN
2013-11-20 10:27 ` [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
2013-11-20 12:51 ` Shawn Guo
@ 2013-11-20 14:59 ` Tejun Heo
2013-11-20 15:11 ` Marek Vasut
1 sibling, 1 reply; 15+ messages in thread
From: Tejun Heo @ 2013-11-20 14:59 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Nov 20, 2013 at 11:27:22AM +0100, Marek Vasut wrote:
> We must clear this IMX6Q_GPR13_SATA_MPLL_CLK_EN bit on i.MX6Q, otherwise
> Linux will fail to find the attached drive on some boards.
>
> This entire fix was:
> Reported-by: Eric Nelson <eric.nelson@boundarydevices.com>
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Shawn Guo <shawn.guo@linaro.org>
> Cc: Richard Zhu <r65037@freescale.com>
> Cc: Tejun Heo <tj@kernel.org>
> Cc: Linux-IDE <linux-ide@vger.kernel.org>
> ---
> drivers/ata/ahci_imx.c | 1 +
> 1 file changed, 1 insertion(+)
>
> RESEND: Fix the Cc here.
>
> diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
> index ae2d73f..478921b 100644
> --- a/drivers/ata/ahci_imx.c
> +++ b/drivers/ata/ahci_imx.c
> @@ -125,6 +125,7 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
> | IMX6Q_GPR13_SATA_TX_BOOST_MASK
> | IMX6Q_GPR13_SATA_TX_LVL_MASK
> | IMX6Q_GPR13_SATA_TX_EDGE_RATE
> + | IMX6Q_GPR13_SATA_MPLL_CLK_EN
> , IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB
> | IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M
> | IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F
Not your fault but when things stretch over multiples lines, the
convention is to put the operators and commas at the end of each line
not the other way around. I'd appreciate if you add a trivial patch
to update that too.
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 15+ messages in thread
* [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN
2013-11-20 14:59 ` Tejun Heo
@ 2013-11-20 15:11 ` Marek Vasut
2013-11-20 15:13 ` Tejun Heo
0 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2013-11-20 15:11 UTC (permalink / raw)
To: linux-arm-kernel
Hello Tejun,
> On Wed, Nov 20, 2013 at 11:27:22AM +0100, Marek Vasut wrote:
> > We must clear this IMX6Q_GPR13_SATA_MPLL_CLK_EN bit on i.MX6Q, otherwise
> > Linux will fail to find the attached drive on some boards.
> >
> > This entire fix was:
> > Reported-by: Eric Nelson <eric.nelson@boundarydevices.com>
> >
> > Signed-off-by: Marek Vasut <marex@denx.de>
> > Cc: Shawn Guo <shawn.guo@linaro.org>
> > Cc: Richard Zhu <r65037@freescale.com>
> > Cc: Tejun Heo <tj@kernel.org>
> > Cc: Linux-IDE <linux-ide@vger.kernel.org>
> > ---
> >
> > drivers/ata/ahci_imx.c | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > RESEND: Fix the Cc here.
> >
> > diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
> > index ae2d73f..478921b 100644
> > --- a/drivers/ata/ahci_imx.c
> > +++ b/drivers/ata/ahci_imx.c
> > @@ -125,6 +125,7 @@ static int imx6q_sata_init(struct device *dev, void
> > __iomem *mmio)
> >
> > | IMX6Q_GPR13_SATA_TX_BOOST_MASK
> > | IMX6Q_GPR13_SATA_TX_LVL_MASK
> > | IMX6Q_GPR13_SATA_TX_EDGE_RATE
> >
> > + | IMX6Q_GPR13_SATA_MPLL_CLK_EN
> >
> > , IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB
> >
> > | IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M
> > | IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F
>
> Not your fault but when things stretch over multiples lines, the
> convention is to put the operators and commas at the end of each line
> not the other way around. I'd appreciate if you add a trivial patch
> to update that too.
It's already done in 2/6 of the series, I hope that is OK. Otherwise I can
separate this formating change from the 2/6 patch and shove it in front of this
one even. Which one do you prefer please?
Best regards,
Marek Vasut
^ permalink raw reply [flat|nested] 15+ messages in thread
* [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN
2013-11-20 15:11 ` Marek Vasut
@ 2013-11-20 15:13 ` Tejun Heo
2013-11-22 10:47 ` Marek Vasut
0 siblings, 1 reply; 15+ messages in thread
From: Tejun Heo @ 2013-11-20 15:13 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Nov 20, 2013 at 04:11:43PM +0100, Marek Vasut wrote:
> It's already done in 2/6 of the series, I hope that is OK. Otherwise I can
> separate this formating change from the 2/6 patch and shove it in front of this
> one even. Which one do you prefer please?
Oops, sorry about missing that. As long as the end result is correct,
I don't mind either way.
Thanks!
--
tejun
^ permalink raw reply [flat|nested] 15+ messages in thread
* [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN
2013-11-20 15:13 ` Tejun Heo
@ 2013-11-22 10:47 ` Marek Vasut
0 siblings, 0 replies; 15+ messages in thread
From: Marek Vasut @ 2013-11-22 10:47 UTC (permalink / raw)
To: linux-arm-kernel
Dear Tejun Heo,
> On Wed, Nov 20, 2013 at 04:11:43PM +0100, Marek Vasut wrote:
> > It's already done in 2/6 of the series, I hope that is OK. Otherwise I
> > can separate this formating change from the 2/6 patch and shove it in
> > front of this one even. Which one do you prefer please?
>
> Oops, sorry about missing that. As long as the end result is correct,
> I don't mind either way.
OK, I will leave that as is since it is fixed in 2/6. Thanks!
Best regards,
Marek Vasut
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH V2 4/6] ARM: imx: imx53: Add SATA PHY clock
2013-11-22 11:04 [PATCH V2 " Marek Vasut
@ 2013-11-22 11:05 ` Marek Vasut
2013-11-25 7:21 ` Shawn Guo
0 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2013-11-22 11:05 UTC (permalink / raw)
To: linux-arm-kernel
Add SATA PHY clock which are derived from the USB PHY1 clock. Note that this
patch derives the SATA PHY clock from USB PHY1 clock gate so that the SATA
driver can ungate both the SATA PHY clock and USB PHY1 clock for the SATA to
work correctly.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Richard Zhu <r65037@freescale.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Linux-IDE <linux-ide@vger.kernel.org>
---
arch/arm/mach-imx/clk-imx51-imx53.c | 1 +
include/dt-bindings/clock/imx5-clock.h | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
V2: Rename 'IMX5_CLK_SATA_PHY' to 'IMX5_CLK_SATA_REF' as well as
'sata_phy' to 'sata_ref' .
diff --git a/arch/arm/mach-imx/clk-imx51-imx53.c b/arch/arm/mach-imx/clk-imx51-imx53.c
index 07d275f..3f01df2 100644
--- a/arch/arm/mach-imx/clk-imx51-imx53.c
+++ b/arch/arm/mach-imx/clk-imx51-imx53.c
@@ -244,6 +244,7 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,
clk[IMX5_CLK_SPDIF0_GATE] = imx_clk_gate2("spdif0_gate", "spdif0_com_sel", MXC_CCM_CCGR5, 26);
clk[IMX5_CLK_SPDIF_IPG_GATE] = imx_clk_gate2("spdif_ipg_gate", "ipg", MXC_CCM_CCGR5, 30);
clk[IMX5_CLK_SAHARA_IPG_GATE] = imx_clk_gate2("sahara_ipg_gate", "ipg", MXC_CCM_CCGR4, 14);
+ clk[IMX5_CLK_SATA_REF] = imx_clk_fixed_factor("sata_ref", "usb_phy1_gate", 1, 1);
for (i = 0; i < ARRAY_SIZE(clk); i++)
if (IS_ERR(clk[i]))
diff --git a/include/dt-bindings/clock/imx5-clock.h b/include/dt-bindings/clock/imx5-clock.h
index 5c2f634..5f2667ec 100644
--- a/include/dt-bindings/clock/imx5-clock.h
+++ b/include/dt-bindings/clock/imx5-clock.h
@@ -197,6 +197,7 @@
#define IMX5_CLK_SPDIF_IPG_GATE 185
#define IMX5_CLK_OCRAM 186
#define IMX5_CLK_SAHARA_IPG_GATE 187
-#define IMX5_CLK_END 188
+#define IMX5_CLK_SATA_REF 188
+#define IMX5_CLK_END 189
#endif /* __DT_BINDINGS_CLOCK_IMX5_H */
--
1.8.4.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH V2 4/6] ARM: imx: imx53: Add SATA PHY clock
2013-11-22 11:05 ` [PATCH V2 4/6] ARM: imx: imx53: Add SATA PHY clock Marek Vasut
@ 2013-11-25 7:21 ` Shawn Guo
0 siblings, 0 replies; 15+ messages in thread
From: Shawn Guo @ 2013-11-25 7:21 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Nov 22, 2013 at 12:05:02PM +0100, Marek Vasut wrote:
> Add SATA PHY clock which are derived from the USB PHY1 clock. Note that this
> patch derives the SATA PHY clock from USB PHY1 clock gate so that the SATA
> driver can ungate both the SATA PHY clock and USB PHY1 clock for the SATA to
> work correctly.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Shawn Guo <shawn.guo@linaro.org>
> Cc: Richard Zhu <r65037@freescale.com>
> Cc: Tejun Heo <tj@kernel.org>
> Cc: Linux-IDE <linux-ide@vger.kernel.org>
Applied patches #4, #5 and #6.
Shawn
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2013-11-25 7:21 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-20 10:17 [PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
2013-11-20 10:17 ` [PATCH V4 2/6] ahci: imx: Pull out the clock enable/disable calls Marek Vasut
2013-11-20 12:55 ` Shawn Guo
2013-11-20 10:17 ` [PATCH V4 3/6] ahci: imx: Add i.MX53 support Marek Vasut
2013-11-20 10:17 ` [PATCH V2 4/6] ARM: imx: imx53: Add SATA PHY clock Marek Vasut
2013-11-20 10:17 ` [PATCH V2 5/6] ARM: dts: imx53: Add AHCI SATA DT node Marek Vasut
2013-11-20 10:17 ` [PATCH 6/6] ARM: dts: imx53: Enable AHCI SATA for M53EVK Marek Vasut
2013-11-20 10:27 ` [RESEND PATCH 1/6] ahci: imx: Explicitly clear IMX6Q_GPR13_SATA_MPLL_CLK_EN Marek Vasut
2013-11-20 12:51 ` Shawn Guo
2013-11-20 14:59 ` Tejun Heo
2013-11-20 15:11 ` Marek Vasut
2013-11-20 15:13 ` Tejun Heo
2013-11-22 10:47 ` Marek Vasut
-- strict thread matches above, loose matches on Subject: below --
2013-11-22 11:04 [PATCH V2 " Marek Vasut
2013-11-22 11:05 ` [PATCH V2 4/6] ARM: imx: imx53: Add SATA PHY clock Marek Vasut
2013-11-25 7:21 ` Shawn Guo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).