Merge master.kernel.org:/home/rmk/linux-2.6-arm
[linux-2.6] / arch / arm / mach-omap1 / devices.c
1 /*
2  * linux/arch/arm/mach-omap1/devices.c
3  *
4  * OMAP1 platform device setup/initialization
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 static 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 OMAP_I2C_BASE           0xfffb3800
39
40 static struct resource i2c_resources[] = {
41         {
42                 .start          = OMAP_I2C_BASE,
43                 .end            = OMAP_I2C_BASE + 0x3f,
44                 .flags          = IORESOURCE_MEM,
45         },
46         {
47                 .start          = INT_I2C,
48                 .flags          = IORESOURCE_IRQ,
49         },
50 };
51
52 /* DMA not used; works around erratum writing to non-empty i2c fifo */
53
54 static struct platform_device omap_i2c_device = {
55         .name           = "i2c_omap",
56         .id             = -1,
57         .dev = {
58                 .release        = omap_nop_release,
59         },
60         .num_resources  = ARRAY_SIZE(i2c_resources),
61         .resource       = i2c_resources,
62 };
63
64 static void omap_init_i2c(void)
65 {
66         /* FIXME define and use a boot tag, in case of boards that
67          * either don't wire up I2C, or chips that mux it differently...
68          * it can include clocking and address info, maybe more.
69          */
70         omap_cfg_reg(I2C_SCL);
71         omap_cfg_reg(I2C_SDA);
72
73         (void) platform_device_register(&omap_i2c_device);
74 }
75 #else
76 static inline void omap_init_i2c(void) {}
77 #endif
78
79 /*-------------------------------------------------------------------------*/
80
81 #if     defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE)
82
83 static u64 irda_dmamask = 0xffffffff;
84
85 static struct platform_device omap1610ir_device = {
86         .name = "omap1610-ir",
87         .id = -1,
88         .dev = {
89                 .release        = omap_nop_release,
90                 .dma_mask       = &irda_dmamask,
91         },
92 };
93
94 static void omap_init_irda(void)
95 {
96         /* FIXME define and use a boot tag, members something like:
97          *  u8          uart;           // uart1, or uart3
98          * ... but driver only handles uart3 for now
99          *  s16         fir_sel;        // gpio for SIR vs FIR
100          * ... may prefer a callback for SIR/MIR/FIR mode select;
101          * while h2 uses a GPIO, H3 uses a gpio expander
102          */
103         if (machine_is_omap_h2()
104                         || machine_is_omap_h3())
105                 (void) platform_device_register(&omap1610ir_device);
106 }
107 #else
108 static inline void omap_init_irda(void) {}
109 #endif
110
111 /*-------------------------------------------------------------------------*/
112
113 #if     defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
114
115 #define OMAP_MMC1_BASE          0xfffb7800
116 #define OMAP_MMC2_BASE          0xfffb7c00      /* omap16xx only */
117
118 static struct omap_mmc_conf mmc1_conf;
119
120 static u64 mmc1_dmamask = 0xffffffff;
121
122 static struct resource mmc1_resources[] = {
123         {
124                 .start          = IO_ADDRESS(OMAP_MMC1_BASE),
125                 .end            = IO_ADDRESS(OMAP_MMC1_BASE) + 0x7f,
126                 .flags          = IORESOURCE_MEM,
127         },
128         {
129                 .start          = INT_MMC,
130                 .flags          = IORESOURCE_IRQ,
131         },
132 };
133
134 static struct platform_device mmc_omap_device1 = {
135         .name           = "mmci-omap",
136         .id             = 1,
137         .dev = {
138                 .release        = omap_nop_release,
139                 .dma_mask       = &mmc1_dmamask,
140                 .platform_data  = &mmc1_conf,
141         },
142         .num_resources  = ARRAY_SIZE(mmc1_resources),
143         .resource       = mmc1_resources,
144 };
145
146 #ifdef  CONFIG_ARCH_OMAP16XX
147
148 static struct omap_mmc_conf mmc2_conf;
149
150 static u64 mmc2_dmamask = 0xffffffff;
151
152 static struct resource mmc2_resources[] = {
153         {
154                 .start          = IO_ADDRESS(OMAP_MMC2_BASE),
155                 .end            = IO_ADDRESS(OMAP_MMC2_BASE) + 0x7f,
156                 .flags          = IORESOURCE_MEM,
157         },
158         {
159                 .start          = INT_1610_MMC2,
160                 .flags          = IORESOURCE_IRQ,
161         },
162 };
163
164 static struct platform_device mmc_omap_device2 = {
165         .name           = "mmci-omap",
166         .id             = 2,
167         .dev = {
168                 .release        = omap_nop_release,
169                 .dma_mask       = &mmc2_dmamask,
170                 .platform_data  = &mmc2_conf,
171         },
172         .num_resources  = ARRAY_SIZE(mmc2_resources),
173         .resource       = mmc2_resources,
174 };
175 #endif
176
177 static void __init omap_init_mmc(void)
178 {
179         const struct omap_mmc_config    *mmc_conf;
180         const struct omap_mmc_conf      *mmc;
181
182         /* NOTE:  assumes MMC was never (wrongly) enabled */
183         mmc_conf = omap_get_config(OMAP_TAG_MMC, struct omap_mmc_config);
184         if (!mmc_conf)
185                 return;
186
187         /* block 1 is always available and has just one pinout option */
188         mmc = &mmc_conf->mmc[0];
189         if (mmc->enabled) {
190                 omap_cfg_reg(MMC_CMD);
191                 omap_cfg_reg(MMC_CLK);
192                 omap_cfg_reg(MMC_DAT0);
193                 if (cpu_is_omap1710()) {
194                       omap_cfg_reg(M15_1710_MMC_CLKI);
195                       omap_cfg_reg(P19_1710_MMC_CMDDIR);
196                       omap_cfg_reg(P20_1710_MMC_DATDIR0);
197                 }
198                 if (mmc->wire4) {
199                         omap_cfg_reg(MMC_DAT1);
200                         /* NOTE:  DAT2 can be on W10 (here) or M15 */
201                         if (!mmc->nomux)
202                                 omap_cfg_reg(MMC_DAT2);
203                         omap_cfg_reg(MMC_DAT3);
204                 }
205                 mmc1_conf = *mmc;
206                 (void) platform_device_register(&mmc_omap_device1);
207         }
208
209 #ifdef  CONFIG_ARCH_OMAP16XX
210         /* block 2 is on newer chips, and has many pinout options */
211         mmc = &mmc_conf->mmc[1];
212         if (mmc->enabled) {
213                 if (!mmc->nomux) {
214                         omap_cfg_reg(Y8_1610_MMC2_CMD);
215                         omap_cfg_reg(Y10_1610_MMC2_CLK);
216                         omap_cfg_reg(R18_1610_MMC2_CLKIN);
217                         omap_cfg_reg(W8_1610_MMC2_DAT0);
218                         if (mmc->wire4) {
219                                 omap_cfg_reg(V8_1610_MMC2_DAT1);
220                                 omap_cfg_reg(W15_1610_MMC2_DAT2);
221                                 omap_cfg_reg(R10_1610_MMC2_DAT3);
222                         }
223
224                         /* These are needed for the level shifter */
225                         omap_cfg_reg(V9_1610_MMC2_CMDDIR);
226                         omap_cfg_reg(V5_1610_MMC2_DATDIR0);
227                         omap_cfg_reg(W19_1610_MMC2_DATDIR1);
228                 }
229
230                 /* Feedback clock must be set on OMAP-1710 MMC2 */
231                 if (cpu_is_omap1710())
232                         omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24),
233                                      MOD_CONF_CTRL_1);
234                 mmc2_conf = *mmc;
235                 (void) platform_device_register(&mmc_omap_device2);
236         }
237 #endif
238         return;
239 }
240 #else
241 static inline void omap_init_mmc(void) {}
242 #endif
243
244 #if     defined(CONFIG_OMAP_RTC) || defined(CONFIG_OMAP_RTC)
245
246 #define OMAP_RTC_BASE           0xfffb4800
247
248 static struct resource rtc_resources[] = {
249         {
250                 .start          = OMAP_RTC_BASE,
251                 .end            = OMAP_RTC_BASE + 0x5f,
252                 .flags          = IORESOURCE_MEM,
253         },
254         {
255                 .start          = INT_RTC_TIMER,
256                 .flags          = IORESOURCE_IRQ,
257         },
258         {
259                 .start          = INT_RTC_ALARM,
260                 .flags          = IORESOURCE_IRQ,
261         },
262 };
263
264 static struct platform_device omap_rtc_device = {
265         .name           = "omap_rtc",
266         .id             = -1,
267         .dev = {
268                 .release        = omap_nop_release,
269         },
270         .num_resources  = ARRAY_SIZE(rtc_resources),
271         .resource       = rtc_resources,
272 };
273
274 static void omap_init_rtc(void)
275 {
276         (void) platform_device_register(&omap_rtc_device);
277 }
278 #else
279 static inline void omap_init_rtc(void) {}
280 #endif
281
282 /*-------------------------------------------------------------------------*/
283
284 #if     defined(CONFIG_OMAP16XX_WATCHDOG) || defined(CONFIG_OMAP16XX_WATCHDOG_MODULE)
285
286 #define OMAP_WDT_BASE           0xfffeb000
287
288 static struct resource wdt_resources[] = {
289         {
290                 .start          = OMAP_WDT_BASE,
291                 .end            = OMAP_WDT_BASE + 0x4f,
292                 .flags          = IORESOURCE_MEM,
293         },
294 };
295
296 static struct platform_device omap_wdt_device = {
297         .name      = "omap1610_wdt",
298         .id          = -1,
299         .dev = {
300                 .release        = omap_nop_release,
301         },
302         .num_resources  = ARRAY_SIZE(wdt_resources),
303         .resource       = wdt_resources,
304 };
305
306 static void omap_init_wdt(void)
307 {
308         (void) platform_device_register(&omap_wdt_device);
309 }
310 #else
311 static inline void omap_init_wdt(void) {}
312 #endif
313
314
315 /*-------------------------------------------------------------------------*/
316
317 /*
318  * This gets called after board-specific INIT_MACHINE, and initializes most
319  * on-chip peripherals accessible on this board (except for few like USB):
320  *
321  *  (a) Does any "standard config" pin muxing needed.  Board-specific
322  *      code will have muxed GPIO pins and done "nonstandard" setup;
323  *      that code could live in the boot loader.
324  *  (b) Populating board-specific platform_data with the data drivers
325  *      rely on to handle wiring variations.
326  *  (c) Creating platform devices as meaningful on this board and
327  *      with this kernel configuration.
328  *
329  * Claiming GPIOs, and setting their direction and initial values, is the
330  * responsibility of the device drivers.  So is responding to probe().
331  *
332  * Board-specific knowlege like creating devices or pin setup is to be
333  * kept out of drivers as much as possible.  In particular, pin setup
334  * may be handled by the boot loader, and drivers should expect it will
335  * normally have been done by the time they're probed.
336  */
337 static int __init omap_init_devices(void)
338 {
339         /* please keep these calls, and their implementations above,
340          * in alphabetical order so they're easier to sort through.
341          */
342         omap_init_i2c();
343         omap_init_irda();
344         omap_init_mmc();
345         omap_init_rtc();
346         omap_init_wdt();
347
348         return 0;
349 }
350 arch_initcall(omap_init_devices);
351