#define imx21_add_imx_uart2(pdata)     imx21_add_imx_uart(2, pdata)
 #define imx21_add_imx_uart3(pdata)     imx21_add_imx_uart(3, pdata)
 
+extern const struct imx_mxc_nand_data imx21_mxc_nand_data __initconst;
 #define imx21_add_mxc_nand(pdata)      \
-       imx_add_mxc_nand_v1(MX21_NFC_BASE_ADDR, MX21_INT_NANDFC, pdata)
+       imx_add_mxc_nand(&imx21_mxc_nand_data, pdata)
 
 extern const struct imx_spi_imx_data imx21_cspi_data[] __initconst;
 #define imx21_add_cspi(id, pdata)      \
 
 #define imx27_add_imx_uart4(pdata)     imx27_add_imx_uart(4, pdata)
 #define imx27_add_imx_uart5(pdata)     imx27_add_imx_uart(5, pdata)
 
+extern const struct imx_mxc_nand_data imx27_mxc_nand_data __initconst;
 #define imx27_add_mxc_nand(pdata)      \
-       imx_add_mxc_nand_v1(MX27_NFC_BASE_ADDR, MX27_INT_NANDFC, pdata)
+       imx_add_mxc_nand(&imx27_mxc_nand_data, pdata)
 
 extern const struct imx_spi_imx_data imx27_cspi_data[] __initconst;
 #define imx27_add_cspi(id, pdata)      \
 
 #define imx25_add_imx_uart3(pdata)     imx25_add_imx_uart(3, pdata)
 #define imx25_add_imx_uart4(pdata)     imx25_add_imx_uart(4, pdata)
 
+extern const struct imx_mxc_nand_data imx25_mxc_nand_data __initconst;
 #define imx25_add_mxc_nand(pdata)      \
-       imx_add_mxc_nand_v21(MX25_NFC_BASE_ADDR, MX25_INT_NANDFC, pdata)
+       imx_add_mxc_nand(&imx25_mxc_nand_data, pdata)
 
 extern const struct imx_spi_imx_data imx25_spi_imx_data[] __initconst;
 #define imx25_add_spi_imx(id, pdata)   \
 
 #define imx31_add_imx_uart3(pdata)     imx31_add_imx_uart(3, pdata)
 #define imx31_add_imx_uart4(pdata)     imx31_add_imx_uart(4, pdata)
 
+extern const struct imx_mxc_nand_data imx31_mxc_nand_data __initconst;
 #define imx31_add_mxc_nand(pdata)      \
-       imx_add_mxc_nand_v1(MX31_NFC_BASE_ADDR, MX31_INT_NANDFC, pdata)
+       imx_add_mxc_nand(&imx31_mxc_nand_data, pdata)
 
 extern const struct imx_spi_imx_data imx31_cspi_data[] __initconst;
 #define imx31_add_cspi(id, pdata)      \
 
 #define imx35_add_imx_uart1(pdata)     imx35_add_imx_uart(1, pdata)
 #define imx35_add_imx_uart2(pdata)     imx35_add_imx_uart(2, pdata)
 
+extern const struct imx_mxc_nand_data imx35_mxc_nand_data __initconst;
 #define imx35_add_mxc_nand(pdata)      \
-       imx_add_mxc_nand_v21(MX35_NFC_BASE_ADDR, MX35_INT_NANDFC, pdata)
+       imx_add_mxc_nand(&imx35_mxc_nand_data, pdata)
 
 extern const struct imx_spi_imx_data imx35_cspi_data[] __initconst;
 #define imx35_add_cspi(id, pdata)      \
 
  * Free Software Foundation.
  */
 #include <asm/sizes.h>
+#include <mach/hardware.h>
 #include <mach/devices-common.h>
 
