[From nobody Tue Jul 26 02:28:06 2011
Received: from az33smr02.freescale.net (10.64.34.200) by
	039-SN1MMR1-001.039d.mgd.msft.net (10.84.1.13) with Microsoft SMTP
	Server id 14.1.270.2; Thu, 14 Apr 2011 05:28:21 -0500
Received: from x-VirtualBox.ap.freescale.net (x-VirtualBox.ap.freescale.net
	[10.192.242.110])	by az33smr02.freescale.net (8.13.1/8.13.0) with ESMTP
	id p3EASD5k015799;	Thu, 14 Apr 2011 05:28:18 -0500 (CDT)
From: Zhu Richard-R65037 &lt;r65037@freescale.com&gt;
To: &quot;linux-arm-kernel@lists.infradead.org&quot;
	&lt;linux-arm-kernel@lists.infradead.org&gt;
CC: &quot;jgarzik@pobox.com&quot; &lt;jgarzik@pobox.com&gt;, &quot;kernel@pengutronix.de&quot;
	&lt;kernel@pengutronix.de&gt;, &quot;linux-ide@vger.kernel.org&quot;
	&lt;linux-ide@vger.kernel.org&gt;, &quot;avorontsov@ru.mvista.com&quot;
	&lt;avorontsov@ru.mvista.com&gt;, &quot;eric@eukrea.com&quot; &lt;eric@eukrea.com&gt;,
	&quot;eric.miao@linaro.org&quot; &lt;eric.miao@linaro.org&gt;, Zhu Richard-R65037
	&lt;r65037@freescale.com&gt;
Subject: [PATCH V5 2/2] MX53 Enable the AHCI SATA on MX53 LOCO
Thread-Topic: [PATCH V5 2/2] MX53 Enable the AHCI SATA on MX53 LOCO
Thread-Index: AQHL+o6tksXGL3NhZU62twokuqMc5A==
Date: Thu, 14 Apr 2011 10:28:12 +0000
Message-ID: &lt;1302776892-17243-2-git-send-email-Hong-Xing.Zhu@freescale.com&gt;
References: &lt;1302776892-17243-1-git-send-email-Hong-Xing.Zhu@freescale.com&gt;
In-Reply-To: &lt;1302776892-17243-1-git-send-email-Hong-Xing.Zhu@freescale.com&gt;
Content-Language: en-US
X-MS-Exchange-Organization-AuthAs: Internal
X-MS-Exchange-Organization-AuthMechanism: 10
X-MS-Exchange-Organization-AuthSource: 039-SN1MMR1-001.039d.mgd.msft.net
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Content-Type: text/plain; charset=&quot;iso-8859-1&quot;
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0

Signed-off-by: Richard Zhu &lt;Hong-Xing.Zhu@freescale.com&gt;
---
 arch/arm/mach-mx5/board-mx53_loco.c |   75 +++++++++++++++++++++++++++++++=
++++
 1 files changed, 75 insertions(+), 0 deletions(-)

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 &lt;mach/common.h&gt;
 #include &lt;mach/hardware.h&gt;
 #include &lt;mach/iomux-mx53.h&gt;
+#include &lt;mach/ahci_sata.h&gt;

 #include &lt;asm/mach-types.h&gt;
 #include &lt;asm/mach/arch.h&gt;
@@ -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[] =3D {
        /* FEC */
        MX53_PAD_FEC_MDC__FEC_MDC,
@@ -225,6 +228,77 @@ static const struct imxi2c_platform_data mx53_loco_i2c=
_data __initconst =3D {
        .bitrate =3D 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 =3D 0;
+       struct clk *clk;
+
+       sata_clk =3D clk_get(dev, NULL);
+       if (IS_ERR(sata_clk)) {
+               dev_err(dev, &quot;no sata clock.\n&quot;);
+               return PTR_ERR(sata_clk);
+       }
+       ret =3D clk_enable(sata_clk);
+       if (ret) {
+               dev_err(dev, &quot;can't enable sata clock.\n&quot;);
+               goto put_sata_clk;
+       }
+
+       /* FSL IMX AHCI SATA uses the internal usb phy1 clk on loco */
+       sata_ref_clk =3D clk_get(NULL, &quot;usb_phy1&quot;);
+       if (IS_ERR(sata_ref_clk)) {
+               dev_err(dev, &quot;no sata ref clock.\n&quot;);
+               ret =3D PTR_ERR(sata_ref_clk);
+               goto release_sata_clk;
+       }
+       ret =3D clk_enable(sata_ref_clk);
+       if (ret) {
+               dev_err(dev, &quot;can't enable sata ref clock.\n&quot;);
+               goto put_sata_ref_clk;
+       }
+
+       /* Get the AHB clock rate, and configure the TIMER1MS reg later */
+       clk =3D clk_get(NULL, &quot;ahb&quot;);
+       if (IS_ERR(clk)) {
+               dev_err(dev, &quot;no ahb clock.\n&quot;);
+               ret =3D PTR_ERR(clk);
+               goto release_sata_ref_clk;
+       }
+       tmpdata =3D 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 =3D {
+       .init =3D mx53_loco_sata_init,
+       .exit =3D 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(&amp;loco_button_data);
+       imx53_add_ahci(0, &amp;sata_data);
 }

 static void __init mx53_loco_timer_init(void)
--
1.7.1

]