Patchwork Status of AHCI support for iMX53 and for loco board

login
register
mail settings
Submitter Zhu Richard-R65037
Date July 26, 2011, 6:27 a.m.
Message ID <010C9052C42A00499CE76D637FA5EE9010A1BD@039-SN1MPN1-006.039d.mgd.msft.net>
Download mbox | patch
Permalink /patch/106782/
State New
Headers show

Comments

Zhu Richard-R65037 - July 26, 2011, 6:27 a.m.
Hi Arnaud:
the review is proceeded to Version5, and no more comments.
The attached files are the latest review email.

Best Regards
Richard Zhu


-----Original Message-----
From: Arnaud Patard [mailto:arnaud.patard@rtp-net.org] 

Sent: 2011年7月25日 3:04
To: linux-arm-kernel@lists.infradead.org
Cc: Zhu Richard-R65037
Subject: Status of AHCI support for iMX53 and for loco board

Hi,

I remember seeing some patches to add ahci support for iMX53 and also to loco/imx53qsb board but I don't see any track of them being on their way to mainline. Have they been merged in some tree and are going to be merged mainline for next kernel release or do they still need some fixes, preventing them to be merged ?


Thanks,
Arnaud
Signed-off-by: Richard Zhu <Hong-Xing.Zhu@freescale.com>
---
 arch/arm/mach-mx5/board-mx53_loco.c |   75 +++++++++++++++++++++++++++++++++++
 1 files changed, 75 insertions(+), 0 deletions(-)

--
1.7.1
Signed-off-by: Richard Zhu <Hong-Xing.Zhu@freescale.com>
---
 arch/arm/mach-mx5/clock-mx51-mx53.c             |   11 +++++
 arch/arm/mach-mx5/devices-imx53.h               |    4 ++
 arch/arm/plat-mxc/Makefile                      |    1 +
 arch/arm/plat-mxc/ahci_sata.c                   |   43 ++++++++++++++++++
 arch/arm/plat-mxc/devices/Kconfig               |    4 ++
 arch/arm/plat-mxc/devices/Makefile              |    1 +
 arch/arm/plat-mxc/devices/platform-ahci-imx.c   |   55 +++++++++++++++++++++++
 arch/arm/plat-mxc/include/mach/ahci_sata.h      |   54 ++++++++++++++++++++++
 arch/arm/plat-mxc/include/mach/devices-common.h |   10 ++++
 9 files changed, 183 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/plat-mxc/ahci_sata.c
 create mode 100644 arch/arm/plat-mxc/devices/platform-ahci-imx.c
 create mode 100644 arch/arm/plat-mxc/include/mach/ahci_sata.h

diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-mx5/clock-mx51-mx53.c
index 6b89c1b..5d7d861 100644
--- a/arch/arm/mach-mx5/clock-mx51-mx53.c
+++ b/arch/arm/mach-mx5/clock-mx51-mx53.c
@@ -1387,6 +1387,14 @@ static struct clk esdhc4_mx53_clk = {
        .secondary = &esdhc4_ipg_clk,
 };

+static struct clk sata_clk = {
+       .parent = &ipg_clk,
+       .enable = _clk_max_enable,
+       .enable_reg = MXC_CCM_CCGR4,
+       .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
+       .disable = _clk_max_disable,
+};
+
 DEFINE_CLOCK(mipi_esc_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG5_OFFSET, NULL, NULL, NULL, &pll2_sw_clk);
 DEFINE_CLOCK(mipi_hsc2_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG4_OFFSET, NULL, NULL, &mipi_esc_clk, &pll2_sw_clk);
 DEFINE_CLOCK(mipi_hsc1_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG3_OFFSET, NULL, NULL, &mipi_hsc2_clk, &pll2_sw_clk);
@@ -1476,6 +1484,9 @@ static struct clk_lookup mx53_lookups[] = {
        _REGISTER_CLOCK("imx53-cspi.0", NULL, cspi_clk)
        _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk)
        _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk)
+       _REGISTER_CLOCK("ahci.0", NULL, sata_clk)
+       _REGISTER_CLOCK(NULL, "usb_phy1", usb_phy1_clk)
+       _REGISTER_CLOCK(NULL, "ahb", ahb_clk)
 };

 static void clk_tree_init(void)
