1 /* linux/arch/arm/plat-s3c24xx/devs.c
3 * Copyright (c) 2004 Simtec Electronics
4 * Ben Dooks <ben@simtec.co.uk>
6 * Base S3C24XX platform device definitions
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.
14 #include <linux/kernel.h>
15 #include <linux/types.h>
16 #include <linux/interrupt.h>
17 #include <linux/list.h>
18 #include <linux/timer.h>
19 #include <linux/init.h>
20 #include <linux/serial_core.h>
21 #include <linux/platform_device.h>
23 #include <linux/slab.h>
24 #include <linux/string.h>
25 #include <linux/dma-mapping.h>
27 #include <asm/mach/arch.h>
28 #include <asm/mach/map.h>
29 #include <asm/mach/irq.h>
31 #include <mach/hardware.h>
33 #include <mach/irqs.h>
36 #include <plat/regs-serial.h>
40 #include <plat/devs.h>
42 #include <plat/regs-spi.h>
45 /* Serial port registrations */
47 static struct resource s3c2410_uart0_resource
[] = {
49 .start
= S3C2410_PA_UART0
,
50 .end
= S3C2410_PA_UART0
+ 0x3fff,
51 .flags
= IORESOURCE_MEM
,
54 .start
= IRQ_S3CUART_RX0
,
55 .end
= IRQ_S3CUART_ERR0
,
56 .flags
= IORESOURCE_IRQ
,
60 static struct resource s3c2410_uart1_resource
[] = {
62 .start
= S3C2410_PA_UART1
,
63 .end
= S3C2410_PA_UART1
+ 0x3fff,
64 .flags
= IORESOURCE_MEM
,
67 .start
= IRQ_S3CUART_RX1
,
68 .end
= IRQ_S3CUART_ERR1
,
69 .flags
= IORESOURCE_IRQ
,
73 static struct resource s3c2410_uart2_resource
[] = {
75 .start
= S3C2410_PA_UART2
,
76 .end
= S3C2410_PA_UART2
+ 0x3fff,
77 .flags
= IORESOURCE_MEM
,
80 .start
= IRQ_S3CUART_RX2
,
81 .end
= IRQ_S3CUART_ERR2
,
82 .flags
= IORESOURCE_IRQ
,
86 static struct resource s3c2410_uart3_resource
[] = {
88 .start
= S3C2443_PA_UART3
,
89 .end
= S3C2443_PA_UART3
+ 0x3fff,
90 .flags
= IORESOURCE_MEM
,
93 .start
= IRQ_S3CUART_RX3
,
94 .end
= IRQ_S3CUART_ERR3
,
95 .flags
= IORESOURCE_IRQ
,
99 struct s3c24xx_uart_resources s3c2410_uart_resources
[] __initdata
= {
101 .resources
= s3c2410_uart0_resource
,
102 .nr_resources
= ARRAY_SIZE(s3c2410_uart0_resource
),
105 .resources
= s3c2410_uart1_resource
,
106 .nr_resources
= ARRAY_SIZE(s3c2410_uart1_resource
),
109 .resources
= s3c2410_uart2_resource
,
110 .nr_resources
= ARRAY_SIZE(s3c2410_uart2_resource
),
113 .resources
= s3c2410_uart3_resource
,
114 .nr_resources
= ARRAY_SIZE(s3c2410_uart3_resource
),
120 static struct resource s3c_lcd_resource
[] = {
122 .start
= S3C24XX_PA_LCD
,
123 .end
= S3C24XX_PA_LCD
+ S3C24XX_SZ_LCD
- 1,
124 .flags
= IORESOURCE_MEM
,
129 .flags
= IORESOURCE_IRQ
,
134 static u64 s3c_device_lcd_dmamask
= 0xffffffffUL
;
136 struct platform_device s3c_device_lcd
= {
137 .name
= "s3c2410-lcd",
139 .num_resources
= ARRAY_SIZE(s3c_lcd_resource
),
140 .resource
= s3c_lcd_resource
,
142 .dma_mask
= &s3c_device_lcd_dmamask
,
143 .coherent_dma_mask
= 0xffffffffUL
147 EXPORT_SYMBOL(s3c_device_lcd
);
149 void __init
s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info
*pd
)
151 struct s3c2410fb_mach_info
*npd
;
153 npd
= kmemdup(pd
, sizeof(*npd
), GFP_KERNEL
);
155 s3c_device_lcd
.dev
.platform_data
= npd
;
156 npd
->displays
= kmemdup(pd
->displays
,
157 sizeof(struct s3c2410fb_display
) * npd
->num_displays
,
160 printk(KERN_ERR
"no memory for LCD display data\n");
162 printk(KERN_ERR
"no memory for LCD platform data\n");
168 static struct resource s3c_ts_resource
[] = {
170 .start
= S3C24XX_PA_ADC
,
171 .end
= S3C24XX_PA_ADC
+ S3C24XX_SZ_ADC
- 1,
172 .flags
= IORESOURCE_MEM
,
177 .flags
= IORESOURCE_IRQ
,
182 struct platform_device s3c_device_ts
= {
183 .name
= "s3c2410-ts",
185 .dev
.parent
= &s3c_device_adc
.dev
,
186 .num_resources
= ARRAY_SIZE(s3c_ts_resource
),
187 .resource
= s3c_ts_resource
,
189 EXPORT_SYMBOL(s3c_device_ts
);
191 static struct s3c2410_ts_mach_info s3c2410ts_info
;
193 void __init
s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info
*hard_s3c2410ts_info
)
195 memcpy(&s3c2410ts_info
, hard_s3c2410ts_info
, sizeof(struct s3c2410_ts_mach_info
));
196 s3c_device_ts
.dev
.platform_data
= &s3c2410ts_info
;
199 /* USB Device (Gadget)*/
201 static struct resource s3c_usbgadget_resource
[] = {
203 .start
= S3C24XX_PA_USBDEV
,
204 .end
= S3C24XX_PA_USBDEV
+ S3C24XX_SZ_USBDEV
- 1,
205 .flags
= IORESOURCE_MEM
,
210 .flags
= IORESOURCE_IRQ
,
215 struct platform_device s3c_device_usbgadget
= {
216 .name
= "s3c2410-usbgadget",
218 .num_resources
= ARRAY_SIZE(s3c_usbgadget_resource
),
219 .resource
= s3c_usbgadget_resource
,
222 EXPORT_SYMBOL(s3c_device_usbgadget
);
224 void __init
s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info
*pd
)
226 struct s3c2410_udc_mach_info
*npd
;
228 npd
= kmalloc(sizeof(*npd
), GFP_KERNEL
);
230 memcpy(npd
, pd
, sizeof(*npd
));
231 s3c_device_usbgadget
.dev
.platform_data
= npd
;
233 printk(KERN_ERR
"no memory for udc platform data\n");
237 /* USB High Speed 2.0 Device (Gadget) */
238 static struct resource s3c_hsudc_resource
[] = {
240 .start
= S3C2416_PA_HSUDC
,
241 .end
= S3C2416_PA_HSUDC
+ S3C2416_SZ_HSUDC
- 1,
242 .flags
= IORESOURCE_MEM
,
247 .flags
= IORESOURCE_IRQ
,
251 static u64 s3c_hsudc_dmamask
= DMA_BIT_MASK(32);
253 struct platform_device s3c_device_usb_hsudc
= {
256 .num_resources
= ARRAY_SIZE(s3c_hsudc_resource
),
257 .resource
= s3c_hsudc_resource
,
259 .dma_mask
= &s3c_hsudc_dmamask
,
260 .coherent_dma_mask
= DMA_BIT_MASK(32),
264 void __init
s3c24xx_hsudc_set_platdata(struct s3c24xx_hsudc_platdata
*pd
)
266 struct s3c24xx_hsudc_platdata
*npd
;
268 npd
= kmalloc(sizeof(*npd
), GFP_KERNEL
);
270 memcpy(npd
, pd
, sizeof(*npd
));
271 s3c_device_usb_hsudc
.dev
.platform_data
= npd
;
273 printk(KERN_ERR
"no memory for udc platform data\n");
279 static struct resource s3c_iis_resource
[] = {
281 .start
= S3C24XX_PA_IIS
,
282 .end
= S3C24XX_PA_IIS
+ S3C24XX_SZ_IIS
-1,
283 .flags
= IORESOURCE_MEM
,
287 static u64 s3c_device_iis_dmamask
= 0xffffffffUL
;
289 struct platform_device s3c_device_iis
= {
290 .name
= "s3c24xx-iis",
292 .num_resources
= ARRAY_SIZE(s3c_iis_resource
),
293 .resource
= s3c_iis_resource
,
295 .dma_mask
= &s3c_device_iis_dmamask
,
296 .coherent_dma_mask
= 0xffffffffUL
300 EXPORT_SYMBOL(s3c_device_iis
);
304 static struct resource s3c_rtc_resource
[] = {
306 .start
= S3C24XX_PA_RTC
,
307 .end
= S3C24XX_PA_RTC
+ 0xff,
308 .flags
= IORESOURCE_MEM
,
313 .flags
= IORESOURCE_IRQ
,
318 .flags
= IORESOURCE_IRQ
322 struct platform_device s3c_device_rtc
= {
323 .name
= "s3c2410-rtc",
325 .num_resources
= ARRAY_SIZE(s3c_rtc_resource
),
326 .resource
= s3c_rtc_resource
,
329 EXPORT_SYMBOL(s3c_device_rtc
);
333 static struct resource s3c_adc_resource
[] = {
335 .start
= S3C24XX_PA_ADC
,
336 .end
= S3C24XX_PA_ADC
+ S3C24XX_SZ_ADC
- 1,
337 .flags
= IORESOURCE_MEM
,
342 .flags
= IORESOURCE_IRQ
,
347 .flags
= IORESOURCE_IRQ
,
352 struct platform_device s3c_device_adc
= {
353 .name
= "s3c24xx-adc",
355 .num_resources
= ARRAY_SIZE(s3c_adc_resource
),
356 .resource
= s3c_adc_resource
,
361 static struct resource s3c_sdi_resource
[] = {
363 .start
= S3C24XX_PA_SDI
,
364 .end
= S3C24XX_PA_SDI
+ S3C24XX_SZ_SDI
- 1,
365 .flags
= IORESOURCE_MEM
,
370 .flags
= IORESOURCE_IRQ
,
375 struct platform_device s3c_device_sdi
= {
376 .name
= "s3c2410-sdi",
378 .num_resources
= ARRAY_SIZE(s3c_sdi_resource
),
379 .resource
= s3c_sdi_resource
,
382 EXPORT_SYMBOL(s3c_device_sdi
);
384 void __init
s3c24xx_mci_set_platdata(struct s3c24xx_mci_pdata
*pdata
)
386 struct s3c24xx_mci_pdata
*npd
;
388 npd
= kmemdup(pdata
, sizeof(struct s3c24xx_mci_pdata
), GFP_KERNEL
);
390 printk(KERN_ERR
"%s: no memory to copy pdata", __func__
);
392 s3c_device_sdi
.dev
.platform_data
= npd
;
398 static struct resource s3c_spi0_resource
[] = {
400 .start
= S3C24XX_PA_SPI
,
401 .end
= S3C24XX_PA_SPI
+ 0x1f,
402 .flags
= IORESOURCE_MEM
,
407 .flags
= IORESOURCE_IRQ
,
412 static u64 s3c_device_spi0_dmamask
= 0xffffffffUL
;
414 struct platform_device s3c_device_spi0
= {
415 .name
= "s3c2410-spi",
417 .num_resources
= ARRAY_SIZE(s3c_spi0_resource
),
418 .resource
= s3c_spi0_resource
,
420 .dma_mask
= &s3c_device_spi0_dmamask
,
421 .coherent_dma_mask
= 0xffffffffUL
425 EXPORT_SYMBOL(s3c_device_spi0
);
429 static struct resource s3c_spi1_resource
[] = {
431 .start
= S3C24XX_PA_SPI
+ S3C2410_SPI1
,
432 .end
= S3C24XX_PA_SPI
+ S3C2410_SPI1
+ 0x1f,
433 .flags
= IORESOURCE_MEM
,
438 .flags
= IORESOURCE_IRQ
,
443 static u64 s3c_device_spi1_dmamask
= 0xffffffffUL
;
445 struct platform_device s3c_device_spi1
= {
446 .name
= "s3c2410-spi",
448 .num_resources
= ARRAY_SIZE(s3c_spi1_resource
),
449 .resource
= s3c_spi1_resource
,
451 .dma_mask
= &s3c_device_spi1_dmamask
,
452 .coherent_dma_mask
= 0xffffffffUL
456 EXPORT_SYMBOL(s3c_device_spi1
);
458 #ifdef CONFIG_CPU_S3C2440
460 /* Camif Controller */
462 static struct resource s3c_camif_resource
[] = {
464 .start
= S3C2440_PA_CAMIF
,
465 .end
= S3C2440_PA_CAMIF
+ S3C2440_SZ_CAMIF
- 1,
466 .flags
= IORESOURCE_MEM
,
471 .flags
= IORESOURCE_IRQ
,
476 static u64 s3c_device_camif_dmamask
= 0xffffffffUL
;
478 struct platform_device s3c_device_camif
= {
479 .name
= "s3c2440-camif",
481 .num_resources
= ARRAY_SIZE(s3c_camif_resource
),
482 .resource
= s3c_camif_resource
,
484 .dma_mask
= &s3c_device_camif_dmamask
,
485 .coherent_dma_mask
= 0xffffffffUL
489 EXPORT_SYMBOL(s3c_device_camif
);
493 static struct resource s3c_ac97_resource
[] = {
495 .start
= S3C2440_PA_AC97
,
496 .end
= S3C2440_PA_AC97
+ S3C2440_SZ_AC97
-1,
497 .flags
= IORESOURCE_MEM
,
500 .start
= IRQ_S3C244x_AC97
,
501 .end
= IRQ_S3C244x_AC97
,
502 .flags
= IORESOURCE_IRQ
,
506 .start
= DMACH_PCM_OUT
,
507 .end
= DMACH_PCM_OUT
,
508 .flags
= IORESOURCE_DMA
,
512 .start
= DMACH_PCM_IN
,
514 .flags
= IORESOURCE_DMA
,
518 .start
= DMACH_MIC_IN
,
520 .flags
= IORESOURCE_DMA
,
524 static u64 s3c_device_audio_dmamask
= 0xffffffffUL
;
526 struct platform_device s3c_device_ac97
= {
527 .name
= "samsung-ac97",
529 .num_resources
= ARRAY_SIZE(s3c_ac97_resource
),
530 .resource
= s3c_ac97_resource
,
532 .dma_mask
= &s3c_device_audio_dmamask
,
533 .coherent_dma_mask
= 0xffffffffUL
537 EXPORT_SYMBOL(s3c_device_ac97
);
541 struct platform_device s3c2412_device_iis
= {
542 .name
= "s3c2412-iis",
545 .dma_mask
= &s3c_device_audio_dmamask
,
546 .coherent_dma_mask
= 0xffffffffUL
550 EXPORT_SYMBOL(s3c2412_device_iis
);
552 #endif // CONFIG_CPU_S32440