diff options
author | Tony Lindgren <tony@atomide.com> | 2012-10-08 12:11:22 -0400 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2012-10-17 14:36:50 -0400 |
commit | 3a8761c0272c961c707e5af2eb0179adf3ef7e14 (patch) | |
tree | 101b61bd1bc57de37c52587ecaff1da4e84d7742 | |
parent | 8599e7c58786e3aef0bdb0fa093fd5150ae8a9bc (diff) |
ARM: OMAP: Split plat-omap/i2c.c into mach-omap1 and mach-omap2
There's no need to keep the device related things in the
common i2c.c as omap2+ is using hwmod. Split the code to
mach-omap1 and mach-omap2 parts and only leave common
code to plat-omap/i2c.c.
Note that as omap1 only has one i2c controller, we can
now remove the old device related macros.
Reviewed-by: Shubhrajyoti D <shubhrajyoti@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
-rw-r--r-- | arch/arm/mach-omap1/common.h | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap1/i2c.c | 59 | ||||
-rw-r--r-- | arch/arm/mach-omap2/board-rm680.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap2/common.h | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/i2c.c | 50 | ||||
-rw-r--r-- | arch/arm/mach-omap2/i2c.h (renamed from arch/arm/plat-omap/include/plat/i2c.h) | 25 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2420_data.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2430_data.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_33xx_data.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap2/twl-common.c | 1 | ||||
-rw-r--r-- | arch/arm/plat-omap/i2c.c | 133 | ||||
-rw-r--r-- | arch/arm/plat-omap/i2c.h | 47 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/common.h | 1 |
15 files changed, 182 insertions, 163 deletions
diff --git a/arch/arm/mach-omap1/common.h b/arch/arm/mach-omap1/common.h index a65f50aeda6b..c96c1320b001 100644 --- a/arch/arm/mach-omap1/common.h +++ b/arch/arm/mach-omap1/common.h | |||
@@ -28,6 +28,9 @@ | |||
28 | 28 | ||
29 | #include <plat/common.h> | 29 | #include <plat/common.h> |
30 | #include <linux/mtd/mtd.h> | 30 | #include <linux/mtd/mtd.h> |
31 | #include <linux/i2c-omap.h> | ||
32 | |||
33 | #include "../plat-omap/i2c.h" | ||
31 | 34 | ||
32 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | 35 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) |
33 | void omap7xx_map_io(void); | 36 | void omap7xx_map_io(void); |
diff --git a/arch/arm/mach-omap1/i2c.c b/arch/arm/mach-omap1/i2c.c index a0551a6d7451..a6f465a44642 100644 --- a/arch/arm/mach-omap1/i2c.c +++ b/arch/arm/mach-omap1/i2c.c | |||
@@ -19,11 +19,25 @@ | |||
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <plat/i2c.h> | 22 | #include <linux/i2c-omap.h> |
23 | #include <mach/mux.h> | 23 | #include <mach/mux.h> |
24 | #include <plat/cpu.h> | 24 | #include <plat/cpu.h> |
25 | 25 | ||
26 | void __init omap1_i2c_mux_pins(int bus_id) | 26 | #include "../plat-omap/i2c.h" |
27 | |||
28 | #define OMAP_I2C_SIZE 0x3f | ||
29 | #define OMAP1_I2C_BASE 0xfffb3800 | ||
30 | #define OMAP1_INT_I2C (32 + 4) | ||
31 | |||
32 | static const char name[] = "omap_i2c"; | ||
33 | |||
34 | static struct resource i2c_resources[2] = { | ||
35 | }; | ||
36 | |||
37 | static struct platform_device omap_i2c_devices[1] = { | ||
38 | }; | ||
39 | |||
40 | static void __init omap1_i2c_mux_pins(int bus_id) | ||
27 | { | 41 | { |
28 | if (cpu_is_omap7xx()) { | 42 | if (cpu_is_omap7xx()) { |
29 | omap_cfg_reg(I2C_7XX_SDA); | 43 | omap_cfg_reg(I2C_7XX_SDA); |
@@ -33,3 +47,44 @@ void __init omap1_i2c_mux_pins(int bus_id) | |||
33 | omap_cfg_reg(I2C_SCL); | 47 | omap_cfg_reg(I2C_SCL); |
34 | } | 48 | } |
35 | } | 49 | } |
50 | |||
51 | int __init omap_i2c_add_bus(struct omap_i2c_bus_platform_data *pdata, | ||
52 | int bus_id) | ||
53 | { | ||
54 | struct platform_device *pdev; | ||
55 | struct resource *res; | ||
56 | |||
57 | omap1_i2c_mux_pins(bus_id); | ||
58 | |||
59 | pdev = &omap_i2c_devices[bus_id - 1]; | ||
60 | pdev->id = bus_id; | ||
61 | pdev->name = name; | ||
62 | pdev->num_resources = ARRAY_SIZE(i2c_resources); | ||
63 | res = i2c_resources; | ||
64 | res[0].start = OMAP1_I2C_BASE; | ||
65 | res[0].end = res[0].start + OMAP_I2C_SIZE; | ||
66 | res[0].flags = IORESOURCE_MEM; | ||
67 | res[1].start = OMAP1_INT_I2C; | ||
68 | res[1].flags = IORESOURCE_IRQ; | ||
69 | pdev->resource = res; | ||
70 | |||
71 | /* all OMAP1 have IP version 1 register set */ | ||
72 | pdata->rev = OMAP_I2C_IP_VERSION_1; | ||
73 | |||
74 | /* all OMAP1 I2C are implemented like this */ | ||
75 | pdata->flags = OMAP_I2C_FLAG_NO_FIFO | | ||
76 | OMAP_I2C_FLAG_SIMPLE_CLOCK | | ||
77 | OMAP_I2C_FLAG_16BIT_DATA_REG | | ||
78 | OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK; | ||
79 | |||
80 | /* how the cpu bus is wired up differs for 7xx only */ | ||
81 | |||
82 | if (cpu_is_omap7xx()) | ||
83 | pdata->flags |= OMAP_I2C_FLAG_BUS_SHIFT_1; | ||
84 | else | ||
85 | pdata->flags |= OMAP_I2C_FLAG_BUS_SHIFT_2; | ||
86 | |||
87 | pdev->dev.platform_data = pdata; | ||
88 | |||
89 | return platform_device_register(pdev); | ||
90 | } | ||
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index 208a7a239db5..d42ecfe56096 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
23 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
24 | 24 | ||
25 | #include <plat/i2c.h> | ||
26 | #include <plat/usb.h> | 25 | #include <plat/usb.h> |
27 | #include "gpmc.h" | 26 | #include "gpmc.h" |
28 | #include "common.h" | 27 | #include "common.h" |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 7045e4d61ac3..a68b421b3f86 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
@@ -28,7 +28,9 @@ | |||
28 | 28 | ||
29 | #include <linux/irq.h> | 29 | #include <linux/irq.h> |
30 | #include <linux/delay.h> | 30 | #include <linux/delay.h> |
31 | #include <linux/i2c.h> | ||
31 | #include <linux/i2c/twl.h> | 32 | #include <linux/i2c/twl.h> |
33 | #include <linux/i2c-omap.h> | ||
32 | 34 | ||
33 | #include <asm/proc-fns.h> | 35 | #include <asm/proc-fns.h> |
34 | 36 | ||
@@ -36,6 +38,8 @@ | |||
36 | #include <plat/serial.h> | 38 | #include <plat/serial.h> |
37 | #include <plat/common.h> | 39 | #include <plat/common.h> |
38 | 40 | ||
41 | #include "i2c.h" | ||
42 | |||
39 | #define OMAP_INTC_START NR_IRQS | 43 | #define OMAP_INTC_START NR_IRQS |
40 | 44 | ||
41 | #ifdef CONFIG_SOC_OMAP2420 | 45 | #ifdef CONFIG_SOC_OMAP2420 |
diff --git a/arch/arm/mach-omap2/i2c.c b/arch/arm/mach-omap2/i2c.c index fc57e67b321f..9f12f63ec54d 100644 --- a/arch/arm/mach-omap2/i2c.c +++ b/arch/arm/mach-omap2/i2c.c | |||
@@ -19,11 +19,12 @@ | |||
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <plat/i2c.h> | ||
23 | #include "common.h" | 22 | #include "common.h" |
24 | #include <plat/omap_hwmod.h> | 23 | #include <plat/omap_hwmod.h> |
24 | #include <plat/omap_device.h> | ||
25 | 25 | ||
26 | #include "mux.h" | 26 | #include "mux.h" |
27 | #include "i2c.h" | ||
27 | 28 | ||
28 | /* In register I2C_CON, Bit 15 is the I2C enable bit */ | 29 | /* In register I2C_CON, Bit 15 is the I2C enable bit */ |
29 | #define I2C_EN BIT(15) | 30 | #define I2C_EN BIT(15) |
@@ -33,7 +34,9 @@ | |||
33 | /* Maximum microseconds to wait for OMAP module to softreset */ | 34 | /* Maximum microseconds to wait for OMAP module to softreset */ |
34 | #define MAX_MODULE_SOFTRESET_WAIT 10000 | 35 | #define MAX_MODULE_SOFTRESET_WAIT 10000 |
35 | 36 | ||
36 | void __init omap2_i2c_mux_pins(int bus_id) | 37 | #define MAX_OMAP_I2C_HWMOD_NAME_LEN 16 |
38 | |||
39 | static void __init omap2_i2c_mux_pins(int bus_id) | ||
37 | { | 40 | { |
38 | char mux_name[sizeof("i2c2_scl.i2c2_scl")]; | 41 | char mux_name[sizeof("i2c2_scl.i2c2_scl")]; |
39 | 42 | ||
@@ -104,3 +107,46 @@ int omap_i2c_reset(struct omap_hwmod *oh) | |||
104 | 107 | ||
105 | return 0; | 108 | return 0; |
106 | } | 109 | } |
110 | |||
111 | static const char name[] = "omap_i2c"; | ||
112 | |||
113 | int __init omap_i2c_add_bus(struct omap_i2c_bus_platform_data *i2c_pdata, | ||
114 | int bus_id) | ||
115 | { | ||
116 | int l; | ||
117 | struct omap_hwmod *oh; | ||
118 | struct platform_device *pdev; | ||
119 | char oh_name[MAX_OMAP_I2C_HWMOD_NAME_LEN]; | ||
120 | struct omap_i2c_bus_platform_data *pdata; | ||
121 | struct omap_i2c_dev_attr *dev_attr; | ||
122 | |||
123 | omap2_i2c_mux_pins(bus_id); | ||
124 | |||
125 | l = snprintf(oh_name, MAX_OMAP_I2C_HWMOD_NAME_LEN, "i2c%d", bus_id); | ||
126 | WARN(l >= MAX_OMAP_I2C_HWMOD_NAME_LEN, | ||
127 | "String buffer overflow in I2C%d device setup\n", bus_id); | ||
128 | oh = omap_hwmod_lookup(oh_name); | ||
129 | if (!oh) { | ||
130 | pr_err("Could not look up %s\n", oh_name); | ||
131 | return -EEXIST; | ||
132 | } | ||
133 | |||
134 | pdata = i2c_pdata; | ||
135 | /* | ||
136 | * pass the hwmod class's CPU-specific knowledge of I2C IP revision in | ||
137 | * use, and functionality implementation flags, up to the OMAP I2C | ||
138 | * driver via platform data | ||
139 | */ | ||
140 | pdata->rev = oh->class->rev; | ||
141 | |||
142 | dev_attr = (struct omap_i2c_dev_attr *)oh->dev_attr; | ||
143 | pdata->flags = dev_attr->flags; | ||
144 | |||
145 | pdev = omap_device_build(name, bus_id, oh, pdata, | ||
146 | sizeof(struct omap_i2c_bus_platform_data), | ||
147 | NULL, 0, 0); | ||
148 | WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", name); | ||
149 | |||
150 | return PTR_RET(pdev); | ||
151 | } | ||
152 | |||
diff --git a/arch/arm/plat-omap/include/plat/i2c.h b/arch/arm/mach-omap2/i2c.h index 7c22b9e10dc3..81dbb992a6bc 100644 --- a/arch/arm/plat-omap/include/plat/i2c.h +++ b/arch/arm/mach-omap2/i2c.h | |||
@@ -18,24 +18,11 @@ | |||
18 | * 02110-1301 USA | 18 | * 02110-1301 USA |
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | #ifndef __ASM__ARCH_OMAP_I2C_H | ||
22 | #define __ASM__ARCH_OMAP_I2C_H | ||
23 | 21 | ||
24 | #include <linux/i2c.h> | 22 | #include "../plat-omap/i2c.h" |
25 | #include <linux/i2c-omap.h> | ||
26 | 23 | ||
27 | #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) | 24 | #ifndef __MACH_OMAP2_I2C_H |
28 | extern int omap_register_i2c_bus(int bus_id, u32 clkrate, | 25 | #define __MACH_OMAP2_I2C_H |
29 | struct i2c_board_info const *info, | ||
30 | unsigned len); | ||
31 | #else | ||
32 | static inline int omap_register_i2c_bus(int bus_id, u32 clkrate, | ||
33 | struct i2c_board_info const *info, | ||
34 | unsigned len) | ||
35 | { | ||
36 | return 0; | ||
37 | } | ||
38 | #endif | ||
39 | 26 | ||
40 | /** | 27 | /** |
41 | * i2c_dev_attr - OMAP I2C controller device attributes for omap_hwmod | 28 | * i2c_dev_attr - OMAP I2C controller device attributes for omap_hwmod |
@@ -50,10 +37,6 @@ struct omap_i2c_dev_attr { | |||
50 | u32 flags; | 37 | u32 flags; |
51 | }; | 38 | }; |
52 | 39 | ||
53 | void __init omap1_i2c_mux_pins(int bus_id); | ||
54 | void __init omap2_i2c_mux_pins(int bus_id); | ||
55 | |||
56 | struct omap_hwmod; | ||
57 | int omap_i2c_reset(struct omap_hwmod *oh); | 40 | int omap_i2c_reset(struct omap_hwmod *oh); |
58 | 41 | ||
59 | #endif /* __ASM__ARCH_OMAP_I2C_H */ | 42 | #endif /* __MACH_OMAP2_I2C_H */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index 80bbbee57649..95a0053b6ae1 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c | |||
@@ -12,12 +12,12 @@ | |||
12 | * XXX handle crossbar/shared link difference for L3? | 12 | * XXX handle crossbar/shared link difference for L3? |
13 | * XXX these should be marked initdata for multi-OMAP kernels | 13 | * XXX these should be marked initdata for multi-OMAP kernels |
14 | */ | 14 | */ |
15 | |||
16 | #include <linux/i2c-omap.h> | ||
15 | #include <linux/platform_data/spi-omap2-mcspi.h> | 17 | #include <linux/platform_data/spi-omap2-mcspi.h> |
16 | 18 | ||
17 | #include <plat/omap_hwmod.h> | 19 | #include <plat/omap_hwmod.h> |
18 | #include <plat-omap/dma-omap.h> | 20 | #include <plat-omap/dma-omap.h> |
19 | #include <plat/serial.h> | ||
20 | #include <plat/i2c.h> | ||
21 | #include <plat/dmtimer.h> | 21 | #include <plat/dmtimer.h> |
22 | #include "l3_2xxx.h" | 22 | #include "l3_2xxx.h" |
23 | #include "l4_2xxx.h" | 23 | #include "l4_2xxx.h" |
@@ -26,6 +26,7 @@ | |||
26 | 26 | ||
27 | #include "cm-regbits-24xx.h" | 27 | #include "cm-regbits-24xx.h" |
28 | #include "prm-regbits-24xx.h" | 28 | #include "prm-regbits-24xx.h" |
29 | #include "i2c.h" | ||
29 | #include "mmc.h" | 30 | #include "mmc.h" |
30 | #include "wd_timer.h" | 31 | #include "wd_timer.h" |
31 | 32 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index dff04f948a2f..a6c24aea28b6 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c | |||
@@ -12,13 +12,13 @@ | |||
12 | * XXX handle crossbar/shared link difference for L3? | 12 | * XXX handle crossbar/shared link difference for L3? |
13 | * XXX these should be marked initdata for multi-OMAP kernels | 13 | * XXX these should be marked initdata for multi-OMAP kernels |
14 | */ | 14 | */ |
15 | |||
16 | #include <linux/i2c-omap.h> | ||
15 | #include <linux/platform_data/asoc-ti-mcbsp.h> | 17 | #include <linux/platform_data/asoc-ti-mcbsp.h> |
16 | #include <linux/platform_data/spi-omap2-mcspi.h> | 18 | #include <linux/platform_data/spi-omap2-mcspi.h> |
17 | 19 | ||
18 | #include <plat/omap_hwmod.h> | 20 | #include <plat/omap_hwmod.h> |
19 | #include <plat-omap/dma-omap.h> | 21 | #include <plat-omap/dma-omap.h> |
20 | #include <plat/serial.h> | ||
21 | #include <plat/i2c.h> | ||
22 | #include <plat/dmtimer.h> | 22 | #include <plat/dmtimer.h> |
23 | #include "mmc.h" | 23 | #include "mmc.h" |
24 | #include "l3_2xxx.h" | 24 | #include "l3_2xxx.h" |
@@ -27,6 +27,7 @@ | |||
27 | #include "omap_hwmod_common_data.h" | 27 | #include "omap_hwmod_common_data.h" |
28 | #include "prm-regbits-24xx.h" | 28 | #include "prm-regbits-24xx.h" |
29 | #include "cm-regbits-24xx.h" | 29 | #include "cm-regbits-24xx.h" |
30 | #include "i2c.h" | ||
30 | #include "wd_timer.h" | 31 | #include "wd_timer.h" |
31 | 32 | ||
32 | /* | 33 | /* |
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index 44a661882a7e..cb7c393c08de 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c | |||
@@ -14,11 +14,12 @@ | |||
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include <linux/i2c-omap.h> | ||
18 | |||
17 | #include <plat/omap_hwmod.h> | 19 | #include <plat/omap_hwmod.h> |
18 | #include <plat/cpu.h> | 20 | #include <plat/cpu.h> |
19 | #include <linux/platform_data/gpio-omap.h> | 21 | #include <linux/platform_data/gpio-omap.h> |
20 | #include <linux/platform_data/spi-omap2-mcspi.h> | 22 | #include <linux/platform_data/spi-omap2-mcspi.h> |
21 | #include <plat/i2c.h> | ||
22 | 23 | ||
23 | #include "omap_hwmod_common_data.h" | 24 | #include "omap_hwmod_common_data.h" |
24 | 25 | ||
@@ -26,6 +27,7 @@ | |||
26 | #include "cm33xx.h" | 27 | #include "cm33xx.h" |
27 | #include "prm33xx.h" | 28 | #include "prm33xx.h" |
28 | #include "prm-regbits-33xx.h" | 29 | #include "prm-regbits-33xx.h" |
30 | #include "i2c.h" | ||
29 | #include "mmc.h" | 31 | #include "mmc.h" |
30 | 32 | ||
31 | /* | 33 | /* |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 2aaf3ce80626..14451217dac2 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -14,6 +14,8 @@ | |||
14 | * | 14 | * |
15 | * XXX these should be marked initdata for multi-OMAP kernels | 15 | * XXX these should be marked initdata for multi-OMAP kernels |
16 | */ | 16 | */ |
17 | |||
18 | #include <linux/i2c-omap.h> | ||
17 | #include <linux/power/smartreflex.h> | 19 | #include <linux/power/smartreflex.h> |
18 | #include <linux/platform_data/gpio-omap.h> | 20 | #include <linux/platform_data/gpio-omap.h> |
19 | 21 | ||
@@ -22,7 +24,6 @@ | |||
22 | #include <plat/serial.h> | 24 | #include <plat/serial.h> |
23 | #include "l3_3xxx.h" | 25 | #include "l3_3xxx.h" |
24 | #include "l4_3xxx.h" | 26 | #include "l4_3xxx.h" |
25 | #include <plat/i2c.h> | ||
26 | #include <linux/platform_data/asoc-ti-mcbsp.h> | 27 | #include <linux/platform_data/asoc-ti-mcbsp.h> |
27 | #include <linux/platform_data/spi-omap2-mcspi.h> | 28 | #include <linux/platform_data/spi-omap2-mcspi.h> |
28 | #include <plat/dmtimer.h> | 29 | #include <plat/dmtimer.h> |
@@ -36,6 +37,7 @@ | |||
36 | #include "cm-regbits-34xx.h" | 37 | #include "cm-regbits-34xx.h" |
37 | 38 | ||
38 | #include "dma.h" | 39 | #include "dma.h" |
40 | #include "i2c.h" | ||
39 | #include "mmc.h" | 41 | #include "mmc.h" |
40 | #include "wd_timer.h" | 42 | #include "wd_timer.h" |
41 | 43 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index f47a57fa1f3a..2c736cd2bea1 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -21,9 +21,9 @@ | |||
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/platform_data/gpio-omap.h> | 22 | #include <linux/platform_data/gpio-omap.h> |
23 | #include <linux/power/smartreflex.h> | 23 | #include <linux/power/smartreflex.h> |
24 | #include <linux/i2c-omap.h> | ||
24 | 25 | ||
25 | #include <plat/omap_hwmod.h> | 26 | #include <plat/omap_hwmod.h> |
26 | #include <plat/i2c.h> | ||
27 | #include <plat-omap/dma-omap.h> | 27 | #include <plat-omap/dma-omap.h> |
28 | #include <linux/platform_data/spi-omap2-mcspi.h> | 28 | #include <linux/platform_data/spi-omap2-mcspi.h> |
29 | #include <linux/platform_data/asoc-ti-mcbsp.h> | 29 | #include <linux/platform_data/asoc-ti-mcbsp.h> |
@@ -36,6 +36,7 @@ | |||
36 | #include "cm2_44xx.h" | 36 | #include "cm2_44xx.h" |
37 | #include "prm44xx.h" | 37 | #include "prm44xx.h" |
38 | #include "prm-regbits-44xx.h" | 38 | #include "prm-regbits-44xx.h" |
39 | #include "i2c.h" | ||
39 | #include "mmc.h" | 40 | #include "mmc.h" |
40 | #include "wd_timer.h" | 41 | #include "wd_timer.h" |
41 | 42 | ||
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 635e109f5ad3..1a0739d397f3 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/regulator/machine.h> | 26 | #include <linux/regulator/machine.h> |
27 | #include <linux/regulator/fixed.h> | 27 | #include <linux/regulator/fixed.h> |
28 | 28 | ||
29 | #include <plat/i2c.h> | ||
30 | #include <plat/usb.h> | 29 | #include <plat/usb.h> |
31 | 30 | ||
32 | #include "soc.h" | 31 | #include "soc.h" |
diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c index a5683a84c6ee..37597a6bbed2 100644 --- a/arch/arm/plat-omap/i2c.c +++ b/arch/arm/plat-omap/i2c.c | |||
@@ -26,52 +26,18 @@ | |||
26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
29 | #include <linux/i2c-omap.h> | ||
29 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
30 | #include <linux/err.h> | 31 | #include <linux/err.h> |
31 | #include <linux/clk.h> | 32 | #include <linux/clk.h> |
32 | 33 | ||
33 | #include <mach/irqs.h> | 34 | #include <mach/irqs.h> |
34 | #include <plat/i2c.h> | 35 | #include <plat/cpu.h> |
35 | #include <plat/omap_device.h> | ||
36 | 36 | ||
37 | #define OMAP_I2C_SIZE 0x3f | 37 | #include "i2c.h" |
38 | #define OMAP1_I2C_BASE 0xfffb3800 | ||
39 | #define OMAP1_INT_I2C (32 + 4) | ||
40 | 38 | ||
41 | static const char name[] = "omap_i2c"; | ||
42 | |||
43 | #define I2C_RESOURCE_BUILDER(base, irq) \ | ||
44 | { \ | ||
45 | .start = (base), \ | ||
46 | .end = (base) + OMAP_I2C_SIZE, \ | ||
47 | .flags = IORESOURCE_MEM, \ | ||
48 | }, \ | ||
49 | { \ | ||
50 | .start = (irq), \ | ||
51 | .flags = IORESOURCE_IRQ, \ | ||
52 | }, | ||
53 | |||
54 | static struct resource i2c_resources[][2] = { | ||
55 | { I2C_RESOURCE_BUILDER(0, 0) }, | ||
56 | }; | ||
57 | |||
58 | #define I2C_DEV_BUILDER(bus_id, res, data) \ | ||
59 | { \ | ||
60 | .id = (bus_id), \ | ||
61 | .name = name, \ | ||
62 | .num_resources = ARRAY_SIZE(res), \ | ||
63 | .resource = (res), \ | ||
64 | .dev = { \ | ||
65 | .platform_data = (data), \ | ||
66 | }, \ | ||
67 | } | ||
68 | |||
69 | #define MAX_OMAP_I2C_HWMOD_NAME_LEN 16 | ||
70 | #define OMAP_I2C_MAX_CONTROLLERS 4 | 39 | #define OMAP_I2C_MAX_CONTROLLERS 4 |
71 | static struct omap_i2c_bus_platform_data i2c_pdata[OMAP_I2C_MAX_CONTROLLERS]; | 40 | static struct omap_i2c_bus_platform_data i2c_pdata[OMAP_I2C_MAX_CONTROLLERS]; |
72 | static struct platform_device omap_i2c_devices[] = { | ||
73 | I2C_DEV_BUILDER(1, i2c_resources[0], &i2c_pdata[0]), | ||
74 | }; | ||
75 | 41 | ||
76 | #define OMAP_I2C_CMDLINE_SETUP (BIT(31)) | 42 | #define OMAP_I2C_CMDLINE_SETUP (BIT(31)) |
77 | 43 | ||
@@ -91,95 +57,6 @@ static int __init omap_i2c_nr_ports(void) | |||
91 | return ports; | 57 | return ports; |
92 | } | 58 | } |
93 | 59 | ||
94 | static inline int omap1_i2c_add_bus(int bus_id) | ||
95 | { | ||
96 | struct platform_device *pdev; | ||
97 | struct omap_i2c_bus_platform_data *pdata; | ||
98 | struct resource *res; | ||
99 | |||
100 | omap1_i2c_mux_pins(bus_id); | ||
101 | |||
102 | pdev = &omap_i2c_devices[bus_id - 1]; | ||
103 | res = pdev->resource; | ||
104 | res[0].start = OMAP1_I2C_BASE; | ||
105 | res[0].end = res[0].start + OMAP_I2C_SIZE; | ||
106 | res[1].start = OMAP1_INT_I2C; | ||
107 | pdata = &i2c_pdata[bus_id - 1]; | ||
108 | |||
109 | /* all OMAP1 have IP version 1 register set */ | ||
110 | pdata->rev = OMAP_I2C_IP_VERSION_1; | ||
111 | |||
112 | /* all OMAP1 I2C are implemented like this */ | ||
113 | pdata->flags = OMAP_I2C_FLAG_NO_FIFO | | ||
114 | OMAP_I2C_FLAG_SIMPLE_CLOCK | | ||
115 | OMAP_I2C_FLAG_16BIT_DATA_REG | | ||
116 | OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK; | ||
117 | |||
118 | /* how the cpu bus is wired up differs for 7xx only */ | ||
119 | |||
120 | if (cpu_is_omap7xx()) | ||
121 | pdata->flags |= OMAP_I2C_FLAG_BUS_SHIFT_1; | ||
122 | else | ||
123 | pdata->flags |= OMAP_I2C_FLAG_BUS_SHIFT_2; | ||
124 | |||
125 | return platform_device_register(pdev); | ||
126 | } | ||
127 | |||
128 | |||
129 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
130 | static inline int omap2_i2c_add_bus(int bus_id) | ||
131 | { | ||
132 | int l; | ||
133 | struct omap_hwmod *oh; | ||
134 | struct platform_device *pdev; | ||
135 | char oh_name[MAX_OMAP_I2C_HWMOD_NAME_LEN]; | ||
136 | struct omap_i2c_bus_platform_data *pdata; | ||
137 | struct omap_i2c_dev_attr *dev_attr; | ||
138 | |||
139 | omap2_i2c_mux_pins(bus_id); | ||
140 | |||
141 | l = snprintf(oh_name, MAX_OMAP_I2C_HWMOD_NAME_LEN, "i2c%d", bus_id); | ||
142 | WARN(l >= MAX_OMAP_I2C_HWMOD_NAME_LEN, | ||
143 | "String buffer overflow in I2C%d device setup\n", bus_id); | ||
144 | oh = omap_hwmod_lookup(oh_name); | ||
145 | if (!oh) { | ||
146 | pr_err("Could not look up %s\n", oh_name); | ||
147 | return -EEXIST; | ||
148 | } | ||
149 | |||
150 | pdata = &i2c_pdata[bus_id - 1]; | ||
151 | /* | ||
152 | * pass the hwmod class's CPU-specific knowledge of I2C IP revision in | ||
153 | * use, and functionality implementation flags, up to the OMAP I2C | ||
154 | * driver via platform data | ||
155 | */ | ||
156 | pdata->rev = oh->class->rev; | ||
157 | |||
158 | dev_attr = (struct omap_i2c_dev_attr *)oh->dev_attr; | ||
159 | pdata->flags = dev_attr->flags; | ||
160 | |||
161 | pdev = omap_device_build(name, bus_id, oh, pdata, | ||
162 | sizeof(struct omap_i2c_bus_platform_data), | ||
163 | NULL, 0, 0); | ||
164 | WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", name); | ||
165 | |||
166 | return PTR_RET(pdev); | ||
167 | } | ||
168 | #else | ||
169 | static inline int omap2_i2c_add_bus(int bus_id) | ||
170 | { | ||
171 | return 0; | ||
172 | } | ||
173 | #endif | ||
174 | |||
175 | static int __init omap_i2c_add_bus(int bus_id) | ||
176 | { | ||
177 | if (cpu_class_is_omap1()) | ||
178 | return omap1_i2c_add_bus(bus_id); | ||
179 | else | ||
180 | return omap2_i2c_add_bus(bus_id); | ||
181 | } | ||
182 | |||
183 | /** | 60 | /** |
184 | * omap_i2c_bus_setup - Process command line options for the I2C bus speed | 61 | * omap_i2c_bus_setup - Process command line options for the I2C bus speed |
185 | * @str: String of options | 62 | * @str: String of options |
@@ -218,7 +95,7 @@ static int __init omap_register_i2c_bus_cmdline(void) | |||
218 | for (i = 0; i < ARRAY_SIZE(i2c_pdata); i++) | 95 | for (i = 0; i < ARRAY_SIZE(i2c_pdata); i++) |
219 | if (i2c_pdata[i].clkrate & OMAP_I2C_CMDLINE_SETUP) { | 96 | if (i2c_pdata[i].clkrate & OMAP_I2C_CMDLINE_SETUP) { |
220 | i2c_pdata[i].clkrate &= ~OMAP_I2C_CMDLINE_SETUP; | 97 | i2c_pdata[i].clkrate &= ~OMAP_I2C_CMDLINE_SETUP; |
221 | err = omap_i2c_add_bus(i + 1); | 98 | err = omap_i2c_add_bus(&i2c_pdata[i], i + 1); |
222 | if (err) | 99 | if (err) |
223 | goto out; | 100 | goto out; |
224 | } | 101 | } |
@@ -256,5 +133,5 @@ int __init omap_register_i2c_bus(int bus_id, u32 clkrate, | |||
256 | 133 | ||
257 | i2c_pdata[bus_id - 1].clkrate &= ~OMAP_I2C_CMDLINE_SETUP; | 134 | i2c_pdata[bus_id - 1].clkrate &= ~OMAP_I2C_CMDLINE_SETUP; |
258 | 135 | ||
259 | return omap_i2c_add_bus(bus_id); | 136 | return omap_i2c_add_bus(&i2c_pdata[bus_id - 1], bus_id); |
260 | } | 137 | } |
diff --git a/arch/arm/plat-omap/i2c.h b/arch/arm/plat-omap/i2c.h new file mode 100644 index 000000000000..7a9028cb5a75 --- /dev/null +++ b/arch/arm/plat-omap/i2c.h | |||
@@ -0,0 +1,47 @@ | |||
1 | /* | ||
2 | * Helper module for board specific I2C bus registration | ||
3 | * | ||
4 | * Copyright (C) 2009 Nokia Corporation. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * version 2 as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, but | ||
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | * General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
18 | * 02110-1301 USA | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #ifndef __PLAT_OMAP_I2C_H | ||
23 | #define __PLAT_OMAP_I2C_H | ||
24 | |||
25 | struct i2c_board_info; | ||
26 | struct omap_i2c_bus_platform_data; | ||
27 | |||
28 | int omap_i2c_add_bus(struct omap_i2c_bus_platform_data *i2c_pdata, | ||
29 | int bus_id); | ||
30 | |||
31 | #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) | ||
32 | extern int omap_register_i2c_bus(int bus_id, u32 clkrate, | ||
33 | struct i2c_board_info const *info, | ||
34 | unsigned len); | ||
35 | #else | ||
36 | static inline int omap_register_i2c_bus(int bus_id, u32 clkrate, | ||
37 | struct i2c_board_info const *info, | ||
38 | unsigned len) | ||
39 | { | ||
40 | return 0; | ||
41 | } | ||
42 | #endif | ||
43 | |||
44 | struct omap_hwmod; | ||
45 | int omap_i2c_reset(struct omap_hwmod *oh); | ||
46 | |||
47 | #endif /* __PLAT_OMAP_I2C_H */ | ||
diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index d1cb6f527b7e..55c0f8bfc85b 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h | |||
@@ -27,7 +27,6 @@ | |||
27 | #ifndef __ARCH_ARM_MACH_OMAP_COMMON_H | 27 | #ifndef __ARCH_ARM_MACH_OMAP_COMMON_H |
28 | #define __ARCH_ARM_MACH_OMAP_COMMON_H | 28 | #define __ARCH_ARM_MACH_OMAP_COMMON_H |
29 | 29 | ||
30 | #include <plat/i2c.h> | ||
31 | #include <plat/omap_hwmod.h> | 30 | #include <plat/omap_hwmod.h> |
32 | 31 | ||
33 | extern int __init omap_init_clocksource_32k(void __iomem *vbase); | 32 | extern int __init omap_init_clocksource_32k(void __iomem *vbase); |