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 "../hardware.h"
10#include "devices-common.h"
11
12#define imx_imx_i2c_data_entry_single(soc, _devid, _id, _hwid, _size)	\
13	{								\
14		.devid = _devid,					\
15		.id = _id,						\
16		.iobase = soc ## _I2C ## _hwid ## _BASE_ADDR,		\
17		.iosize = _size,					\
18		.irq = soc ## _INT_I2C ## _hwid,			\
19	}
20
21#define imx_imx_i2c_data_entry(soc, _devid, _id, _hwid, _size)		\
22	[_id] = imx_imx_i2c_data_entry_single(soc, _devid, _id, _hwid, _size)
23
24#ifdef CONFIG_SOC_IMX1
25const struct imx_imx_i2c_data imx1_imx_i2c_data __initconst =
26	imx_imx_i2c_data_entry_single(MX1, "imx1-i2c", 0, , SZ_4K);
27#endif /* ifdef CONFIG_SOC_IMX1 */
28
29#ifdef CONFIG_SOC_IMX21
30const struct imx_imx_i2c_data imx21_imx_i2c_data __initconst =
31	imx_imx_i2c_data_entry_single(MX21, "imx21-i2c", 0, , SZ_4K);
32#endif /* ifdef CONFIG_SOC_IMX21 */
33
34#ifdef CONFIG_SOC_IMX27
35const struct imx_imx_i2c_data imx27_imx_i2c_data[] __initconst = {
36#define imx27_imx_i2c_data_entry(_id, _hwid)				\
37	imx_imx_i2c_data_entry(MX27, "imx21-i2c", _id, _hwid, SZ_4K)
38	imx27_imx_i2c_data_entry(0, 1),
39	imx27_imx_i2c_data_entry(1, 2),
40};
41#endif /* ifdef CONFIG_SOC_IMX27 */
42
43#ifdef CONFIG_SOC_IMX31
44const struct imx_imx_i2c_data imx31_imx_i2c_data[] __initconst = {
45#define imx31_imx_i2c_data_entry(_id, _hwid)				\
46	imx_imx_i2c_data_entry(MX31, "imx21-i2c", _id, _hwid, SZ_4K)
47	imx31_imx_i2c_data_entry(0, 1),
48	imx31_imx_i2c_data_entry(1, 2),
49	imx31_imx_i2c_data_entry(2, 3),
50};
51#endif /* ifdef CONFIG_SOC_IMX31 */
52
53#ifdef CONFIG_SOC_IMX35
54const struct imx_imx_i2c_data imx35_imx_i2c_data[] __initconst = {
55#define imx35_imx_i2c_data_entry(_id, _hwid)				\
56	imx_imx_i2c_data_entry(MX35, "imx21-i2c", _id, _hwid, SZ_4K)
57	imx35_imx_i2c_data_entry(0, 1),
58	imx35_imx_i2c_data_entry(1, 2),
59	imx35_imx_i2c_data_entry(2, 3),
60};
61#endif /* ifdef CONFIG_SOC_IMX35 */
62
63struct platform_device *__init imx_add_imx_i2c(
64		const struct imx_imx_i2c_data *data,
65		const struct imxi2c_platform_data *pdata)
66{
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	};
78
79	return imx_add_platform_device(data->devid, data->id,
80			res, ARRAY_SIZE(res),
81			pdata, sizeof(*pdata));
82}
83