* [PATCH 0/4] Support for Marvell AHCI interface on Armada 38x
@ 2014-04-07 14:57 Thomas Petazzoni
2014-04-07 14:57 ` [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces Thomas Petazzoni
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Thomas Petazzoni @ 2014-04-07 14:57 UTC (permalink / raw)
To: linux-arm-kernel
Hello,
The Marvell Armada 38x ARM processors use an AHCI compatible interface
for SATA (in replacement of the Marvell-specific SATA interface,
handled by the sata_mv driver). However, like all DMA-capable Marvell
interfaces, some specific MBus window configuration must be done, so a
small specific glue layer is needed, which relies on the recently
introduced libahci_platform.c.
The first patch of this series contains the driver itself, which is
fairly straight-forward. It should be taken by Tejun Heo as the ATA
maintainer.
The last three patches add the Device Tree and defconfig changes. They
should be taken by the respective ARM maintainers (mvebu maintainers
for the DT and mvebu_v7_defconfig, and arm-soc maintainers for the
multi_v7_defconfig change).
This series is currently based on linux-next. If this is a problem for
merging, I'll resend a new version once 3.15-rc1 lands.
Thanks!
Thomas
Thomas Petazzoni (4):
ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces
ARM: mvebu: add Device Tree description of AHCI interfaces on Armada
38x
ARM: configs: add ahci_mvebu to mvebu_v7_defconfig
ARM: configs: add ahci_mvebu to multi_v7_defconfig
.../devicetree/bindings/ata/ahci-platform.txt | 3 +-
arch/arm/boot/dts/armada-385-db.dts | 8 ++
arch/arm/boot/dts/armada-38x.dtsi | 16 ++++
arch/arm/configs/multi_v7_defconfig | 1 +
arch/arm/configs/mvebu_v7_defconfig | 1 +
drivers/ata/Kconfig | 9 ++
drivers/ata/Makefile | 1 +
drivers/ata/ahci_mvebu.c | 105 +++++++++++++++++++++
8 files changed, 143 insertions(+), 1 deletion(-)
create mode 100644 drivers/ata/ahci_mvebu.c
--
1.8.3.2
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces 2014-04-07 14:57 [PATCH 0/4] Support for Marvell AHCI interface on Armada 38x Thomas Petazzoni @ 2014-04-07 14:57 ` Thomas Petazzoni 2014-04-07 15:18 ` Andrew Lunn 2014-04-07 17:50 ` Bartlomiej Zolnierkiewicz 2014-04-07 14:57 ` [PATCH 2/4] ARM: mvebu: add Device Tree description of AHCI interfaces on Armada 38x Thomas Petazzoni ` (2 subsequent siblings) 3 siblings, 2 replies; 9+ messages in thread From: Thomas Petazzoni @ 2014-04-07 14:57 UTC (permalink / raw) To: linux-arm-kernel 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, + }, +}; +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 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces 2014-04-07 14:57 ` [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces Thomas Petazzoni @ 2014-04-07 15:18 ` Andrew Lunn 2014-04-07 15:50 ` Thomas Petazzoni 2014-04-07 17:50 ` Bartlomiej Zolnierkiewicz 1 sibling, 1 reply; 9+ messages in thread From: Andrew Lunn @ 2014-04-07 15:18 UTC (permalink / raw) To: linux-arm-kernel 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 > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces 2014-04-07 15:18 ` Andrew Lunn @ 2014-04-07 15:50 ` Thomas Petazzoni 0 siblings, 0 replies; 9+ messages in thread From: Thomas Petazzoni @ 2014-04-07 15:50 UTC (permalink / raw) To: linux-arm-kernel 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 -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces 2014-04-07 14:57 ` [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces Thomas Petazzoni 2014-04-07 15:18 ` Andrew Lunn @ 2014-04-07 17:50 ` Bartlomiej Zolnierkiewicz 2014-04-07 21:43 ` Thomas Petazzoni 1 sibling, 1 reply; 9+ messages in thread From: Bartlomiej Zolnierkiewicz @ 2014-04-07 17:50 UTC (permalink / raw) To: linux-arm-kernel 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 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces 2014-04-07 17:50 ` Bartlomiej Zolnierkiewicz @ 2014-04-07 21:43 ` Thomas Petazzoni 0 siblings, 0 replies; 9+ messages in thread From: Thomas Petazzoni @ 2014-04-07 21:43 UTC (permalink / raw) To: linux-arm-kernel 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 -- Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/4] ARM: mvebu: add Device Tree description of AHCI interfaces on Armada 38x 2014-04-07 14:57 [PATCH 0/4] Support for Marvell AHCI interface on Armada 38x Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces Thomas Petazzoni @ 2014-04-07 14:57 ` Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 3/4] ARM: configs: add ahci_mvebu to mvebu_v7_defconfig Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 4/4] ARM: configs: add ahci_mvebu to multi_v7_defconfig Thomas Petazzoni 3 siblings, 0 replies; 9+ messages in thread From: Thomas Petazzoni @ 2014-04-07 14:57 UTC (permalink / raw) To: linux-arm-kernel The Marvell Armada 38x processors contain two AHCI compatible interfaces. This commit adds the Device Tree description of those interfaces at the SoC level, and also enables them on the Armada 385 DB platform, which allows access to both interfaces through SATA ports. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> --- arch/arm/boot/dts/armada-385-db.dts | 8 ++++++++ arch/arm/boot/dts/armada-38x.dtsi | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/arch/arm/boot/dts/armada-385-db.dts b/arch/arm/boot/dts/armada-385-db.dts index 6828d77..bdde8ff 100644 --- a/arch/arm/boot/dts/armada-385-db.dts +++ b/arch/arm/boot/dts/armada-385-db.dts @@ -81,6 +81,14 @@ }; }; + sata at a8000 { + status = "okay"; + }; + + sata at e0000 { + status = "okay"; + }; + flash at d0000 { status = "okay"; num-cs = <1>; diff --git a/arch/arm/boot/dts/armada-38x.dtsi b/arch/arm/boot/dts/armada-38x.dtsi index a064f59..634a020 100644 --- a/arch/arm/boot/dts/armada-38x.dtsi +++ b/arch/arm/boot/dts/armada-38x.dtsi @@ -338,6 +338,22 @@ reg = <0x72004 0x4>; }; + sata at a8000 { + compatible = "marvell,armada-380-ahci"; + reg = <0xa8000 0x2000>; + interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&gateclk 15>; + status = "disabled"; + }; + + sata at e0000 { + compatible = "marvell,armada-380-ahci"; + reg = <0xe0000 0x2000>; + interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&gateclk 30>; + status = "disabled"; + }; + coredivclk: clock at e4250 { compatible = "marvell,armada-380-corediv-clock"; reg = <0xe4250 0xc>; -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/4] ARM: configs: add ahci_mvebu to mvebu_v7_defconfig 2014-04-07 14:57 [PATCH 0/4] Support for Marvell AHCI interface on Armada 38x Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 2/4] ARM: mvebu: add Device Tree description of AHCI interfaces on Armada 38x Thomas Petazzoni @ 2014-04-07 14:57 ` Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 4/4] ARM: configs: add ahci_mvebu to multi_v7_defconfig Thomas Petazzoni 3 siblings, 0 replies; 9+ messages in thread From: Thomas Petazzoni @ 2014-04-07 14:57 UTC (permalink / raw) To: linux-arm-kernel The Marvell Armada 38x platform needs the ahci_mvebu driver enabled for the AHCI interfaces, so this commit enables the corresponding Kconfig option in mvebu_v7_defconfig. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> --- arch/arm/configs/mvebu_v7_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/configs/mvebu_v7_defconfig b/arch/arm/configs/mvebu_v7_defconfig index a34713d..aaa625a 100644 --- a/arch/arm/configs/mvebu_v7_defconfig +++ b/arch/arm/configs/mvebu_v7_defconfig @@ -36,6 +36,7 @@ CONFIG_CFG80211=y CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_BLK_DEV_SD=y CONFIG_ATA=y +CONFIG_AHCI_MVEBU=y CONFIG_SATA_MV=y CONFIG_NETDEVICES=y CONFIG_MVNETA=y -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/4] ARM: configs: add ahci_mvebu to multi_v7_defconfig 2014-04-07 14:57 [PATCH 0/4] Support for Marvell AHCI interface on Armada 38x Thomas Petazzoni ` (2 preceding siblings ...) 2014-04-07 14:57 ` [PATCH 3/4] ARM: configs: add ahci_mvebu to mvebu_v7_defconfig Thomas Petazzoni @ 2014-04-07 14:57 ` Thomas Petazzoni 3 siblings, 0 replies; 9+ messages in thread From: Thomas Petazzoni @ 2014-04-07 14:57 UTC (permalink / raw) To: linux-arm-kernel The Marvell Armada 38x platform needs the ahci_mvebu driver enabled for the AHCI interfaces, so this commit enables the corresponding Kconfig option in multi_v7_defconfig. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> --- arch/arm/configs/multi_v7_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig index de52231..2a46e4b 100644 --- a/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig @@ -115,6 +115,7 @@ CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=y CONFIG_SCSI_MULTI_LUN=y CONFIG_ATA=y +CONFIG_AHCI_MVEBU=y CONFIG_SATA_AHCI_PLATFORM=y CONFIG_SATA_HIGHBANK=y CONFIG_SATA_MV=y -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2014-04-07 21:43 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-04-07 14:57 [PATCH 0/4] Support for Marvell AHCI interface on Armada 38x Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 1/4] ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces Thomas Petazzoni 2014-04-07 15:18 ` Andrew Lunn 2014-04-07 15:50 ` Thomas Petazzoni 2014-04-07 17:50 ` Bartlomiej Zolnierkiewicz 2014-04-07 21:43 ` Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 2/4] ARM: mvebu: add Device Tree description of AHCI interfaces on Armada 38x Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 3/4] ARM: configs: add ahci_mvebu to mvebu_v7_defconfig Thomas Petazzoni 2014-04-07 14:57 ` [PATCH 4/4] ARM: configs: add ahci_mvebu to multi_v7_defconfig Thomas Petazzoni
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).