diff --git a/arch/arm/mach-mx5/devices-imx53.h b/arch/arm/mach-mx5/devices-imx53.h
index 48f4c8c..62d23a1 100644
--- a/arch/arm/mach-mx5/devices-imx53.h
+++ b/arch/arm/mach-mx5/devices-imx53.h
@@ -32,3 +32,7 @@ extern const struct imx_spi_imx_data imx53_ecspi_data[];
 extern const struct imx_imx2_wdt_data imx53_imx2_wdt_data[];
 #define imx53_add_imx2_wdt(id, pdata)  \
        imx_add_imx2_wdt(&imx53_imx2_wdt_data[id])
+
+extern const struct imx_ahci_data imx53_ahci_data __initconst;
+#define imx53_add_ahci(id, pdata)   \
+       imx_add_ahci(&imx53_ahci_data, pdata)
diff --git a/arch/arm/plat-mxc/Makefile b/arch/arm/plat-mxc/Makefile
index a138787..a9386bc 100644
--- a/arch/arm/plat-mxc/Makefile
+++ b/arch/arm/plat-mxc/Makefile
@@ -19,6 +19,7 @@ obj-$(CONFIG_ARCH_MXC_AUDMUX_V1) += audmux-v1.o
 obj-$(CONFIG_ARCH_MXC_AUDMUX_V2) += audmux-v2.o
 obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o
 obj-$(CONFIG_CPU_FREQ_IMX)    += cpufreq.o
+obj-$(CONFIG_IMX_HAVE_PLATFORM_AHCI)   += ahci_sata.o
 ifdef CONFIG_SND_IMX_SOC
 obj-y += ssi-fiq.o
 obj-y += ssi-fiq-ksym.o
diff --git a/arch/arm/plat-mxc/ahci_sata.c b/arch/arm/plat-mxc/ahci_sata.c
new file mode 100644
index 0000000..1455eaf
--- /dev/null
+++ b/arch/arm/plat-mxc/ahci_sata.c
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <mach/ahci_sata.h>
+
+/* AHCI module Initialization, if return 0, initialization is successful. */
+int sata_init(void __iomem *addr, unsigned long timer1ms)
+{
+       u32 tmpdata;
+
+       tmpdata = readl(addr + HOST_CAP);
+       if (!(tmpdata & HOST_CAP_SSS)) {
+               tmpdata |= HOST_CAP_SSS;
+               writel(tmpdata, addr + HOST_CAP);
+       }
+
+       if (!(readl(addr + HOST_PORTS_IMPL) & 0x1))
+               writel((readl(addr + HOST_PORTS_IMPL) | 0x1),
+                       addr + HOST_PORTS_IMPL);
+
+       writel(timer1ms, addr + HOST_TIMER1MS);
+
+       return 0;
+}
diff --git a/arch/arm/plat-mxc/devices/Kconfig b/arch/arm/plat-mxc/devices/Kconfig
index bd294ad..f63887b 100644
--- a/arch/arm/plat-mxc/devices/Kconfig
+++ b/arch/arm/plat-mxc/devices/Kconfig
@@ -76,3 +76,7 @@ config IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX

 config IMX_HAVE_PLATFORM_SPI_IMX
        bool
