Merge branch 'depends/omap2_dss' into next/cleanup
[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/module.h>
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/platform_device.h>
16 #include <linux/io.h>
17 #include <linux/slab.h>
18 #include <linux/memblock.h>
19
20 #include <mach/hardware.h>
21 #include <asm/mach-types.h>
22 #include <asm/mach/map.h>
23
24 #include <plat/tc.h>
25 #include <plat/board.h>
26 #include <plat/mmc.h>
27 #include <mach/gpio.h>
28 #include <plat/menelaus.h>
29 #include <plat/omap44xx.h>
30
31 #if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
32                 defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE)
33
34 static struct resource mcpdm_resources[] = {
35         {
36                 .name           = "mcpdm_mem",
37                 .start          = OMAP44XX_MCPDM_BASE,
38                 .end            = OMAP44XX_MCPDM_BASE + SZ_4K,
39                 .flags          = IORESOURCE_MEM,
40         },
41         {
42                 .name           = "mcpdm_irq",
43                 .start          = OMAP44XX_IRQ_MCPDM,
44                 .end            = OMAP44XX_IRQ_MCPDM,
45                 .flags          = IORESOURCE_IRQ,
46         },
47 };
48
49 static struct platform_device omap_mcpdm_device = {
50         .name           = "omap-mcpdm",
51         .id             = -1,
52         .num_resources  = ARRAY_SIZE(mcpdm_resources),
53         .resource       = mcpdm_resources,
54 };
55
56 static void omap_init_mcpdm(void)
57 {
58         (void) platform_device_register(&omap_mcpdm_device);
59 }
60 #else
61 static inline void omap_init_mcpdm(void) {}
62 #endif
63
64 /*-------------------------------------------------------------------------*/
65
66 #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
67         defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
68
69 #define OMAP_MMC_NR_RES         2
70
71 /*
72  * Register MMC devices. Called from mach-omap1 and mach-omap2 device init.
73  */
74 int __init omap_mmc_add(const char *name, int id, unsigned long base,
75                                 unsigned long size, unsigned int irq,
76                                 struct omap_mmc_platform_data *data)
77 {
78         struct platform_device *pdev;
79         struct resource res[OMAP_MMC_NR_RES];
80         int ret;
81
82         pdev = platform_device_alloc(name, id);
83         if (!pdev)
84                 return -ENOMEM;
85
86         memset(res, 0, OMAP_MMC_NR_RES * sizeof(struct resource));
87         res[0].start = base;
88         res[0].end = base + size - 1;
89         res[0].flags = IORESOURCE_MEM;
90         res[1].start = res[1].end = irq;
91         res[1].flags = IORESOURCE_IRQ;
92
93         ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res));
94         if (ret == 0)
95                 ret = platform_device_add_data(pdev, data, sizeof(*data));
96         if (ret)
97                 goto fail;
98
99         ret = platform_device_add(pdev);
100         if (ret)
101                 goto fail;
102
103         /* return device handle to board setup code */
104         data->dev = &pdev->dev;
105         return 0;
106
107 fail:
108         platform_device_put(pdev);
109         return ret;
110 }
111
112 #endif
113
114 /*-------------------------------------------------------------------------*/
115
116 #if defined(CONFIG_HW_RANDOM_OMAP) || defined(CONFIG_HW_RANDOM_OMAP_MODULE)
117
118 #ifdef CONFIG_ARCH_OMAP2
119 #define OMAP_RNG_BASE           0x480A0000
120 #else
121 #define OMAP_RNG_BASE           0xfffe5000
122 #endif
123
124 static struct resource rng_resources[] = {
125         {
126                 .start          = OMAP_RNG_BASE,
127                 .end            = OMAP_RNG_BASE + 0x4f,
128                 .flags          = IORESOURCE_MEM,
129         },
130 };
131
132 static struct platform_device omap_rng_device = {
133         .name           = "omap_rng",
134         .id             = -1,
135         .num_resources  = ARRAY_SIZE(rng_resources),
136         .resource       = rng_resources,
137 };
138
139 static void omap_init_rng(void)
140 {
141         (void) platform_device_register(&omap_rng_device);
142 }
143 #else
144 static inline void omap_init_rng(void) {}
145 #endif
146
147 /*-------------------------------------------------------------------------*/
148
149 /* Numbering for the SPI-capable controllers when used for SPI:
150  * spi          = 1
151  * uwire        = 2
152  * mmc1..2      = 3..4
153  * mcbsp1..3    = 5..7
154  */
155
156 #if defined(CONFIG_SPI_OMAP_UWIRE) || defined(CONFIG_SPI_OMAP_UWIRE_MODULE)
157
158 #define OMAP_UWIRE_BASE         0xfffb3000
159
160 static struct resource uwire_resources[] = {
161         {
162                 .start          = OMAP_UWIRE_BASE,
163                 .end            = OMAP_UWIRE_BASE + 0x20,
164                 .flags          = IORESOURCE_MEM,
165         },
166 };
167
168 static struct platform_device omap_uwire_device = {
169         .name      = "omap_uwire",
170         .id          = -1,
171         .num_resources  = ARRAY_SIZE(uwire_resources),
172         .resource       = uwire_resources,
173 };
174
175 static void omap_init_uwire(void)
176 {
177         /* FIXME define and use a boot tag; not all boards will be hooking
178          * up devices to the microwire controller, and multi-board configs
179          * mean that CONFIG_SPI_OMAP_UWIRE may be configured anyway...
180          */
181
182         /* board-specific code must configure chipselects (only a few
183          * are normally used) and SCLK/SDI/SDO (each has two choices).
184          */
185         (void) platform_device_register(&omap_uwire_device);
186 }
187 #else
188 static inline void omap_init_uwire(void) {}
189 #endif
190
191 #if defined(CONFIG_TIDSPBRIDGE) || defined(CONFIG_TIDSPBRIDGE_MODULE)
192
193 static phys_addr_t omap_dsp_phys_mempool_base;
194
195 void __init omap_dsp_reserve_sdram_memblock(void)
196 {
197         phys_addr_t size = CONFIG_TIDSPBRIDGE_MEMPOOL_SIZE;
198         phys_addr_t paddr;
199
200         if (!size)
201                 return;
202
203         paddr = memblock_alloc(size, SZ_1M);
204         if (!paddr) {
205                 pr_err("%s: failed to reserve %x bytes\n",
206                                 __func__, size);
207                 return;
208         }
209         memblock_free(paddr, size);
210         memblock_remove(paddr, size);
211
212         omap_dsp_phys_mempool_base = paddr;
213 }
214
215 phys_addr_t omap_dsp_get_mempool_base(void)
216 {
217         return omap_dsp_phys_mempool_base;
218 }
219 EXPORT_SYMBOL(omap_dsp_get_mempool_base);
220 #endif
221
222 /*
223  * This gets called after board-specific INIT_MACHINE, and initializes most
224  * on-chip peripherals accessible on this board (except for few like USB):
225  *
226  *  (a) Does any "standard config" pin muxing needed.  Board-specific
227  *      code will have muxed GPIO pins and done "nonstandard" setup;
228  *      that code could live in the boot loader.
229  *  (b) Populating board-specific platform_data with the data drivers
230  *      rely on to handle wiring variations.
231  *  (c) Creating platform devices as meaningful on this board and
232  *      with this kernel configuration.
233  *
234  * Claiming GPIOs, and setting their direction and initial values, is the
235  * responsibility of the device drivers.  So is responding to probe().
236  *
237  * Board-specific knowledge like creating devices or pin setup is to be
238  * kept out of drivers as much as possible.  In particular, pin setup
239  * may be handled by the boot loader, and drivers should expect it will
240  * normally have been done by the time they're probed.
241  */
242 static int __init omap_init_devices(void)
243 {
244         /* please keep these calls, and their implementations above,
245          * in alphabetical order so they're easier to sort through.
246          */
247         omap_init_rng();
248         omap_init_mcpdm();
249         omap_init_uwire();
250         return 0;
251 }
252 arch_initcall(omap_init_devices);