]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ARM: mxs: add GPMI-NAND support for imx23/imx28
authorHuang Shijie <b32955@freescale.com>
Mon, 6 Feb 2012 05:08:21 +0000 (13:08 +0800)
committerShawn Guo <shawn.guo@linaro.org>
Sat, 11 Feb 2012 15:39:53 +0000 (07:39 -0800)
add GPMI-NAND support for imx23 and imx28.

Signed-off-by: Huang Shijie <b32955@freescale.com>
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
arch/arm/mach-mxs/clock-mx23.c
arch/arm/mach-mxs/clock-mx28.c
arch/arm/mach-mxs/devices-mx23.h
arch/arm/mach-mxs/devices-mx28.h
arch/arm/mach-mxs/devices/Kconfig
arch/arm/mach-mxs/devices/Makefile
arch/arm/mach-mxs/devices/platform-gpmi-nand.c [new file with mode: 0644]
arch/arm/mach-mxs/include/mach/devices-common.h

index e12e11231dc7d8ace7fcdee3b2288a1b8efb7796..aec34712c3216f97d6cc355a3e486c93ffed2b76 100644 (file)
@@ -456,6 +456,7 @@ static struct clk_lookup lookups[] = {
        _REGISTER_CLOCK("mxs-pwm.3", NULL, pwm_clk)
        _REGISTER_CLOCK("mxs-pwm.4", NULL, pwm_clk)
        _REGISTER_CLOCK("imx23-fb", NULL, lcdif_clk)
+       _REGISTER_CLOCK("imx23-gpmi-nand", NULL, gpmi_clk)
 };
 
 static int clk_misc_init(void)
index 5d68e415222026c327dd1cd47d285d74c673fcc9..8dd7b02a4b962c5565ba52aa867e37e36dc11fc0 100644 (file)
@@ -643,6 +643,7 @@ static struct clk_lookup lookups[] = {
        _REGISTER_CLOCK("duart", NULL, uart_clk)
        _REGISTER_CLOCK("imx28-fec.0", NULL, fec_clk)
        _REGISTER_CLOCK("imx28-fec.1", NULL, fec_clk)
+       _REGISTER_CLOCK("imx28-gpmi-nand", NULL, gpmi_clk)
        _REGISTER_CLOCK("mxs-auart.0", NULL, uart_clk)
        _REGISTER_CLOCK("mxs-auart.1", NULL, uart_clk)
        _REGISTER_CLOCK("mxs-auart.2", NULL, uart_clk)
index 3fa651d2c994064df280a11109716b9f0b8e4282..4d1329d59287f543a845f453aac239c0bfc1875a 100644 (file)
@@ -21,6 +21,10 @@ extern const struct mxs_auart_data mx23_auart_data[] __initconst;
 #define mx23_add_auart0()              mx23_add_auart(0)
 #define mx23_add_auart1()              mx23_add_auart(1)
 
+extern const struct mxs_gpmi_nand_data mx23_gpmi_nand_data __initconst;
+#define mx23_add_gpmi_nand(pdata)      \
+       mxs_add_gpmi_nand(pdata, &mx23_gpmi_nand_data)
+
 extern const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst;
 #define mx23_add_mxs_mmc(id, pdata) \
        mxs_add_mxs_mmc(&mx23_mxs_mmc_data[id], pdata)
index 4f50094e293d35aa9cd28e980ae647e63c0beb8c..9dbeae130842b626522466764241b85cea105a75 100644 (file)
@@ -34,6 +34,10 @@ extern const struct mxs_flexcan_data mx28_flexcan_data[] __initconst;
 #define mx28_add_flexcan0(pdata)       mx28_add_flexcan(0, pdata)
 #define mx28_add_flexcan1(pdata)       mx28_add_flexcan(1, pdata)
 
+extern const struct mxs_gpmi_nand_data mx28_gpmi_nand_data __initconst;
+#define mx28_add_gpmi_nand(pdata)      \
+       mxs_add_gpmi_nand(pdata, &mx28_gpmi_nand_data)
+
 extern const struct mxs_mxs_i2c_data mx28_mxs_i2c_data[] __initconst;
 #define mx28_add_mxs_i2c(id)           mxs_add_mxs_i2c(&mx28_mxs_i2c_data[id])
 
index 18b6bf526a272242b1a0d03a78ee4b64b4209f7a..b8913df4cfa209402affd945457517f1b1ef8677 100644 (file)
@@ -12,6 +12,9 @@ config MXS_HAVE_PLATFORM_FLEXCAN
        select HAVE_CAN_FLEXCAN if CAN
        bool
 
+config MXS_HAVE_PLATFORM_GPMI_NAND
+       bool
+
 config MXS_HAVE_PLATFORM_MXS_I2C
        bool
 
index f52e3e53baecea42559efed2051e3ca6270cf944..c8f5c9541a302461ee56dcaf0d8bdff83445a38d 100644 (file)
@@ -3,6 +3,7 @@ obj-$(CONFIG_MXS_HAVE_PLATFORM_AUART) += platform-auart.o
 obj-y += platform-dma.o
 obj-$(CONFIG_MXS_HAVE_PLATFORM_FEC) += platform-fec.o
 obj-$(CONFIG_MXS_HAVE_PLATFORM_FLEXCAN) += platform-flexcan.o
+obj-$(CONFIG_MXS_HAVE_PLATFORM_GPMI_NAND) += platform-gpmi-nand.o
 obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_I2C) += platform-mxs-i2c.o
 obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_MMC) += platform-mxs-mmc.o
 obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_PWM) += platform-mxs-pwm.o
