diff options
Diffstat (limited to 'arch/arm/plat-samsung/devs.c')
-rw-r--r-- | arch/arm/plat-samsung/devs.c | 431 |
1 files changed, 431 insertions, 0 deletions
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c new file mode 100644 index 000000000000..f87bc9845d95 --- /dev/null +++ b/arch/arm/plat-samsung/devs.c | |||
@@ -0,0 +1,431 @@ | |||
1 | /* linux/arch/arm/plat-samsung/devs.c | ||
2 | * | ||
3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Base SAMSUNG platform device definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/list.h> | ||
17 | #include <linux/timer.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/serial_core.h> | ||
20 | #include <linux/platform_device.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/slab.h> | ||
23 | #include <linux/string.h> | ||
24 | #include <linux/dma-mapping.h> | ||
25 | |||
26 | #include <asm/irq.h> | ||
27 | #include <asm/mach/arch.h> | ||
28 | #include <asm/mach/map.h> | ||
29 | #include <asm/mach/irq.h> | ||
30 | |||
31 | #include <mach/hardware.h> | ||
32 | #include <mach/dma.h> | ||
33 | #include <mach/irqs.h> | ||
34 | #include <mach/map.h> | ||
35 | |||
36 | #include <plat/cpu.h> | ||
37 | #include <plat/devs.h> | ||
38 | #include <plat/fb.h> | ||
39 | #include <plat/fb-s3c2410.h> | ||
40 | #include <plat/mci.h> | ||
41 | #include <plat/ts.h> | ||
42 | #include <plat/udc.h> | ||
43 | #include <plat/regs-serial.h> | ||
44 | #include <plat/regs-spi.h> | ||
45 | |||
46 | static u64 samsung_device_dma_mask = DMA_BIT_MASK(32); | ||
47 | |||
48 | /* AC97 */ | ||
49 | #ifdef CONFIG_CPU_S3C2440 | ||
50 | static struct resource s3c_ac97_resource[] = { | ||
51 | [0] = { | ||
52 | .start = S3C2440_PA_AC97, | ||
53 | .end = S3C2440_PA_AC97 + S3C2440_SZ_AC97 - 1, | ||
54 | .flags = IORESOURCE_MEM, | ||
55 | }, | ||
56 | [1] = { | ||
57 | .start = IRQ_S3C244x_AC97, | ||
58 | .end = IRQ_S3C244x_AC97, | ||
59 | .flags = IORESOURCE_IRQ, | ||
60 | }, | ||
61 | [2] = { | ||
62 | .name = "PCM out", | ||
63 | .start = DMACH_PCM_OUT, | ||
64 | .end = DMACH_PCM_OUT, | ||
65 | .flags = IORESOURCE_DMA, | ||
66 | }, | ||
67 | [3] = { | ||
68 | .name = "PCM in", | ||
69 | .start = DMACH_PCM_IN, | ||
70 | .end = DMACH_PCM_IN, | ||
71 | .flags = IORESOURCE_DMA, | ||
72 | }, | ||
73 | [4] = { | ||
74 | .name = "Mic in", | ||
75 | .start = DMACH_MIC_IN, | ||
76 | .end = DMACH_MIC_IN, | ||
77 | .flags = IORESOURCE_DMA, | ||
78 | }, | ||
79 | }; | ||
80 | |||
81 | struct platform_device s3c_device_ac97 = { | ||
82 | .name = "samsung-ac97", | ||
83 | .id = -1, | ||
84 | .num_resources = ARRAY_SIZE(s3c_ac97_resource), | ||
85 | .resource = s3c_ac97_resource, | ||
86 | .dev = { | ||
87 | .dma_mask = &samsung_device_dma_mask, | ||
88 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
89 | } | ||
90 | }; | ||
91 | #endif /* CONFIG_CPU_S3C2440 */ | ||
92 | |||
93 | /* ADC */ | ||
94 | |||
95 | #ifdef CONFIG_PLAT_S3C24XX | ||
96 | static struct resource s3c_adc_resource[] = { | ||
97 | [0] = { | ||
98 | .start = S3C24XX_PA_ADC, | ||
99 | .end = S3C24XX_PA_ADC + S3C24XX_SZ_ADC - 1, | ||
100 | .flags = IORESOURCE_MEM, | ||
101 | }, | ||
102 | [1] = { | ||
103 | .start = IRQ_TC, | ||
104 | .end = IRQ_TC, | ||
105 | .flags = IORESOURCE_IRQ, | ||
106 | }, | ||
107 | [2] = { | ||
108 | .start = IRQ_ADC, | ||
109 | .end = IRQ_ADC, | ||
110 | .flags = IORESOURCE_IRQ, | ||
111 | } | ||
112 | }; | ||
113 | |||
114 | struct platform_device s3c_device_adc = { | ||
115 | .name = "s3c24xx-adc", | ||
116 | .id = -1, | ||
117 | .num_resources = ARRAY_SIZE(s3c_adc_resource), | ||
118 | .resource = s3c_adc_resource, | ||
119 | }; | ||
120 | #endif /* CONFIG_PLAT_S3C24XX */ | ||
121 | |||
122 | /* Camif Controller */ | ||
123 | |||
124 | #ifdef CONFIG_CPU_S3C2440 | ||
125 | static struct resource s3c_camif_resource[] = { | ||
126 | [0] = { | ||
127 | .start = S3C2440_PA_CAMIF, | ||
128 | .end = S3C2440_PA_CAMIF + S3C2440_SZ_CAMIF - 1, | ||
129 | .flags = IORESOURCE_MEM, | ||
130 | }, | ||
131 | [1] = { | ||
132 | .start = IRQ_CAM, | ||
133 | .end = IRQ_CAM, | ||
134 | .flags = IORESOURCE_IRQ, | ||
135 | } | ||
136 | }; | ||
137 | |||
138 | struct platform_device s3c_device_camif = { | ||
139 | .name = "s3c2440-camif", | ||
140 | .id = -1, | ||
141 | .num_resources = ARRAY_SIZE(s3c_camif_resource), | ||
142 | .resource = s3c_camif_resource, | ||
143 | .dev = { | ||
144 | .dma_mask = &samsung_device_dma_mask, | ||
145 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
146 | } | ||
147 | }; | ||
148 | #endif /* CONFIG_CPU_S3C2440 */ | ||
149 | |||
150 | /* I2S */ | ||
151 | |||
152 | #ifdef CONFIG_PLAT_S3C24XX | ||
153 | static struct resource s3c_iis_resource[] = { | ||
154 | [0] = { | ||
155 | .start = S3C24XX_PA_IIS, | ||
156 | .end = S3C24XX_PA_IIS + S3C24XX_SZ_IIS - 1, | ||
157 | .flags = IORESOURCE_MEM, | ||
158 | } | ||
159 | }; | ||
160 | |||
161 | struct platform_device s3c_device_iis = { | ||
162 | .name = "s3c24xx-iis", | ||
163 | .id = -1, | ||
164 | .num_resources = ARRAY_SIZE(s3c_iis_resource), | ||
165 | .resource = s3c_iis_resource, | ||
166 | .dev = { | ||
167 | .dma_mask = &samsung_device_dma_mask, | ||
168 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
169 | } | ||
170 | }; | ||
171 | #endif /* CONFIG_PLAT_S3C24XX */ | ||
172 | |||
173 | #ifdef CONFIG_CPU_S3C2440 | ||
174 | struct platform_device s3c2412_device_iis = { | ||
175 | .name = "s3c2412-iis", | ||
176 | .id = -1, | ||
177 | .dev = { | ||
178 | .dma_mask = &samsung_device_dma_mask, | ||
179 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
180 | } | ||
181 | }; | ||
182 | #endif /* CONFIG_CPU_S3C2440 */ | ||
183 | |||
184 | /* LCD Controller */ | ||
185 | |||
186 | #ifdef CONFIG_PLAT_S3C24XX | ||
187 | static struct resource s3c_lcd_resource[] = { | ||
188 | [0] = { | ||
189 | .start = S3C24XX_PA_LCD, | ||
190 | .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1, | ||
191 | .flags = IORESOURCE_MEM, | ||
192 | }, | ||
193 | [1] = { | ||
194 | .start = IRQ_LCD, | ||
195 | .end = IRQ_LCD, | ||
196 | .flags = IORESOURCE_IRQ, | ||
197 | } | ||
198 | }; | ||
199 | |||
200 | struct platform_device s3c_device_lcd = { | ||
201 | .name = "s3c2410-lcd", | ||
202 | .id = -1, | ||
203 | .num_resources = ARRAY_SIZE(s3c_lcd_resource), | ||
204 | .resource = s3c_lcd_resource, | ||
205 | .dev = { | ||
206 | .dma_mask = &samsung_device_dma_mask, | ||
207 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
208 | } | ||
209 | }; | ||
210 | |||
211 | void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd) | ||
212 | { | ||
213 | struct s3c2410fb_mach_info *npd; | ||
214 | |||
215 | npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_lcd); | ||
216 | if (npd) { | ||
217 | npd->displays = kmemdup(pd->displays, | ||
218 | sizeof(struct s3c2410fb_display) * npd->num_displays, | ||
219 | GFP_KERNEL); | ||
220 | if (!npd->displays) | ||
221 | printk(KERN_ERR "no memory for LCD display data\n"); | ||
222 | } else { | ||
223 | printk(KERN_ERR "no memory for LCD platform data\n"); | ||
224 | } | ||
225 | } | ||
226 | #endif /* CONFIG_PLAT_S3C24XX */ | ||
227 | |||
228 | /* RTC */ | ||
229 | |||
230 | #ifdef CONFIG_PLAT_S3C24XX | ||
231 | static struct resource s3c_rtc_resource[] = { | ||
232 | [0] = { | ||
233 | .start = S3C24XX_PA_RTC, | ||
234 | .end = S3C24XX_PA_RTC + 0xff, | ||
235 | .flags = IORESOURCE_MEM, | ||
236 | }, | ||
237 | [1] = { | ||
238 | .start = IRQ_RTC, | ||
239 | .end = IRQ_RTC, | ||
240 | .flags = IORESOURCE_IRQ, | ||
241 | }, | ||
242 | [2] = { | ||
243 | .start = IRQ_TICK, | ||
244 | .end = IRQ_TICK, | ||
245 | .flags = IORESOURCE_IRQ | ||
246 | } | ||
247 | }; | ||
248 | |||
249 | struct platform_device s3c_device_rtc = { | ||
250 | .name = "s3c2410-rtc", | ||
251 | .id = -1, | ||
252 | .num_resources = ARRAY_SIZE(s3c_rtc_resource), | ||
253 | .resource = s3c_rtc_resource, | ||
254 | }; | ||
255 | #endif /* CONFIG_PLAT_S3C24XX */ | ||
256 | |||
257 | /* SDI */ | ||
258 | |||
259 | #ifdef CONFIG_PLAT_S3C24XX | ||
260 | static struct resource s3c_sdi_resource[] = { | ||
261 | [0] = { | ||
262 | .start = S3C24XX_PA_SDI, | ||
263 | .end = S3C24XX_PA_SDI + S3C24XX_SZ_SDI - 1, | ||
264 | .flags = IORESOURCE_MEM, | ||
265 | }, | ||
266 | [1] = { | ||
267 | .start = IRQ_SDI, | ||
268 | .end = IRQ_SDI, | ||
269 | .flags = IORESOURCE_IRQ, | ||
270 | } | ||
271 | }; | ||
272 | |||
273 | struct platform_device s3c_device_sdi = { | ||
274 | .name = "s3c2410-sdi", | ||
275 | .id = -1, | ||
276 | .num_resources = ARRAY_SIZE(s3c_sdi_resource), | ||
277 | .resource = s3c_sdi_resource, | ||
278 | }; | ||
279 | |||
280 | void __init s3c24xx_mci_set_platdata(struct s3c24xx_mci_pdata *pdata) | ||
281 | { | ||
282 | s3c_set_platdata(pdata, sizeof(struct s3c24xx_mci_pdata), | ||
283 | &s3c_device_sdi); | ||
284 | } | ||
285 | #endif /* CONFIG_PLAT_S3C24XX */ | ||
286 | |||
287 | /* SPI */ | ||
288 | |||
289 | #ifdef CONFIG_PLAT_S3C24XX | ||
290 | static struct resource s3c_spi0_resource[] = { | ||
291 | [0] = { | ||
292 | .start = S3C24XX_PA_SPI, | ||
293 | .end = S3C24XX_PA_SPI + 0x1f, | ||
294 | .flags = IORESOURCE_MEM, | ||
295 | }, | ||
296 | [1] = { | ||
297 | .start = IRQ_SPI0, | ||
298 | .end = IRQ_SPI0, | ||
299 | .flags = IORESOURCE_IRQ, | ||
300 | } | ||
301 | }; | ||
302 | |||
303 | struct platform_device s3c_device_spi0 = { | ||
304 | .name = "s3c2410-spi", | ||
305 | .id = 0, | ||
306 | .num_resources = ARRAY_SIZE(s3c_spi0_resource), | ||
307 | .resource = s3c_spi0_resource, | ||
308 | .dev = { | ||
309 | .dma_mask = &samsung_device_dma_mask, | ||
310 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
311 | } | ||
312 | }; | ||
313 | |||
314 | static struct resource s3c_spi1_resource[] = { | ||
315 | [0] = { | ||
316 | .start = S3C24XX_PA_SPI + S3C2410_SPI1, | ||
317 | .end = S3C24XX_PA_SPI + S3C2410_SPI1 + 0x1f, | ||
318 | .flags = IORESOURCE_MEM, | ||
319 | }, | ||
320 | [1] = { | ||
321 | .start = IRQ_SPI1, | ||
322 | .end = IRQ_SPI1, | ||
323 | .flags = IORESOURCE_IRQ, | ||
324 | } | ||
325 | }; | ||
326 | |||
327 | struct platform_device s3c_device_spi1 = { | ||
328 | .name = "s3c2410-spi", | ||
329 | .id = 1, | ||
330 | .num_resources = ARRAY_SIZE(s3c_spi1_resource), | ||
331 | .resource = s3c_spi1_resource, | ||
332 | .dev = { | ||
333 | .dma_mask = &samsung_device_dma_mask, | ||
334 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
335 | } | ||
336 | }; | ||
337 | #endif /* CONFIG_PLAT_S3C24XX */ | ||
338 | |||
339 | /* Touchscreen */ | ||
340 | |||
341 | #ifdef CONFIG_PLAT_S3C24XX | ||
342 | static struct resource s3c_ts_resource[] = { | ||
343 | [0] = { | ||
344 | .start = S3C24XX_PA_ADC, | ||
345 | .end = S3C24XX_PA_ADC + S3C24XX_SZ_ADC - 1, | ||
346 | .flags = IORESOURCE_MEM, | ||
347 | }, | ||
348 | [1] = { | ||
349 | .start = IRQ_TC, | ||
350 | .end = IRQ_TC, | ||
351 | .flags = IORESOURCE_IRQ, | ||
352 | }, | ||
353 | |||
354 | }; | ||
355 | |||
356 | struct platform_device s3c_device_ts = { | ||
357 | .name = "s3c2410-ts", | ||
358 | .id = -1, | ||
359 | .dev.parent = &s3c_device_adc.dev, | ||
360 | .num_resources = ARRAY_SIZE(s3c_ts_resource), | ||
361 | .resource = s3c_ts_resource, | ||
362 | }; | ||
363 | |||
364 | void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *hard_s3c2410ts_info) | ||
365 | { | ||
366 | s3c_set_platdata(hard_s3c2410ts_info, | ||
367 | sizeof(struct s3c2410_ts_mach_info), &s3c_device_ts); | ||
368 | } | ||
369 | #endif /* CONFIG_PLAT_S3C24XX */ | ||
370 | |||
371 | /* USB Device (Gadget) */ | ||
372 | |||
373 | #ifdef CONFIG_PLAT_S3C24XX | ||
374 | static struct resource s3c_usbgadget_resource[] = { | ||
375 | [0] = { | ||
376 | .start = S3C24XX_PA_USBDEV, | ||
377 | .end = S3C24XX_PA_USBDEV + S3C24XX_SZ_USBDEV - 1, | ||
378 | .flags = IORESOURCE_MEM, | ||
379 | }, | ||
380 | [1] = { | ||
381 | .start = IRQ_USBD, | ||
382 | .end = IRQ_USBD, | ||
383 | .flags = IORESOURCE_IRQ, | ||
384 | } | ||
385 | }; | ||
386 | |||
387 | struct platform_device s3c_device_usbgadget = { | ||
388 | .name = "s3c2410-usbgadget", | ||
389 | .id = -1, | ||
390 | .num_resources = ARRAY_SIZE(s3c_usbgadget_resource), | ||
391 | .resource = s3c_usbgadget_resource, | ||
392 | }; | ||
393 | |||
394 | void __init s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info *pd) | ||
395 | { | ||
396 | s3c_set_platdata(pd, sizeof(*pd), &s3c_device_usbgadget); | ||
397 | } | ||
398 | #endif /* CONFIG_PLAT_S3C24XX */ | ||
399 | |||
400 | /* USB High Spped 2.0 Device (Gadget) */ | ||
401 | |||
402 | #ifdef CONFIG_PLAT_S3C24XX | ||
403 | static struct resource s3c_hsudc_resource[] = { | ||
404 | [0] = { | ||
405 | .start = S3C2416_PA_HSUDC, | ||
406 | .end = S3C2416_PA_HSUDC + S3C2416_SZ_HSUDC - 1, | ||
407 | .flags = IORESOURCE_MEM, | ||
408 | }, | ||
409 | [1] = { | ||
410 | .start = IRQ_USBD, | ||
411 | .end = IRQ_USBD, | ||
412 | .flags = IORESOURCE_IRQ, | ||
413 | } | ||
414 | }; | ||
415 | |||
416 | struct platform_device s3c_device_usb_hsudc = { | ||
417 | .name = "s3c-hsudc", | ||
418 | .id = -1, | ||
419 | .num_resources = ARRAY_SIZE(s3c_hsudc_resource), | ||
420 | .resource = s3c_hsudc_resource, | ||
421 | .dev = { | ||
422 | .dma_mask = &samsung_device_dma_mask, | ||
423 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
424 | }, | ||
425 | }; | ||
426 | |||
427 | void __init s3c24xx_hsudc_set_platdata(struct s3c24xx_hsudc_platdata *pd) | ||
428 | { | ||
429 | s3c_set_platdata(pd, sizeof(*pd), &s3c_device_usb_hsudc); | ||
430 | } | ||
431 | #endif /* CONFIG_PLAT_S3C24XX */ | ||