+
+config IMX_HAVE_PLATFORM_AHCI
+       bool
+       default y if ARCH_MX53
diff --git a/arch/arm/plat-mxc/devices/Makefile b/arch/arm/plat-mxc/devices/Makefile
index ad2922a..4d2a1f1 100644
--- a/arch/arm/plat-mxc/devices/Makefile
+++ b/arch/arm/plat-mxc/devices/Makefile
@@ -24,3 +24,4 @@ obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_RTC) += platform-mxc_rtc.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_W1) += platform-mxc_w1.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX) += platform-sdhci-esdhc-imx.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_SPI_IMX) +=  platform-spi_imx.o
+obj-$(CONFIG_IMX_HAVE_PLATFORM_AHCI) +=  platform-ahci-imx.o
diff --git a/arch/arm/plat-mxc/devices/platform-ahci-imx.c b/arch/arm/plat-mxc/devices/platform-ahci-imx.c
new file mode 100644
index 0000000..65a76ce
--- /dev/null
+++ b/arch/arm/plat-mxc/devices/platform-ahci-imx.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <asm/sizes.h>
+#include <mach/hardware.h>
+#include <mach/devices-common.h>
+
+#define imx_ahci_data_entry_single(soc)                                        \
+       {                                                               \
+               .iobase = soc ## _SATA_BASE_ADDR,                       \
+               .irq = soc ## _INT_SATA,                                \
+       }
+
+#ifdef CONFIG_SOC_IMX53
+const struct imx_ahci_data imx53_ahci_data __initconst =
+       imx_ahci_data_entry_single(MX53);
+#endif
+
+struct platform_device *__init imx_add_ahci(
+               const struct imx_ahci_data *data,
+               const struct ahci_platform_data *pdata)
+{
+       struct resource res[] = {
+               {
+                       .start = data->iobase,
+                       .end = data->iobase + SZ_4K - 1,
+                       .flags = IORESOURCE_MEM,
+               }, {
+                       .start = data->irq,
+                       .end = data->irq,
+                       .flags = IORESOURCE_IRQ,
+               },
+       };
+
+       return imx_add_platform_device_dmamask("ahci", 0,
+                       res, ARRAY_SIZE(res),
+                       pdata, sizeof(*pdata),  DMA_BIT_MASK(32));
+}
diff --git a/arch/arm/plat-mxc/include/mach/ahci_sata.h b/arch/arm/plat-mxc/include/mach/ahci_sata.h
new file mode 100644
index 0000000..dbaaf74
--- /dev/null
+++ b/arch/arm/plat-mxc/include/mach/ahci_sata.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef __PLAT_MXC_AHCI_SATA_H__
+#define __PLAT_MXC_AHCI_SATA_H__
+
+enum {
+       HOST_CAP = 0x00,
+       HOST_CAP_SSS = (1 << 27), /* Staggered Spin-up */
+       HOST_PORTS_IMPL = 0x0c,
+       HOST_TIMER1MS = 0xe0, /* Timer 1-ms */
+       /* Offest used to control the MPLL input clk */
+       PHY_CR_CLOCK_FREQ_OVRD = 0x12,
+       /* Port0 SATA Status */
+       PORT_SATA_SR = 0x128,
+       /* Port0 PHY Control */
+       PORT_PHY_CTL = 0x178,
+       /* PORT_PHY_CTL bits */
+       PORT_PHY_CTL_CAP_ADR_LOC = 0x10000,
+       PORT_PHY_CTL_CAP_DAT_LOC = 0x20000,
+       PORT_PHY_CTL_WRITE_LOC = 0x40000,
+       PORT_PHY_CTL_READ_LOC = 0x80000,
+       /* Port0 PHY Status */
+       PORT_PHY_SR = 0x17c,
+       /* PORT_PHY_SR */
+       PORT_PHY_STAT_DATA_LOC = 0,
+       PORT_PHY_STAT_ACK_LOC = 18,
+       /* SATA PHY Register */
+       SATA_PHY_CR_CLOCK_CRCMP_LT_LIMIT = 0x0001,
+       SATA_PHY_CR_CLOCK_DAC_CTL = 0x0008,
+       SATA_PHY_CR_CLOCK_RTUNE_CTL = 0x0009,
+       SATA_PHY_CR_CLOCK_ADC_OUT = 0x000A,
+       SATA_PHY_CR_CLOCK_MPLL_TST = 0x0017,
+};
+
+extern int sata_init(void __iomem *addr, unsigned long timer1ms);
+#endif /* __PLAT_MXC_AHCI_SATA_H__ */
diff --git a/arch/arm/plat-mxc/include/mach/devices-common.h b/arch/arm/plat-mxc/include/mach/devices-common.h
index fa84773..ada88d7 100644
--- a/arch/arm/plat-mxc/include/mach/devices-common.h
+++ b/arch/arm/plat-mxc/include/mach/devices-common.h
@@ -291,3 +291,13 @@ struct imx_spi_imx_data {
 struct platform_device *__init imx_add_spi_imx(
                const struct imx_spi_imx_data *data,
                const struct spi_imx_master *pdata);
+
+#include <linux/ahci_platform.h>
+struct imx_ahci_data {
+       int id;
+       resource_size_t iobase;
+       resource_size_t irq;
+};
+struct platform_device *__init imx_add_ahci(
+               const struct imx_ahci_data *data,
+               const struct ahci_platform_data *pdata);
--
1.7.1

Patch

diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-mx5/board-mx53_loco.c
index 1b947e8..a990992 100644
--- a/arch/arm/mach-mx5/board-mx53_loco.c
+++ b/arch/arm/mach-mx5/board-mx53_loco.c
@@ -26,6 +26,7 @@ 
 #include <mach/common.h>
 #include <mach/hardware.h>
 #include <mach/iomux-mx53.h>
+#include <mach/ahci_sata.h>

 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -39,6 +40,8 @@ 
 #define MX53_LOCO_UI2                  IMX_GPIO_NR(2, 15)
 #define LOCO_FEC_PHY_RST               IMX_GPIO_NR(7, 6)

+static struct clk *sata_clk, *sata_ref_clk;
+
 static iomux_v3_cfg_t mx53_loco_pads[] = {
        /* FEC */
        MX53_PAD_FEC_MDC__FEC_MDC,
@@ -225,6 +228,77 @@  static const struct imxi2c_platform_data mx53_loco_i2c_data __initconst = {
        .bitrate = 100000,
 };

+/* HW Initialization, if return 0, initialization is successful. */
+static int mx53_loco_sata_init(struct device *dev, void __iomem *addr)
+{
+       u32 tmpdata;
+       int ret = 0;
+       struct clk *clk;
+
+       sata_clk = clk_get(dev, NULL);
+       if (IS_ERR(sata_clk)) {
+               dev_err(dev, "no sata clock.\n");
+               return PTR_ERR(sata_clk);
+       }
+       ret = clk_enable(sata_clk);
+       if (ret) {
+               dev_err(dev, "can't enable sata clock.\n");
+               goto put_sata_clk;
+       }
+
+       /* FSL IMX AHCI SATA uses the internal usb phy1 clk on loco */
+       sata_ref_clk = clk_get(NULL, "usb_phy1");
+       if (IS_ERR(sata_ref_clk)) {
+               dev_err(dev, "no sata ref clock.\n");
+               ret = PTR_ERR(sata_ref_clk);
+               goto release_sata_clk;
+       }
+       ret = clk_enable(sata_ref_clk);
+       if (ret) {
+               dev_err(dev, "can't enable sata ref clock.\n");
+               goto put_sata_ref_clk;
+       }
+
+       /* Get the AHB clock rate, and configure the TIMER1MS reg later */
+       clk = clk_get(NULL, "ahb");
+       if (IS_ERR(clk)) {
+               dev_err(dev, "no ahb clock.\n");
+               ret = PTR_ERR(clk);
+               goto release_sata_ref_clk;
+       }
+       tmpdata = clk_get_rate(clk) / 1000;
+       clk_put(clk);
+
+       sata_init(addr, tmpdata);
+
+       return ret;
+
+release_sata_ref_clk:
+       clk_disable(sata_ref_clk);
+put_sata_ref_clk:
+       clk_put(sata_ref_clk);
+release_sata_clk:
+       clk_disable(sata_clk);
+put_sata_clk:
+       clk_put(sata_clk);
+
+       return ret;
+}
+
+static void mx53_loco_sata_exit(struct device *dev)
+{
+       clk_disable(sata_ref_clk);
+       clk_put(sata_ref_clk);
+
+       clk_disable(sata_clk);
+       clk_put(sata_clk);
+}
+
+static struct ahci_platform_data sata_data = {
+       .init = mx53_loco_sata_init,
+       .exit = mx53_loco_sata_exit,
+};
+
 static void __init mx53_loco_board_init(void)
 {
        mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads,
@@ -238,6 +312,7 @@  static void __init mx53_loco_board_init(void)
        imx53_add_sdhci_esdhc_imx(0, NULL);
        imx53_add_sdhci_esdhc_imx(2, NULL);
        imx_add_gpio_keys(&loco_button_data);
+       imx53_add_ahci(0, &sata_data);
 }

 static void __init mx53_loco_timer_init(void)