166384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König/*
266384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König * Copyright (C) 2009-2010 Pengutronix
366384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
466384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König *
566384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König * This program is free software; you can redistribute it and/or modify it under
666384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König * the terms of the GNU General Public License version 2 as published by the
766384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König * Free Software Foundation.
866384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König */
966384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König#include <asm/sizes.h>
1000b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König#include <mach/hardware.h>
1166384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König#include <mach/devices-common.h>
1266384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König
1300b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König#define imx_mxc_nand_data_entry_single(soc, _size)			\
1400b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König	{								\
1500b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König		.iobase = soc ## _NFC_BASE_ADDR,			\
1600b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König		.iosize = _size,					\
1700b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König		.irq = soc ## _INT_NFC					\
1800b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König	}
1900b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König
2063a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer#define imx_mxc_nandv3_data_entry_single(soc, _size)			\
2163a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer	{								\
2263a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer		.id = -1,						\
2363a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer		.iobase = soc ## _NFC_BASE_ADDR,			\
2463a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer		.iosize = _size,					\
2563a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer		.axibase = soc ## _NFC_AXI_BASE_ADDR,			\
2663a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer		.irq = soc ## _INT_NFC					\
2763a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer	}
2863a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer
2900b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König#ifdef CONFIG_SOC_IMX21
3000b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-Königconst struct imx_mxc_nand_data imx21_mxc_nand_data __initconst =
3100b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König	imx_mxc_nand_data_entry_single(MX21, SZ_4K);
3200b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König#endif /* ifdef CONFIG_SOC_IMX21 */
3300b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König
34972cc48207450ce6aeed416ac176fe4d0482a4a3Uwe Kleine-König#ifdef CONFIG_SOC_IMX25
3500b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-Königconst struct imx_mxc_nand_data imx25_mxc_nand_data __initconst =
3600b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König	imx_mxc_nand_data_entry_single(MX25, SZ_8K);
37972cc48207450ce6aeed416ac176fe4d0482a4a3Uwe Kleine-König#endif /* ifdef CONFIG_SOC_IMX25 */
3800b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König
3900b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König#ifdef CONFIG_SOC_IMX27
4000b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-Königconst struct imx_mxc_nand_data imx27_mxc_nand_data __initconst =
4100b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König	imx_mxc_nand_data_entry_single(MX27, SZ_4K);
4200b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König#endif /* ifdef CONFIG_SOC_IMX27 */
4300b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König
44a528bc87841d958bbd394abc9266aee9cdf45cb8Uwe Kleine-König#ifdef CONFIG_SOC_IMX31
4500b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-Königconst struct imx_mxc_nand_data imx31_mxc_nand_data __initconst =
4600b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König	imx_mxc_nand_data_entry_single(MX31, SZ_4K);
4700b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König#endif
4800b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König
49a528bc87841d958bbd394abc9266aee9cdf45cb8Uwe Kleine-König#ifdef CONFIG_SOC_IMX35
5000b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-Königconst struct imx_mxc_nand_data imx35_mxc_nand_data __initconst =
5100b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König	imx_mxc_nand_data_entry_single(MX35, SZ_8K);
5200b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König#endif
5300b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König
54d94ed1287e11f91e4f4096838179984b0206be5eFabio Estevam#ifdef CONFIG_SOC_IMX51
5563a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauerconst struct imx_mxc_nand_data imx51_mxc_nand_data __initconst =
5663a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer	imx_mxc_nandv3_data_entry_single(MX51, SZ_16K);
5763a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer#endif
5863a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer
5900b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-Königstruct platform_device *__init imx_add_mxc_nand(
6000b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König		const struct imx_mxc_nand_data *data,
6100b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König		const struct mxc_nand_platform_data *pdata)
6266384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König{
6363a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer	/* AXI has to come first, that's how the mxc_nand driver expect it */
6466384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König	struct resource res[] = {
6566384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König		{
6663a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer			.start = data->axibase,
6763a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer			.end = data->axibase + SZ_16K - 1,
6863a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer			.flags = IORESOURCE_MEM,
6963a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer		}, {
7000b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König			.start = data->iobase,
7100b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König			.end = data->iobase + data->iosize - 1,
7266384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König			.flags = IORESOURCE_MEM,
7366384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König		}, {
7400b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König			.start = data->irq,
7500b57bf9786ca701508333112c8917d1e0860129Uwe Kleine-König			.end = data->irq,
7666384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König			.flags = IORESOURCE_IRQ,
7766384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König		},
7866384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König	};
7963a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer	return imx_add_platform_device("mxc_nand", data->id,
8063a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer			res + !data->axibase,
8163a7c6d7507ed6f4ea24a8ed008efa1bb22a2a97Sascha Hauer			ARRAY_SIZE(res) - !data->axibase,
8266384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König			pdata, sizeof(*pdata));
8366384eedd900f2f6bb00e4f16c2cb770d6b0066bUwe Kleine-König}
84