[ARM] 3142/1: OMAP 2/5: Update files common to omap1 and omap2
[pandora-kernel.git] / arch / arm / plat-omap / devices.c
1 /*
2  * linux/arch/arm/plat-omap/devices.c
3  *
4  * Common platform device setup/initialization for OMAP1 and OMAP2
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  */
11
12 #include <linux/config.h>
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/platform_device.h>
17
18 #include <asm/hardware.h>
19 #include <asm/io.h>
20 #include <asm/mach-types.h>
21 #include <asm/mach/map.h>
22
23 #include <asm/arch/tc.h>
24 #include <asm/arch/board.h>
25 #include <asm/arch/mux.h>
26 #include <asm/arch/gpio.h>
27
28
29 void omap_nop_release(struct device *dev)
30 {
31         /* Nothing */
32 }
33
34 /*-------------------------------------------------------------------------*/
35
36 #if     defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
37
38 #define OMAP1_I2C_BASE          0xfffb3800
39 #define OMAP2_I2C_BASE1         0x48070000
40 #define OMAP_I2C_SIZE           0x3f
41 #define OMAP1_I2C_INT           INT_I2C
42 #define OMAP2_I2C_INT1          56
43
44 static struct resource i2c_resources1[] = {
45         {
46                 .start          = 0,
47                 .end            = 0,
48                 .flags          = IORESOURCE_MEM,
49         },
50         {
51                 .start          = 0,
52                 .flags          = IORESOURCE_IRQ,
53         },
54 };
55
56 /* DMA not used; works around erratum writing to non-empty i2c fifo */
57
58 static struct platform_device omap_i2c_device1 = {
59         .name           = "i2c_omap",
60         .id             = 1,
61         .dev = {
62                 .release        = omap_nop_release,
63         },
64         .num_resources  = ARRAY_SIZE(i2c_resources1),
65         .resource       = i2c_resources1,
66 };
67
68 /* See also arch/arm/mach-omap2/devices.c for second I2C on 24xx */
69 static void omap_init_i2c(void)
70 {
71         if (cpu_is_omap24xx()) {
72                 i2c_resources1[0].start = OMAP2_I2C_BASE1;
73                 i2c_resources1[0].end = OMAP2_I2C_BASE1 + OMAP_I2C_SIZE;
74                 i2c_resources1[1].start = OMAP2_I2C_INT1;
75         } else {
76                 i2c_resources1[0].start = OMAP1_I2C_BASE;
77                 i2c_resources1[0].end = OMAP1_I2C_BASE + OMAP_I2C_SIZE;
78                 i2c_resources1[1].start = OMAP1_I2C_INT;
79         }
80
81         /* FIXME define and use a boot tag, in case of boards that
82          * either don't wire up I2C, or chips that mux it differently...
83          * it can include clocking and address info, maybe more.
84          */
85         if (cpu_is_omap24xx()) {
86                 omap_cfg_reg(M19_24XX_I2C1_SCL);
87                 omap_cfg_reg(L15_24XX_I2C1_SDA);
88         } else {
89                 omap_cfg_reg(I2C_SCL);
90                 omap_cfg_reg(I2C_SDA);
91         }
92
93         (void) platform_device_register(&omap_i2c_device1);
94 }
95
96 #else
97 static inline void omap_init_i2c(void) {}
98 #endif
99
100 /*-------------------------------------------------------------------------*/
101
102 #if     defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
103
104 #ifdef CONFIG_ARCH_OMAP24XX
105 #define OMAP_MMC1_BASE          0x4809c000
106 #define OMAP_MMC1_INT           83
107 #else
108 #define OMAP_MMC1_BASE          0xfffb7800
109 #define OMAP_MMC1_INT           INT_MMC
110 #endif
111 #define OMAP_MMC2_BASE          0xfffb7c00      /* omap16xx only */
112
113 static struct omap_mmc_conf mmc1_conf;
114
115 static u64 mmc1_dmamask = 0xffffffff;
116
117 static struct resource mmc1_resources[] = {
118         {
119                 .start          = IO_ADDRESS(OMAP_MMC1_BASE),
120                 .end            = IO_ADDRESS(OMAP_MMC1_BASE) + 0x7f,
121                 .flags          = IORESOURCE_MEM,
122         },
123         {
124                 .start          = OMAP_MMC1_INT,
125                 .flags          = IORESOURCE_IRQ,
126         },
127 };
128
129 static struct platform_device mmc_omap_device1 = {
130         .name           = "mmci-omap",
131         .id             = 1,
132         .dev = {
133                 .release        = omap_nop_release,
134                 .dma_mask       = &mmc1_dmamask,
135                 .platform_data  = &mmc1_conf,
136         },
137         .num_resources  = ARRAY_SIZE(mmc1_resources),
138         .resource       = mmc1_resources,
139 };
140
141 #ifdef  CONFIG_ARCH_OMAP16XX
142
143 static struct omap_mmc_conf mmc2_conf;
144
145 static u64 mmc2_dmamask = 0xffffffff;
146
147 static struct resource mmc2_resources[] = {
148         {
149                 .start          = IO_ADDRESS(OMAP_MMC2_BASE),
150                 .end            = IO_ADDRESS(OMAP_MMC2_BASE) + 0x7f,
151                 .flags          = IORESOURCE_MEM,
152         },
153         {
154                 .start          = INT_1610_MMC2,
155                 .flags          = IORESOURCE_IRQ,
156         },
157 };
158
159 static struct platform_device mmc_omap_device2 = {
160         .name           = "mmci-omap",
161         .id             = 2,
162         .dev = {
163                 .release        = omap_nop_release,
164                 .dma_mask       = &mmc2_dmamask,
165                 .platform_data  = &mmc2_conf,
166         },
167         .num_resources  = ARRAY_SIZE(mmc2_resources),
168         .resource       = mmc2_resources,
169 };
170 #endif
171
172 static void __init omap_init_mmc(void)
173 {
174         const struct omap_mmc_config    *mmc_conf;
175         const struct omap_mmc_conf      *mmc;
176
177         /* NOTE:  assumes MMC was never (wrongly) enabled */
178         mmc_conf = omap_get_config(OMAP_TAG_MMC, struct omap_mmc_config);
179         if (!mmc_conf)
180                 return;
181
182         /* block 1 is always available and has just one pinout option */
183         mmc = &mmc_conf->mmc[0];
184         if (mmc->enabled) {
185                 if (!cpu_is_omap24xx()) {
186                         omap_cfg_reg(MMC_CMD);
187                         omap_cfg_reg(MMC_CLK);
188                         omap_cfg_reg(MMC_DAT0);
189                         if (cpu_is_omap1710()) {
190                                 omap_cfg_reg(M15_1710_MMC_CLKI);
191                                 omap_cfg_reg(P19_1710_MMC_CMDDIR);
192                                 omap_cfg_reg(P20_1710_MMC_DATDIR0);
193                         }
194                 }
195                 if (mmc->wire4) {
196                         if (!cpu_is_omap24xx()) {
197                                 omap_cfg_reg(MMC_DAT1);
198                                 /* NOTE:  DAT2 can be on W10 (here) or M15 */
199                                 if (!mmc->nomux)
200                                         omap_cfg_reg(MMC_DAT2);
201                                 omap_cfg_reg(MMC_DAT3);
202                         }
203                 }
204                 mmc1_conf = *mmc;
205                 (void) platform_device_register(&mmc_omap_device1);
206         }
207
208 #ifdef  CONFIG_ARCH_OMAP16XX
209         /* block 2 is on newer chips, and has many pinout options */
210         mmc = &mmc_conf->mmc[1];
211         if (mmc->enabled) {
212                 if (!mmc->nomux) {
213                         omap_cfg_reg(Y8_1610_MMC2_CMD);
214                         omap_cfg_reg(Y10_1610_MMC2_CLK);
215                         omap_cfg_reg(R18_1610_MMC2_CLKIN);
216                         omap_cfg_reg(W8_1610_MMC2_DAT0);
217                         if (mmc->wire4) {
218                                 omap_cfg_reg(V8_1610_MMC2_DAT1);
219                                 omap_cfg_reg(W15_1610_MMC2_DAT2);
220                                 omap_cfg_reg(R10_1610_MMC2_DAT3);
221                         }
222
223                         /* These are needed for the level shifter */
224                         omap_cfg_reg(V9_1610_MMC2_CMDDIR);
225                         omap_cfg_reg(V5_1610_MMC2_DATDIR0);
226                         omap_cfg_reg(W19_1610_MMC2_DATDIR1);
227                 }
228
229                 /* Feedback clock must be set on OMAP-1710 MMC2 */
230                 if (cpu_is_omap1710())
231                         omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24),
232                                      MOD_CONF_CTRL_1);
233                 mmc2_conf = *mmc;
234                 (void) platform_device_register(&mmc_omap_device2);
235         }
236 #endif
237         return;
238 }
239 #else
240 static inline void omap_init_mmc(void) {}
241 #endif
242
243 #if     defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE)
244
245 #ifdef CONFIG_ARCH_OMAP24XX
246 #define OMAP_WDT_BASE           0x48022000
247 #else
248 #define OMAP_WDT_BASE           0xfffeb000
249 #endif
250
251 static struct resource wdt_resources[] = {
252         {
253                 .start          = OMAP_WDT_BASE,
254                 .end            = OMAP_WDT_BASE + 0x4f,
255                 .flags          = IORESOURCE_MEM,
256         },
257 };
258
259 static struct platform_device omap_wdt_device = {
260         .name      = "omap_wdt",
261         .id          = -1,
262         .dev = {
263                 .release        = omap_nop_release,
264         },
265         .num_resources  = ARRAY_SIZE(wdt_resources),
266         .resource       = wdt_resources,
267 };
268
269 static void omap_init_wdt(void)
270 {
271         (void) platform_device_register(&omap_wdt_device);
272 }
273 #else
274 static inline void omap_init_wdt(void) {}
275 #endif
276
277 /*-------------------------------------------------------------------------*/
278
279 #if     defined(CONFIG_OMAP_RNG) || defined(CONFIG_OMAP_RNG_MODULE)
280
281 #ifdef CONFIG_ARCH_OMAP24XX
282 #define OMAP_RNG_BASE           0x480A0000
283 #else
284 #define OMAP_RNG_BASE           0xfffe5000
285 #endif
286
287 static struct resource rng_resources[] = {
288         {
289                 .start          = OMAP_RNG_BASE,
290                 .end            = OMAP_RNG_BASE + 0x4f,
291                 .flags          = IORESOURCE_MEM,
292         },
293 };
294
295 static struct platform_device omap_rng_device = {
296         .name      = "omap_rng",
297         .id          = -1,
298         .dev = {
299                 .release        = omap_nop_release,
300         },
301         .num_resources  = ARRAY_SIZE(rng_resources),
302         .resource       = rng_resources,
303 };
304
305 static void omap_init_rng(void)
306 {
307         (void) platform_device_register(&omap_rng_device);
308 }
309 #else
310 static inline void omap_init_rng(void) {}
311 #endif
312
313 #if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE)
314
315 static struct omap_lcd_config omap_fb_conf;
316
317 static u64 omap_fb_dma_mask = ~(u32)0;
318
319 static struct platform_device omap_fb_device = {
320         .name           = "omapfb",
321         .id             = -1,
322         .dev = {
323                 .release                = omap_nop_release,
324                 .dma_mask               = &omap_fb_dma_mask,
325                 .coherent_dma_mask      = ~(u32)0,
326                 .platform_data          = &omap_fb_conf,
327         },
328         .num_resources = 0,
329 };
330
331 static inline void omap_init_fb(void)
332 {
333         const struct omap_lcd_config *conf;
334
335         conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config);
336         if (conf != NULL)
337                 omap_fb_conf = *conf;
338         platform_device_register(&omap_fb_device);
339 }
340
341 #else
342
343 static inline void omap_init_fb(void) {}
344
345 #endif
346
347 /*
348  * This gets called after board-specific INIT_MACHINE, and initializes most
349  * on-chip peripherals accessible on this board (except for few like USB):
350  *
351  *  (a) Does any "standard config" pin muxing needed.  Board-specific
352  *      code will have muxed GPIO pins and done "nonstandard" setup;
353  *      that code could live in the boot loader.
354  *  (b) Populating board-specific platform_data with the data drivers
355  *      rely on to handle wiring variations.
356  *  (c) Creating platform devices as meaningful on this board and
357  *      with this kernel configuration.
358  *
359  * Claiming GPIOs, and setting their direction and initial values, is the
360  * responsibility of the device drivers.  So is responding to probe().
361  *
362  * Board-specific knowlege like creating devices or pin setup is to be
363  * kept out of drivers as much as possible.  In particular, pin setup
364  * may be handled by the boot loader, and drivers should expect it will
365  * normally have been done by the time they're probed.
366  */
367 static int __init omap_init_devices(void)
368 {
369         /* please keep these calls, and their implementations above,
370          * in alphabetical order so they're easier to sort through.
371          */
372         omap_init_fb();
373         omap_init_i2c();
374         omap_init_mmc();
375         omap_init_wdt();
376         omap_init_rng();
377
378         return 0;
379 }
380 arch_initcall(omap_init_devices);
381