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_IMX27
38const struct imx_mxc_nand_data imx27_mxc_nand_data __initconst =
39	imx_mxc_nand_data_entry_single(MX27, "imx27-nand", SZ_4K);
40#endif /* ifdef CONFIG_SOC_IMX27 */
41
42#ifdef CONFIG_SOC_IMX31
43const struct imx_mxc_nand_data imx31_mxc_nand_data __initconst =
44	imx_mxc_nand_data_entry_single(MX31, "imx27-nand", SZ_4K);
45#endif
46
47#ifdef CONFIG_SOC_IMX35
48const struct imx_mxc_nand_data imx35_mxc_nand_data __initconst =
49	imx_mxc_nand_data_entry_single(MX35, "imx25-nand", SZ_8K);
50#endif
51
52struct platform_device *__init imx_add_mxc_nand(
53		const struct imx_mxc_nand_data *data,
54		const struct mxc_nand_platform_data *pdata)
55{
56	/* AXI has to come first, that's how the mxc_nand driver expect it */
57	struct resource res[] = {
58		{
59			.start = data->iobase,
60			.end = data->iobase + data->iosize - 1,
61			.flags = IORESOURCE_MEM,
62		}, {
63			.start = data->irq,
64			.end = data->irq,
65			.flags = IORESOURCE_IRQ,
66		}, {
67			.start = data->axibase,
68			.end = data->axibase + SZ_16K - 1,
69			.flags = IORESOURCE_MEM,
70		},
71	};
72	return imx_add_platform_device(data->devid, data->id,
73			res, ARRAY_SIZE(res) - !data->axibase,
74			pdata, sizeof(*pdata));
75}
76