diff --git a/arch/arm/mach-mxs/devices/platform-gpmi-nand.c b/arch/arm/mach-mxs/devices/platform-gpmi-nand.c
new file mode 100644 (file)
index 0000000..3e22df5
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * 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/mx23.h>
+#include <mach/mx28.h>
+#include <mach/devices-common.h>
+#include <linux/dma-mapping.h>
+
+#ifdef CONFIG_SOC_IMX23
+const struct mxs_gpmi_nand_data mx23_gpmi_nand_data __initconst = {
+       .devid = "imx23-gpmi-nand",
+       .res = {
+               /* GPMI */
+               DEFINE_RES_MEM_NAMED(MX23_GPMI_BASE_ADDR, SZ_8K,
+                                       GPMI_NAND_GPMI_REGS_ADDR_RES_NAME),
+               DEFINE_RES_IRQ_NAMED(MX23_INT_GPMI_ATTENTION,
+                                       GPMI_NAND_GPMI_INTERRUPT_RES_NAME),
+               /* BCH */
+               DEFINE_RES_MEM_NAMED(MX23_BCH_BASE_ADDR, SZ_8K,
+                                       GPMI_NAND_BCH_REGS_ADDR_RES_NAME),
+               DEFINE_RES_IRQ_NAMED(MX23_INT_BCH,
+                                       GPMI_NAND_BCH_INTERRUPT_RES_NAME),
+               /* DMA */
+               DEFINE_RES_NAMED(MX23_DMA_GPMI0,
+                                       MX23_DMA_GPMI3 - MX23_DMA_GPMI0 + 1,
+                                       GPMI_NAND_DMA_CHANNELS_RES_NAME,
+                                       IORESOURCE_DMA),
+               DEFINE_RES_IRQ_NAMED(MX23_INT_GPMI_DMA,
+                                       GPMI_NAND_DMA_INTERRUPT_RES_NAME),
+       },
+};
+#endif
+
+#ifdef CONFIG_SOC_IMX28
+const struct mxs_gpmi_nand_data mx28_gpmi_nand_data __initconst = {
+       .devid = "imx28-gpmi-nand",
+       .res = {
+               /* GPMI */
+               DEFINE_RES_MEM_NAMED(MX28_GPMI_BASE_ADDR, SZ_8K,
+                                       GPMI_NAND_GPMI_REGS_ADDR_RES_NAME),
+               DEFINE_RES_IRQ_NAMED(MX28_INT_GPMI,
+                                       GPMI_NAND_GPMI_INTERRUPT_RES_NAME),
+               /* BCH */
+               DEFINE_RES_MEM_NAMED(MX28_BCH_BASE_ADDR, SZ_8K,
+                                       GPMI_NAND_BCH_REGS_ADDR_RES_NAME),
+               DEFINE_RES_IRQ_NAMED(MX28_INT_BCH,
+                                       GPMI_NAND_BCH_INTERRUPT_RES_NAME),
+               /* DMA */
+               DEFINE_RES_NAMED(MX28_DMA_GPMI0,
+                                       MX28_DMA_GPMI7 - MX28_DMA_GPMI0 + 1,
+                                       GPMI_NAND_DMA_CHANNELS_RES_NAME,
+                                       IORESOURCE_DMA),
+               DEFINE_RES_IRQ_NAMED(MX28_INT_GPMI_DMA,
+                                       GPMI_NAND_DMA_INTERRUPT_RES_NAME),
+       },
+};
+#endif
+
+struct platform_device *__init
+mxs_add_gpmi_nand(const struct gpmi_nand_platform_data *pdata,
+               const struct mxs_gpmi_nand_data *data)
+{
+       return mxs_add_platform_device_dmamask(data->devid, -1,
+                               data->res, GPMI_NAND_RES_SIZE,
+                               pdata, sizeof(*pdata), DMA_BIT_MASK(32));
+}
index dc369c1239fc3eac5a1c7d27968a3bf5c27f3912..f2e383955d88576b66ecb55962f9956908b11759 100644 (file)
@@ -66,6 +66,16 @@ struct platform_device *__init mxs_add_flexcan(
                const struct mxs_flexcan_data *data,
                const struct flexcan_platform_data *pdata);
 
+/* gpmi-nand */
+#include <linux/mtd/gpmi-nand.h>
+struct mxs_gpmi_nand_data {
+       const char *devid;
+       const struct resource res[GPMI_NAND_RES_SIZE];
+};
+struct platform_device *__init
+mxs_add_gpmi_nand(const struct gpmi_nand_platform_data *pdata,
+               const struct mxs_gpmi_nand_data *data);
+
 /* i2c */
 struct mxs_mxs_i2c_data {
        int id;