aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-samsung/devs.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/plat-samsung/devs.c')
-rw-r--r--arch/arm/plat-samsung/devs.c431
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
46static u64 samsung_device_dma_mask = DMA_BIT_MASK(32);
47
48/* AC97 */
49#ifdef CONFIG_CPU_S3C2440
50static 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
81struct 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
96static 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
114struct 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
125static 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
138struct 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
153static 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
161struct 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
174struct 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
187static 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
200struct 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
211void __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
231static 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
249struct 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
260static 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
273struct 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
280void __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
290static 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
303struct 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
314static 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
327struct 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
342static 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
356struct 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
364void __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
374static 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
387struct 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
394void __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
403static 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
416struct 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
427void __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 */