1/*
2 * Copyright (C) 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 <linux/dma-mapping.h>
10
11#include "../hardware.h"
12#include "devices-common.h"
13
14#define imx_mxc_mmc_data_entry_single(soc, _devid, _id, _hwid, _size)	\
15	{								\
16		.devid = _devid,					\
17		.id = _id,						\
18		.iobase = soc ## _SDHC ## _hwid ## _BASE_ADDR,		\
19		.iosize = _size,					\
20		.irq = soc ## _INT_SDHC ## _hwid,			\
21		.dmareq = soc ## _DMA_REQ_SDHC ## _hwid,		\
22	}
23#define imx_mxc_mmc_data_entry(soc, _devid, _id, _hwid, _size)		\
24	[_id] = imx_mxc_mmc_data_entry_single(soc, _devid, _id, _hwid, _size)
25
26#ifdef CONFIG_SOC_IMX21
27const struct imx_mxc_mmc_data imx21_mxc_mmc_data[] __initconst = {
28#define imx21_mxc_mmc_data_entry(_id, _hwid)				\
29	imx_mxc_mmc_data_entry(MX21, "imx21-mmc", _id, _hwid, SZ_4K)
30	imx21_mxc_mmc_data_entry(0, 1),
31	imx21_mxc_mmc_data_entry(1, 2),
32};
33#endif /* ifdef CONFIG_SOC_IMX21 */
34
35#ifdef CONFIG_SOC_IMX27
36const struct imx_mxc_mmc_data imx27_mxc_mmc_data[] __initconst = {
37#define imx27_mxc_mmc_data_entry(_id, _hwid)				\
38	imx_mxc_mmc_data_entry(MX27, "imx21-mmc", _id, _hwid, SZ_4K)
39	imx27_mxc_mmc_data_entry(0, 1),
40	imx27_mxc_mmc_data_entry(1, 2),
41};
42#endif /* ifdef CONFIG_SOC_IMX27 */
43
44#ifdef CONFIG_SOC_IMX31
45const struct imx_mxc_mmc_data imx31_mxc_mmc_data[] __initconst = {
46#define imx31_mxc_mmc_data_entry(_id, _hwid)				\
47	imx_mxc_mmc_data_entry(MX31, "imx31-mmc", _id, _hwid, SZ_16K)
48	imx31_mxc_mmc_data_entry(0, 1),
49	imx31_mxc_mmc_data_entry(1, 2),
50};
51#endif /* ifdef CONFIG_SOC_IMX31 */
52
53struct platform_device *__init imx_add_mxc_mmc(
54		const struct imx_mxc_mmc_data *data,
55		const struct imxmmc_platform_data *pdata)
56{
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->dmareq,
68			.end = data->dmareq,
69			.flags = IORESOURCE_DMA,
70		},
71	};
72	return imx_add_platform_device_dmamask(data->devid, data->id,
73			res, ARRAY_SIZE(res),
74			pdata, sizeof(*pdata), DMA_BIT_MASK(32));
75}
76