diff mbox

[1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces

Message ID 1396882664-19297-2-git-send-email-thomas.petazzoni@free-electrons.com
State Not Applicable
Delegated to: David Miller
Headers show

Commit Message

Thomas Petazzoni April 7, 2014, 2:57 p.m. UTC
The Marvell Armada 380 SoC includes two AHCI compatible
interfaces. However, like all DMA-capable Marvell interface, they
require special handling to configure MBus windows. Therefore, this
commit adds a new ahci_mvebu driver, which relies on the
libahci_platform.c code recently introduced.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 .../devicetree/bindings/ata/ahci-platform.txt      |   3 +-
 drivers/ata/Kconfig                                |   9 ++
 drivers/ata/Makefile                               |   1 +
 drivers/ata/ahci_mvebu.c                           | 105 +++++++++++++++++++++
 4 files changed, 117 insertions(+), 1 deletion(-)
 create mode 100644 drivers/ata/ahci_mvebu.c

Comments

Andrew Lunn April 7, 2014, 3:18 p.m. UTC | #1
On Mon, Apr 07, 2014 at 04:57:41PM +0200, Thomas Petazzoni wrote:
> The Marvell Armada 380 SoC includes two AHCI compatible
> interfaces. However, like all DMA-capable Marvell interface, they
> require special handling to configure MBus windows. Therefore, this
> commit adds a new ahci_mvebu driver, which relies on the
> libahci_platform.c code recently introduced.
> 
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> ---
>  .../devicetree/bindings/ata/ahci-platform.txt      |   3 +-
>  drivers/ata/Kconfig                                |   9 ++
>  drivers/ata/Makefile                               |   1 +
>  drivers/ata/ahci_mvebu.c                           | 105 +++++++++++++++++++++
>  4 files changed, 117 insertions(+), 1 deletion(-)
>  create mode 100644 drivers/ata/ahci_mvebu.c
> 
> diff --git a/Documentation/devicetree/bindings/ata/ahci-platform.txt b/Documentation/devicetree/bindings/ata/ahci-platform.txt
> index 48b285f..271746d 100644
> --- a/Documentation/devicetree/bindings/ata/ahci-platform.txt
> +++ b/Documentation/devicetree/bindings/ata/ahci-platform.txt
> @@ -7,7 +7,8 @@ Required properties:
>  - compatible        : compatible list, one of "snps,spear-ahci",
>                        "snps,exynos5440-ahci", "ibm,476gtr-ahci",
>                        "allwinner,sun4i-a10-ahci", "fsl,imx53-ahci"
> -                      "fsl,imx6q-ahci" or "snps,dwc-ahci"
> +                      "fsl,imx6q-ahci", "snps,dwc-ahci" or
> +                      "marvell,armada-380-ahci"

Hi Thomas

Since this list is growing, maybe now would be a good time to sort it
alphabetically?

>  - interrupts        : <interrupt mapping for SATA IRQ>
>  - reg               : <registers mapping>
>  
> diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
> index 2e4da3b..cb987e9 100644
> --- a/drivers/ata/Kconfig
> +++ b/drivers/ata/Kconfig
> @@ -123,6 +123,15 @@ config AHCI_IMX
>  
>  	  If unsure, say N.
>  
> +config AHCI_MVEBU
> +	tristate "Marvell EBU AHCI SATA support"
> +	depends on ARCH_MVEBU
> +	help
> +	  This option enables support for the Marvebu EBU SoC's
> +	  onboard AHCI SATA.
> +
> +	  If unsure, say N.
> +
>  config AHCI_SUNXI
>  	tristate "Allwinner sunxi AHCI SATA support"
>  	depends on ARCH_SUNXI
> diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
> index 44c8016..5a02aee 100644
> --- a/drivers/ata/Makefile
> +++ b/drivers/ata/Makefile
> @@ -12,6 +12,7 @@ obj-$(CONFIG_SATA_DWC)		+= sata_dwc_460ex.o
>  obj-$(CONFIG_SATA_HIGHBANK)	+= sata_highbank.o libahci.o
>  obj-$(CONFIG_AHCI_DA850)	+= ahci_da850.o libahci.o libahci_platform.o
>  obj-$(CONFIG_AHCI_IMX)		+= ahci_imx.o libahci.o libahci_platform.o
> +obj-$(CONFIG_AHCI_MVEBU)	+= ahci_mvebu.o libahci.o libahci_platform.o
>  obj-$(CONFIG_AHCI_SUNXI)	+= ahci_sunxi.o libahci.o libahci_platform.o
>  obj-$(CONFIG_AHCI_ST)		+= ahci_st.o libahci.o libahci_platform.o
>  obj-$(CONFIG_AHCI_XGENE)	+= ahci_xgene.o libahci.o libahci_platform.o
> diff --git a/drivers/ata/ahci_mvebu.c b/drivers/ata/ahci_mvebu.c
> new file mode 100644
> index 0000000..ca90b18
> --- /dev/null
> +++ b/drivers/ata/ahci_mvebu.c
> @@ -0,0 +1,105 @@
> +/*
> + * AHCI glue platform driver for Marvell EBU SOCs
> + *
> + * Copyright (C) 2014 Marvell
> + *
> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> + * Marcin Wojtas <mw@semihalf.com>
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2.  This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +
> +#include <linux/ahci_platform.h>
> +#include <linux/kernel.h>
> +#include <linux/mbus.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/platform_device.h>
> +#include "ahci.h"
> +
> +#define AHCI_WINDOW_CTRL(win)	(0x60 + ((win) << 4))
> +#define AHCI_WINDOW_BASE(win)	(0x64 + ((win) << 4))
> +#define AHCI_WINDOW_SIZE(win)	(0x68 + ((win) << 4))
> +
> +static void ahci_mvebu_mbus_config(struct ahci_host_priv *hpriv,
> +				   const struct mbus_dram_target_info *dram)
> +{
> +	int i;
> +
> +	for (i = 0; i < 4; i++) {
> +		writel(0, hpriv->mmio + AHCI_WINDOW_CTRL(i));
> +		writel(0, hpriv->mmio + AHCI_WINDOW_BASE(i));
> +		writel(0, hpriv->mmio + AHCI_WINDOW_SIZE(i));
> +	}
> +
> +	for (i = 0; i < dram->num_cs; i++) {
> +		const struct mbus_dram_window *cs = dram->cs + i;
> +
> +		writel((cs->mbus_attr << 8) |
> +		       (dram->mbus_dram_target_id << 4) | 1,
> +		       hpriv->mmio + AHCI_WINDOW_CTRL(i));
> +		writel(cs->base, hpriv->mmio + AHCI_WINDOW_BASE(i));
> +		writel(((cs->size - 1) & 0xffff0000),
> +		       hpriv->mmio + AHCI_WINDOW_SIZE(i));
> +	}
> +}
> +
> +static const struct ata_port_info ahci_mvebu_port_info = {
> +	.flags	   = AHCI_FLAG_COMMON,
> +	.pio_mask  = ATA_PIO4,
> +	.udma_mask = ATA_UDMA6,
> +	.port_ops  = &ahci_platform_ops,
> +};
> +
> +static int ahci_mvebu_probe(struct platform_device *pdev)
> +{
> +	struct ahci_host_priv *hpriv;
> +	const struct mbus_dram_target_info *dram;
> +	int rc;
> +
> +	hpriv = ahci_platform_get_resources(pdev);
> +	if (IS_ERR(hpriv))
> +		return PTR_ERR(hpriv);
> +
> +	rc = ahci_platform_enable_resources(hpriv);
> +	if (rc)
> +		return rc;
> +
> +	dram = mv_mbus_dram_info();
> +	if (dram)
> +		ahci_mvebu_mbus_config(hpriv, dram);

I know this is a common model for mv_sata, which has to deal with
devices without dram, but can 38x also work without dram? Or should
missing dram be considered fatal to the probe?

> +
> +	rc = ahci_platform_init_host(pdev, hpriv, &ahci_mvebu_port_info, 0, 0);
> +	if (rc)
> +		goto disable_resources;
> +
> +	return 0;
> +
> +disable_resources:
> +	ahci_platform_disable_resources(hpriv);
> +	return rc;
> +}
> +
> +static const struct of_device_id ahci_mvebu_of_match[] = {
> +	{ .compatible = "marvell,armada-380-ahci", },
> +	{ },
> +};
> +MODULE_DEVICE_TABLE(of, ahci_mvebu_of_match);
> +
> +static struct platform_driver ahci_mvebu_driver = {
> +	.probe = ahci_mvebu_probe,
> +	.remove = ata_platform_remove_one,
> +	.driver = {
> +		.name = "ahci-mvebu",
> +		.owner = THIS_MODULE,
> +		.of_match_table = ahci_mvebu_of_match,
> +	},
> +};
> +module_platform_driver(ahci_mvebu_driver);
> +
> +MODULE_DESCRIPTION("Marvell EBU AHCI SATA driver");
> +MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>, Marcin Wojtas <mw@semihalf.com>");
> +MODULE_LICENSE("GPL");
> +MODULE_ALIAS("platform:ahci_mv");
> -- 
> 1.8.3.2
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Thomas Petazzoni April 7, 2014, 3:50 p.m. UTC | #2
Dear Andrew Lunn,

On Mon, 7 Apr 2014 17:18:23 +0200, Andrew Lunn wrote:

> > diff --git a/Documentation/devicetree/bindings/ata/ahci-platform.txt b/Documentation/devicetree/bindings/ata/ahci-platform.txt
> > index 48b285f..271746d 100644
> > --- a/Documentation/devicetree/bindings/ata/ahci-platform.txt
> > +++ b/Documentation/devicetree/bindings/ata/ahci-platform.txt
> > @@ -7,7 +7,8 @@ Required properties:
> >  - compatible        : compatible list, one of "snps,spear-ahci",
> >                        "snps,exynos5440-ahci", "ibm,476gtr-ahci",
> >                        "allwinner,sun4i-a10-ahci", "fsl,imx53-ahci"
> > -                      "fsl,imx6q-ahci" or "snps,dwc-ahci"
> > +                      "fsl,imx6q-ahci", "snps,dwc-ahci" or
> > +                      "marvell,armada-380-ahci"
> 
> Hi Thomas
> 
> Since this list is growing, maybe now would be a good time to sort it
> alphabetically?

Ok. I guess this would have to be a separate patch, preliminary to the
introduction of the ahci_mvebu driver.

> > +	dram = mv_mbus_dram_info();
> > +	if (dram)
> > +		ahci_mvebu_mbus_config(hpriv, dram);
> 
> I know this is a common model for mv_sata, which has to deal with
> devices without dram, but can 38x also work without dram? Or should
> missing dram be considered fatal to the probe?

Indeed in the current situation, dram should never be NULL, so the code
could even be:

	ahci_mvebu_mbus_config(hpriv, mv_mbus_dram_info());

Will fix for v2.

Thomas
Bartlomiej Zolnierkiewicz April 7, 2014, 5:50 p.m. UTC | #3
Hi,

On Monday, April 07, 2014 04:57:41 PM Thomas Petazzoni wrote:
> The Marvell Armada 380 SoC includes two AHCI compatible
> interfaces. However, like all DMA-capable Marvell interface, they
> require special handling to configure MBus windows. Therefore, this
> commit adds a new ahci_mvebu driver, which relies on the
> libahci_platform.c code recently introduced.
> 
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> ---
>  .../devicetree/bindings/ata/ahci-platform.txt      |   3 +-
>  drivers/ata/Kconfig                                |   9 ++
>  drivers/ata/Makefile                               |   1 +
>  drivers/ata/ahci_mvebu.c                           | 105 +++++++++++++++++++++
>  4 files changed, 117 insertions(+), 1 deletion(-)
>  create mode 100644 drivers/ata/ahci_mvebu.c
> 
> diff --git a/Documentation/devicetree/bindings/ata/ahci-platform.txt b/Documentation/devicetree/bindings/ata/ahci-platform.txt
> index 48b285f..271746d 100644
> --- a/Documentation/devicetree/bindings/ata/ahci-platform.txt
> +++ b/Documentation/devicetree/bindings/ata/ahci-platform.txt
> @@ -7,7 +7,8 @@ Required properties:
>  - compatible        : compatible list, one of "snps,spear-ahci",
>                        "snps,exynos5440-ahci", "ibm,476gtr-ahci",
>                        "allwinner,sun4i-a10-ahci", "fsl,imx53-ahci"
> -                      "fsl,imx6q-ahci" or "snps,dwc-ahci"
> +                      "fsl,imx6q-ahci", "snps,dwc-ahci" or
> +                      "marvell,armada-380-ahci"
>  - interrupts        : <interrupt mapping for SATA IRQ>
>  - reg               : <registers mapping>
>  
> diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
> index 2e4da3b..cb987e9 100644
> --- a/drivers/ata/Kconfig
> +++ b/drivers/ata/Kconfig
> @@ -123,6 +123,15 @@ config AHCI_IMX
>  
>  	  If unsure, say N.
>  
> +config AHCI_MVEBU
> +	tristate "Marvell EBU AHCI SATA support"
> +	depends on ARCH_MVEBU
> +	help
> +	  This option enables support for the Marvebu EBU SoC's
> +	  onboard AHCI SATA.
> +
> +	  If unsure, say N.
> +
>  config AHCI_SUNXI
>  	tristate "Allwinner sunxi AHCI SATA support"
>  	depends on ARCH_SUNXI
> diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
> index 44c8016..5a02aee 100644
> --- a/drivers/ata/Makefile
> +++ b/drivers/ata/Makefile
> @@ -12,6 +12,7 @@ obj-$(CONFIG_SATA_DWC)		+= sata_dwc_460ex.o
>  obj-$(CONFIG_SATA_HIGHBANK)	+= sata_highbank.o libahci.o
>  obj-$(CONFIG_AHCI_DA850)	+= ahci_da850.o libahci.o libahci_platform.o
>  obj-$(CONFIG_AHCI_IMX)		+= ahci_imx.o libahci.o libahci_platform.o
> +obj-$(CONFIG_AHCI_MVEBU)	+= ahci_mvebu.o libahci.o libahci_platform.o
>  obj-$(CONFIG_AHCI_SUNXI)	+= ahci_sunxi.o libahci.o libahci_platform.o
>  obj-$(CONFIG_AHCI_ST)		+= ahci_st.o libahci.o libahci_platform.o
>  obj-$(CONFIG_AHCI_XGENE)	+= ahci_xgene.o libahci.o libahci_platform.o
> diff --git a/drivers/ata/ahci_mvebu.c b/drivers/ata/ahci_mvebu.c
> new file mode 100644
> index 0000000..ca90b18
> --- /dev/null
> +++ b/drivers/ata/ahci_mvebu.c
> @@ -0,0 +1,105 @@
> +/*
> + * AHCI glue platform driver for Marvell EBU SOCs
> + *
> + * Copyright (C) 2014 Marvell
> + *
> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> + * Marcin Wojtas <mw@semihalf.com>
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2.  This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +
> +#include <linux/ahci_platform.h>
> +#include <linux/kernel.h>
> +#include <linux/mbus.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/platform_device.h>
> +#include "ahci.h"
> +
> +#define AHCI_WINDOW_CTRL(win)	(0x60 + ((win) << 4))
> +#define AHCI_WINDOW_BASE(win)	(0x64 + ((win) << 4))
> +#define AHCI_WINDOW_SIZE(win)	(0x68 + ((win) << 4))
> +
> +static void ahci_mvebu_mbus_config(struct ahci_host_priv *hpriv,
> +				   const struct mbus_dram_target_info *dram)
> +{
> +	int i;
> +
> +	for (i = 0; i < 4; i++) {
> +		writel(0, hpriv->mmio + AHCI_WINDOW_CTRL(i));
> +		writel(0, hpriv->mmio + AHCI_WINDOW_BASE(i));
> +		writel(0, hpriv->mmio + AHCI_WINDOW_SIZE(i));
> +	}
> +
> +	for (i = 0; i < dram->num_cs; i++) {
> +		const struct mbus_dram_window *cs = dram->cs + i;
> +
> +		writel((cs->mbus_attr << 8) |
> +		       (dram->mbus_dram_target_id << 4) | 1,
> +		       hpriv->mmio + AHCI_WINDOW_CTRL(i));
> +		writel(cs->base, hpriv->mmio + AHCI_WINDOW_BASE(i));
> +		writel(((cs->size - 1) & 0xffff0000),
> +		       hpriv->mmio + AHCI_WINDOW_SIZE(i));
> +	}
> +}
> +
> +static const struct ata_port_info ahci_mvebu_port_info = {
> +	.flags	   = AHCI_FLAG_COMMON,
> +	.pio_mask  = ATA_PIO4,
> +	.udma_mask = ATA_UDMA6,
> +	.port_ops  = &ahci_platform_ops,
> +};
> +
> +static int ahci_mvebu_probe(struct platform_device *pdev)
> +{
> +	struct ahci_host_priv *hpriv;
> +	const struct mbus_dram_target_info *dram;
> +	int rc;
> +
> +	hpriv = ahci_platform_get_resources(pdev);
> +	if (IS_ERR(hpriv))
> +		return PTR_ERR(hpriv);
> +
> +	rc = ahci_platform_enable_resources(hpriv);
> +	if (rc)
> +		return rc;
> +
> +	dram = mv_mbus_dram_info();
> +	if (dram)
> +		ahci_mvebu_mbus_config(hpriv, dram);
> +
> +	rc = ahci_platform_init_host(pdev, hpriv, &ahci_mvebu_port_info, 0, 0);
> +	if (rc)
> +		goto disable_resources;
> +
> +	return 0;
> +
> +disable_resources:
> +	ahci_platform_disable_resources(hpriv);
> +	return rc;
> +}
> +
> +static const struct of_device_id ahci_mvebu_of_match[] = {
> +	{ .compatible = "marvell,armada-380-ahci", },
> +	{ },
> +};
> +MODULE_DEVICE_TABLE(of, ahci_mvebu_of_match);
> +
> +static struct platform_driver ahci_mvebu_driver = {
> +	.probe = ahci_mvebu_probe,
> +	.remove = ata_platform_remove_one,
> +	.driver = {
> +		.name = "ahci-mvebu",
> +		.owner = THIS_MODULE,
> +		.of_match_table = ahci_mvebu_of_match,

Why is the Power Management support missing from this driver?

> +	},
> +};
> +module_platform_driver(ahci_mvebu_driver);
> +
> +MODULE_DESCRIPTION("Marvell EBU AHCI SATA driver");
> +MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>, Marcin Wojtas <mw@semihalf.com>");
> +MODULE_LICENSE("GPL");
> +MODULE_ALIAS("platform:ahci_mv");

platform:ahci_mvebu ?

Otherwise it looks good.

Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Thomas Petazzoni April 7, 2014, 9:43 p.m. UTC | #4
Dear Bartlomiej Zolnierkiewicz,

On Mon, 07 Apr 2014 19:50:06 +0200, Bartlomiej Zolnierkiewicz wrote:

> > +static struct platform_driver ahci_mvebu_driver = {
> > +	.probe = ahci_mvebu_probe,
> > +	.remove = ata_platform_remove_one,
> > +	.driver = {
> > +		.name = "ahci-mvebu",
> > +		.owner = THIS_MODULE,
> > +		.of_match_table = ahci_mvebu_of_match,
> 
> Why is the Power Management support missing from this driver?

Because as of today, the only platform that can use this driver is the
Armada 38x, and we don't yet have suspend/resume support for this
platform: we haven't written yet the suspend to RAM code for it. And I
wanted to avoid adding suspend/resume code that I'm not able to test.

So my plan is to get back to PM support once we have working suspend to
RAM support on Armada 38x.

> > +MODULE_DESCRIPTION("Marvell EBU AHCI SATA driver");
> > +MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>, Marcin Wojtas <mw@semihalf.com>");
> > +MODULE_LICENSE("GPL");
> > +MODULE_ALIAS("platform:ahci_mv");
> 
> platform:ahci_mvebu ?

Indeed, thanks for spotting.

> Otherwise it looks good.

Thanks for the review!

Thomas
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/ata/ahci-platform.txt b/Documentation/devicetree/bindings/ata/ahci-platform.txt
index 48b285f..271746d 100644
--- a/Documentation/devicetree/bindings/ata/ahci-platform.txt
+++ b/Documentation/devicetree/bindings/ata/ahci-platform.txt
@@ -7,7 +7,8 @@  Required properties:
 - compatible        : compatible list, one of "snps,spear-ahci",
                       "snps,exynos5440-ahci", "ibm,476gtr-ahci",
                       "allwinner,sun4i-a10-ahci", "fsl,imx53-ahci"
-                      "fsl,imx6q-ahci" or "snps,dwc-ahci"
+                      "fsl,imx6q-ahci", "snps,dwc-ahci" or
+                      "marvell,armada-380-ahci"
 - interrupts        : <interrupt mapping for SATA IRQ>
 - reg               : <registers mapping>
 
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
index 2e4da3b..cb987e9 100644
--- a/drivers/ata/Kconfig
+++ b/drivers/ata/Kconfig
@@ -123,6 +123,15 @@  config AHCI_IMX
 
 	  If unsure, say N.
 
+config AHCI_MVEBU
+	tristate "Marvell EBU AHCI SATA support"
+	depends on ARCH_MVEBU
+	help
+	  This option enables support for the Marvebu EBU SoC's
+	  onboard AHCI SATA.
+
+	  If unsure, say N.
+
 config AHCI_SUNXI
 	tristate "Allwinner sunxi AHCI SATA support"
 	depends on ARCH_SUNXI
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
index 44c8016..5a02aee 100644
--- a/drivers/ata/Makefile
+++ b/drivers/ata/Makefile
@@ -12,6 +12,7 @@  obj-$(CONFIG_SATA_DWC)		+= sata_dwc_460ex.o
 obj-$(CONFIG_SATA_HIGHBANK)	+= sata_highbank.o libahci.o
 obj-$(CONFIG_AHCI_DA850)	+= ahci_da850.o libahci.o libahci_platform.o
 obj-$(CONFIG_AHCI_IMX)		+= ahci_imx.o libahci.o libahci_platform.o
+obj-$(CONFIG_AHCI_MVEBU)	+= ahci_mvebu.o libahci.o libahci_platform.o
 obj-$(CONFIG_AHCI_SUNXI)	+= ahci_sunxi.o libahci.o libahci_platform.o
 obj-$(CONFIG_AHCI_ST)		+= ahci_st.o libahci.o libahci_platform.o
 obj-$(CONFIG_AHCI_XGENE)	+= ahci_xgene.o libahci.o libahci_platform.o
diff --git a/drivers/ata/ahci_mvebu.c b/drivers/ata/ahci_mvebu.c
new file mode 100644
index 0000000..ca90b18
--- /dev/null
+++ b/drivers/ata/ahci_mvebu.c
@@ -0,0 +1,105 @@ 
+/*
+ * AHCI glue platform driver for Marvell EBU SOCs
+ *
+ * Copyright (C) 2014 Marvell
+ *
+ * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+ * Marcin Wojtas <mw@semihalf.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/ahci_platform.h>
+#include <linux/kernel.h>
+#include <linux/mbus.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include "ahci.h"
+
+#define AHCI_WINDOW_CTRL(win)	(0x60 + ((win) << 4))
+#define AHCI_WINDOW_BASE(win)	(0x64 + ((win) << 4))
+#define AHCI_WINDOW_SIZE(win)	(0x68 + ((win) << 4))
+
+static void ahci_mvebu_mbus_config(struct ahci_host_priv *hpriv,
+				   const struct mbus_dram_target_info *dram)
+{
+	int i;
+
+	for (i = 0; i < 4; i++) {
+		writel(0, hpriv->mmio + AHCI_WINDOW_CTRL(i));
+		writel(0, hpriv->mmio + AHCI_WINDOW_BASE(i));
+		writel(0, hpriv->mmio + AHCI_WINDOW_SIZE(i));
+	}
+
+	for (i = 0; i < dram->num_cs; i++) {
+		const struct mbus_dram_window *cs = dram->cs + i;
+
+		writel((cs->mbus_attr << 8) |
+		       (dram->mbus_dram_target_id << 4) | 1,
+		       hpriv->mmio + AHCI_WINDOW_CTRL(i));
+		writel(cs->base, hpriv->mmio + AHCI_WINDOW_BASE(i));
+		writel(((cs->size - 1) & 0xffff0000),
+		       hpriv->mmio + AHCI_WINDOW_SIZE(i));
+	}
+}
+
+static const struct ata_port_info ahci_mvebu_port_info = {
+	.flags	   = AHCI_FLAG_COMMON,
+	.pio_mask  = ATA_PIO4,
+	.udma_mask = ATA_UDMA6,
+	.port_ops  = &ahci_platform_ops,
+};
+
+static int ahci_mvebu_probe(struct platform_device *pdev)
+{
+	struct ahci_host_priv *hpriv;
+	const struct mbus_dram_target_info *dram;
+	int rc;
+
+	hpriv = ahci_platform_get_resources(pdev);
+	if (IS_ERR(hpriv))
+		return PTR_ERR(hpriv);
+
+	rc = ahci_platform_enable_resources(hpriv);
+	if (rc)
+		return rc;
+
+	dram = mv_mbus_dram_info();
+	if (dram)
+		ahci_mvebu_mbus_config(hpriv, dram);
+
+	rc = ahci_platform_init_host(pdev, hpriv, &ahci_mvebu_port_info, 0, 0);
+	if (rc)
+		goto disable_resources;
+
+	return 0;
+
+disable_resources:
+	ahci_platform_disable_resources(hpriv);
+	return rc;
+}
+
+static const struct of_device_id ahci_mvebu_of_match[] = {
+	{ .compatible = "marvell,armada-380-ahci", },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, ahci_mvebu_of_match);
+
+static struct platform_driver ahci_mvebu_driver = {
+	.probe = ahci_mvebu_probe,
+	.remove = ata_platform_remove_one,
+	.driver = {
+		.name = "ahci-mvebu",
+		.owner = THIS_MODULE,
+		.of_match_table = ahci_mvebu_of_match,
+	},
+};
+module_platform_driver(ahci_mvebu_driver);
+
+MODULE_DESCRIPTION("Marvell EBU AHCI SATA driver");
+MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>, Marcin Wojtas <mw@semihalf.com>");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:ahci_mv");