-static struct platform_device *__init imx_add_mxc_nand(resource_size_t iobase,
-               int irq, const struct mxc_nand_platform_data *pdata,
-               resource_size_t iosize)
+#define imx_mxc_nand_data_entry_single(soc, _size)                     \
+       {                                                               \
+               .iobase = soc ## _NFC_BASE_ADDR,                        \
+               .iosize = _size,                                        \
+               .irq = soc ## _INT_NFC                                  \
+       }
+
+#ifdef CONFIG_SOC_IMX21
+const struct imx_mxc_nand_data imx21_mxc_nand_data __initconst =
+       imx_mxc_nand_data_entry_single(MX21, SZ_4K);
+#endif /* ifdef CONFIG_SOC_IMX21 */
+
+#ifdef CONFIG_ARCH_MX25
+const struct imx_mxc_nand_data imx25_mxc_nand_data __initconst =
+       imx_mxc_nand_data_entry_single(MX25, SZ_8K);
+#endif /* ifdef CONFIG_ARCH_MX25 */
+
+#ifdef CONFIG_SOC_IMX27
+const struct imx_mxc_nand_data imx27_mxc_nand_data __initconst =
+       imx_mxc_nand_data_entry_single(MX27, SZ_4K);
+#endif /* ifdef CONFIG_SOC_IMX27 */
+
+#ifdef CONFIG_ARCH_MX31
+const struct imx_mxc_nand_data imx31_mxc_nand_data __initconst =
+       imx_mxc_nand_data_entry_single(MX31, SZ_4K);
+#endif
+
+#ifdef CONFIG_ARCH_MX35
+const struct imx_mxc_nand_data imx35_mxc_nand_data __initconst =
+       imx_mxc_nand_data_entry_single(MX35, SZ_8K);
+#endif
+
+struct platform_device *__init imx_add_mxc_nand(
+               const struct imx_mxc_nand_data *data,
+               const struct mxc_nand_platform_data *pdata)
 {
-       static int id = 0;
-       
        struct resource res[] = {
                {
-                       .start = iobase,
-                       .end = iobase + iosize - 1,
+                       .start = data->iobase,
+                       .end = data->iobase + data->iosize - 1,
                        .flags = IORESOURCE_MEM,
                }, {
-                       .start = irq,
-                       .end = irq,
+                       .start = data->irq,
+                       .end = data->irq,
                        .flags = IORESOURCE_IRQ,
                },
        };
-
-       return imx_add_platform_device("mxc_nand", id++, res, ARRAY_SIZE(res),
+       return imx_add_platform_device("mxc_nand", 0, res, ARRAY_SIZE(res),
                        pdata, sizeof(*pdata));
 }
-
-struct platform_device *__init imx_add_mxc_nand_v1(resource_size_t iobase,
-               int irq, const struct mxc_nand_platform_data *pdata)
-{
-       return imx_add_mxc_nand(iobase, irq, pdata, SZ_4K);
-}
-
-struct platform_device *__init imx_add_mxc_nand_v21(resource_size_t iobase,
-               int irq, const struct mxc_nand_platform_data *pdata)
-{
-       return imx_add_mxc_nand(iobase, irq, pdata, SZ_8K);
-}
 
                const struct imxuart_platform_data *pdata);
 
 #include <mach/mxc_nand.h>
-struct platform_device *__init imx_add_mxc_nand_v1(resource_size_t iobase,
-               int irq, const struct mxc_nand_platform_data *pdata);
-struct platform_device *__init imx_add_mxc_nand_v21(resource_size_t iobase,
-               int irq, const struct mxc_nand_platform_data *pdata);
+struct imx_mxc_nand_data {
+       resource_size_t iobase;
+       resource_size_t iosize;
+       resource_size_t irq;
+};
+struct platform_device *__init imx_add_mxc_nand(
+               const struct imx_mxc_nand_data *data,
+               const struct mxc_nand_platform_data *pdata);
 
 #include <mach/spi.h>
 struct imx_spi_imx_data {
 
 #define MX21_INT_GPT1          26
 #define MX21_INT_WDOG          27
 #define MX21_INT_PCMCIA                28
-#define MX21_INT_NANDFC                29
+#define MX21_INT_NFC           29
 #define MX21_INT_BMI           30
 #define MX21_INT_CSI           31
 #define MX21_INT_DMACH0                32
 
 #define MX25_INT_KPP           24
 #define MX25_INT_DRYICE                25
 #define MX25_INT_UART2         32
-#define MX25_INT_NANDFC                33
+#define MX25_INT_NFC           33
 #define MX25_INT_LCDC          39
 #define MX25_INT_UART5         40
 #define MX25_INT_CAN1          43
 
 #define MX27_INT_GPT1          26
 #define MX27_INT_WDOG          27
 #define MX27_INT_PCMCIA                28
-#define MX27_INT_NANDFC                29
+#define MX27_INT_NFC           29
 #define MX27_INT_ATA           30
 #define MX27_INT_CSI           31
 #define MX27_INT_DMACH0                32
 
 #define MX31_INT_POWER_FAIL    30
 #define MX31_INT_CCM_DVFS      31
 #define MX31_INT_UART2         32
-#define MX31_INT_NANDFC                33
+#define MX31_INT_NFC           33
 #define MX31_INT_SDMA          34
 #define MX31_INT_USB1          35
 #define MX31_INT_USB2          36
 
 #define MX35_INT_GPT           29
 #define MX35_INT_POWER_FAIL    30
 #define MX35_INT_UART2         32
-#define MX35_INT_NANDFC                33
+#define MX35_INT_NFC           33
 #define MX35_INT_SDMA          34
 #define MX35_INT_USBHS         35
 #define MX35_INT_USBOTG                37