linux/arch/arm/mach-imx/devices/platform-mxc_nand.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2009-2010 Pengutronix
   3 * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
   4 *
   5 * This program is free software; you can redistribute it and/or modify it under
   6 * the terms of the GNU General Public License version 2 as published by the
   7 * Free Software Foundation.
   8 */
   9#include <asm/sizes.h>
  10
  11#include "../hardware.h"
  12#include "devices-common.h"
  13
  14#define imx_mxc_nand_data_entry_single(soc, _devid, _size)              \
  15        {                                                               \
  16                .devid = _devid,                                        \
  17                .iobase = soc ## _NFC_BASE_ADDR,                        \
  18                .iosize = _size,                                        \
  19                .irq = soc ## _INT_NFC                                  \
  20        }
  21
  22#define imx_mxc_nandv3_data_entry_single(soc, _devid, _size)            \
  23        {                                                               \
  24                .devid = _devid,                                        \
  25                .id = -1,                                               \
  26                .iobase = soc ## _NFC_BASE_ADDR,                        \
  27                .iosize = _size,                                        \
  28                .axibase = soc ## _NFC_AXI_BASE_ADDR,                   \
  29                .irq = soc ## _INT_NFC                                  \
  30        }
  31
  32#ifdef CONFIG_SOC_IMX21
  33const struct imx_mxc_nand_data imx21_mxc_nand_data __initconst =
  34        imx_mxc_nand_data_entry_single(MX21, "imx21-nand", SZ_4K);
  35#endif /* ifdef CONFIG_SOC_IMX21 */
  36
  37#ifdef CONFIG_SOC_IMX25
  38const struct imx_mxc_nand_data imx25_mxc_nand_data __initconst =
  39        imx_mxc_nand_data_entry_single(MX25, "imx25-nand", SZ_8K);
  40#endif /* ifdef CONFIG_SOC_IMX25 */
  41
  42#ifdef CONFIG_SOC_IMX27
  43const struct imx_mxc_nand_data imx27_mxc_nand_data __initconst =
  44        imx_mxc_nand_data_entry_single(MX27, "imx27-nand", SZ_4K);
  45#endif /* ifdef CONFIG_SOC_IMX27 */
  46
  47#ifdef CONFIG_SOC_IMX31
  48const struct imx_mxc_nand_data imx31_mxc_nand_data __initconst =
  49        imx_mxc_nand_data_entry_single(MX31, "imx27-nand", SZ_4K);
  50#endif
  51
  52#ifdef CONFIG_SOC_IMX35
  53const struct imx_mxc_nand_data imx35_mxc_nand_data __initconst =
  54        imx_mxc_nand_data_entry_single(MX35, "imx25-nand", SZ_8K);
  55#endif
  56
  57#ifdef CONFIG_SOC_IMX51
  58const struct imx_mxc_nand_data imx51_mxc_nand_data __initconst =
  59        imx_mxc_nandv3_data_entry_single(MX51, "imx51-nand", SZ_16K);
  60#endif
  61
  62struct platform_device *__init imx_add_mxc_nand(
  63                const struct imx_mxc_nand_data *data,
  64                const struct mxc_nand_platform_data *pdata)
  65{
  66        /* AXI has to come first, that's how the mxc_nand driver expect it */
  67        struct resource res[] = {
  68                {
  69                        .start = data->iobase,
  70                        .end = data->iobase + data->iosize - 1,
  71                        .flags = IORESOURCE_MEM,
  72                }, {
  73                        .start = data->irq,
  74                        .end = data->irq,
  75                        .flags = IORESOURCE_IRQ,
  76                }, {
  77                        .start = data->axibase,
  78                        .end = data->axibase + SZ_16K - 1,
  79                        .flags = IORESOURCE_MEM,
  80                },
  81        };
  82        return imx_add_platform_device(data->devid, data->id,
  83                        res, ARRAY_SIZE(res) - !data->axibase,
  84                        pdata, sizeof(*pdata));
  85}
  86