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 <asm/mach/arch.h>
24 #include <asm/mach/map.h>
25 #include <asm/mach/irq.h>
26 #include <asm/arch/fb.h>
27 #include <asm/hardware.h>
31 #include <asm/plat-s3c/regs-serial.h>
32 #include <asm/plat-s3c24xx/udc.h>
34 #include <asm/plat-s3c24xx/devs.h>
35 #include <asm/plat-s3c24xx/cpu.h>
36 #include <asm/plat-s3c24xx/regs-spi.h>
38 /* Serial port registrations */
40 static struct resource s3c2410_uart0_resource
[] = {
42 .start
= S3C2410_PA_UART0
,
43 .end
= S3C2410_PA_UART0
+ 0x3fff,
44 .flags
= IORESOURCE_MEM
,
47 .start
= IRQ_S3CUART_RX0
,
48 .end
= IRQ_S3CUART_ERR0
,
49 .flags
= IORESOURCE_IRQ
,
53 static struct resource s3c2410_uart1_resource
[] = {
55 .start
= S3C2410_PA_UART1
,
56 .end
= S3C2410_PA_UART1
+ 0x3fff,
57 .flags
= IORESOURCE_MEM
,
60 .start
= IRQ_S3CUART_RX1
,
61 .end
= IRQ_S3CUART_ERR1
,
62 .flags
= IORESOURCE_IRQ
,
66 static struct resource s3c2410_uart2_resource
[] = {
68 .start
= S3C2410_PA_UART2
,
69 .end
= S3C2410_PA_UART2
+ 0x3fff,
70 .flags
= IORESOURCE_MEM
,
73 .start
= IRQ_S3CUART_RX2
,
74 .end
= IRQ_S3CUART_ERR2
,
75 .flags
= IORESOURCE_IRQ
,
79 struct s3c24xx_uart_resources s3c2410_uart_resources
[] __initdata
= {
81 .resources
= s3c2410_uart0_resource
,
82 .nr_resources
= ARRAY_SIZE(s3c2410_uart0_resource
),
85 .resources
= s3c2410_uart1_resource
,
86 .nr_resources
= ARRAY_SIZE(s3c2410_uart1_resource
),
89 .resources
= s3c2410_uart2_resource
,
90 .nr_resources
= ARRAY_SIZE(s3c2410_uart2_resource
),
96 static struct platform_device s3c24xx_uart_device0
= {
100 static struct platform_device s3c24xx_uart_device1
= {
104 static struct platform_device s3c24xx_uart_device2
= {
108 struct platform_device
*s3c24xx_uart_src
[3] = {
109 &s3c24xx_uart_device0
,
110 &s3c24xx_uart_device1
,
111 &s3c24xx_uart_device2
,
114 struct platform_device
*s3c24xx_uart_devs
[3] = {
117 /* USB Host Controller */
119 static struct resource s3c_usb_resource
[] = {
121 .start
= S3C24XX_PA_USBHOST
,
122 .end
= S3C24XX_PA_USBHOST
+ S3C24XX_SZ_USBHOST
- 1,
123 .flags
= IORESOURCE_MEM
,
128 .flags
= IORESOURCE_IRQ
,
132 static u64 s3c_device_usb_dmamask
= 0xffffffffUL
;
134 struct platform_device s3c_device_usb
= {
135 .name
= "s3c2410-ohci",
137 .num_resources
= ARRAY_SIZE(s3c_usb_resource
),
138 .resource
= s3c_usb_resource
,
140 .dma_mask
= &s3c_device_usb_dmamask
,
141 .coherent_dma_mask
= 0xffffffffUL
145 EXPORT_SYMBOL(s3c_device_usb
);
149 static struct resource s3c_lcd_resource
[] = {
151 .start
= S3C24XX_PA_LCD
,
152 .end
= S3C24XX_PA_LCD
+ S3C24XX_SZ_LCD
- 1,
153 .flags
= IORESOURCE_MEM
,
158 .flags
= IORESOURCE_IRQ
,
163 static u64 s3c_device_lcd_dmamask
= 0xffffffffUL
;
165 struct platform_device s3c_device_lcd
= {
166 .name
= "s3c2410-lcd",
168 .num_resources
= ARRAY_SIZE(s3c_lcd_resource
),
169 .resource
= s3c_lcd_resource
,
171 .dma_mask
= &s3c_device_lcd_dmamask
,
172 .coherent_dma_mask
= 0xffffffffUL
176 EXPORT_SYMBOL(s3c_device_lcd
);
178 void __init
s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info
*pd
)
180 struct s3c2410fb_mach_info
*npd
;
182 npd
= kmalloc(sizeof(*npd
), GFP_KERNEL
);
184 memcpy(npd
, pd
, sizeof(*npd
));
185 s3c_device_lcd
.dev
.platform_data
= npd
;
187 printk(KERN_ERR
"no memory for LCD platform data\n");
191 /* NAND Controller */
193 static struct resource s3c_nand_resource
[] = {
195 .start
= S3C2410_PA_NAND
,
196 .end
= S3C2410_PA_NAND
+ S3C24XX_SZ_NAND
- 1,
197 .flags
= IORESOURCE_MEM
,
201 struct platform_device s3c_device_nand
= {
202 .name
= "s3c2410-nand",
204 .num_resources
= ARRAY_SIZE(s3c_nand_resource
),
205 .resource
= s3c_nand_resource
,
208 EXPORT_SYMBOL(s3c_device_nand
);
210 /* USB Device (Gadget)*/
212 static struct resource s3c_usbgadget_resource
[] = {
214 .start
= S3C24XX_PA_USBDEV
,
215 .end
= S3C24XX_PA_USBDEV
+ S3C24XX_SZ_USBDEV
- 1,
216 .flags
= IORESOURCE_MEM
,
221 .flags
= IORESOURCE_IRQ
,
226 struct platform_device s3c_device_usbgadget
= {
227 .name
= "s3c2410-usbgadget",
229 .num_resources
= ARRAY_SIZE(s3c_usbgadget_resource
),
230 .resource
= s3c_usbgadget_resource
,
233 EXPORT_SYMBOL(s3c_device_usbgadget
);
235 void __init
s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info
*pd
)
237 struct s3c2410_udc_mach_info
*npd
;
239 npd
= kmalloc(sizeof(*npd
), GFP_KERNEL
);
241 memcpy(npd
, pd
, sizeof(*npd
));
242 s3c_device_usbgadget
.dev
.platform_data
= npd
;
244 printk(KERN_ERR
"no memory for udc platform data\n");
251 static struct resource s3c_wdt_resource
[] = {
253 .start
= S3C24XX_PA_WATCHDOG
,
254 .end
= S3C24XX_PA_WATCHDOG
+ S3C24XX_SZ_WATCHDOG
- 1,
255 .flags
= IORESOURCE_MEM
,
260 .flags
= IORESOURCE_IRQ
,
265 struct platform_device s3c_device_wdt
= {
266 .name
= "s3c2410-wdt",
268 .num_resources
= ARRAY_SIZE(s3c_wdt_resource
),
269 .resource
= s3c_wdt_resource
,
272 EXPORT_SYMBOL(s3c_device_wdt
);
276 static struct resource s3c_i2c_resource
[] = {
278 .start
= S3C24XX_PA_IIC
,
279 .end
= S3C24XX_PA_IIC
+ S3C24XX_SZ_IIC
- 1,
280 .flags
= IORESOURCE_MEM
,
285 .flags
= IORESOURCE_IRQ
,
290 struct platform_device s3c_device_i2c
= {
291 .name
= "s3c2410-i2c",
293 .num_resources
= ARRAY_SIZE(s3c_i2c_resource
),
294 .resource
= s3c_i2c_resource
,
297 EXPORT_SYMBOL(s3c_device_i2c
);
301 static struct resource s3c_iis_resource
[] = {
303 .start
= S3C24XX_PA_IIS
,
304 .end
= S3C24XX_PA_IIS
+ S3C24XX_SZ_IIS
-1,
305 .flags
= IORESOURCE_MEM
,
309 static u64 s3c_device_iis_dmamask
= 0xffffffffUL
;
311 struct platform_device s3c_device_iis
= {
312 .name
= "s3c2410-iis",
314 .num_resources
= ARRAY_SIZE(s3c_iis_resource
),
315 .resource
= s3c_iis_resource
,
317 .dma_mask
= &s3c_device_iis_dmamask
,
318 .coherent_dma_mask
= 0xffffffffUL
322 EXPORT_SYMBOL(s3c_device_iis
);
326 static struct resource s3c_rtc_resource
[] = {
328 .start
= S3C24XX_PA_RTC
,
329 .end
= S3C24XX_PA_RTC
+ 0xff,
330 .flags
= IORESOURCE_MEM
,
335 .flags
= IORESOURCE_IRQ
,
340 .flags
= IORESOURCE_IRQ
344 struct platform_device s3c_device_rtc
= {
345 .name
= "s3c2410-rtc",
347 .num_resources
= ARRAY_SIZE(s3c_rtc_resource
),
348 .resource
= s3c_rtc_resource
,
351 EXPORT_SYMBOL(s3c_device_rtc
);
355 static struct resource s3c_adc_resource
[] = {
357 .start
= S3C24XX_PA_ADC
,
358 .end
= S3C24XX_PA_ADC
+ S3C24XX_SZ_ADC
- 1,
359 .flags
= IORESOURCE_MEM
,
364 .flags
= IORESOURCE_IRQ
,
369 .flags
= IORESOURCE_IRQ
,
374 struct platform_device s3c_device_adc
= {
375 .name
= "s3c2410-adc",
377 .num_resources
= ARRAY_SIZE(s3c_adc_resource
),
378 .resource
= s3c_adc_resource
,
383 static struct resource s3c_sdi_resource
[] = {
385 .start
= S3C2410_PA_SDI
,
386 .end
= S3C2410_PA_SDI
+ S3C24XX_SZ_SDI
- 1,
387 .flags
= IORESOURCE_MEM
,
392 .flags
= IORESOURCE_IRQ
,
397 struct platform_device s3c_device_sdi
= {
398 .name
= "s3c2410-sdi",
400 .num_resources
= ARRAY_SIZE(s3c_sdi_resource
),
401 .resource
= s3c_sdi_resource
,
404 EXPORT_SYMBOL(s3c_device_sdi
);
406 /* High-speed MMC/SD */
408 static struct resource s3c_hsmmc_resource
[] = {
410 .start
= S3C2443_PA_HSMMC
,
411 .end
= S3C2443_PA_HSMMC
+ S3C2443_SZ_HSMMC
- 1,
412 .flags
= IORESOURCE_MEM
,
415 .start
= IRQ_S3C2443_HSMMC
,
416 .end
= IRQ_S3C2443_HSMMC
,
417 .flags
= IORESOURCE_IRQ
,
421 static u64 s3c_device_hsmmc_dmamask
= 0xffffffffUL
;
423 struct platform_device s3c_device_hsmmc
= {
426 .num_resources
= ARRAY_SIZE(s3c_hsmmc_resource
),
427 .resource
= s3c_hsmmc_resource
,
429 .dma_mask
= &s3c_device_hsmmc_dmamask
,
430 .coherent_dma_mask
= 0xffffffffUL
438 static struct resource s3c_spi0_resource
[] = {
440 .start
= S3C24XX_PA_SPI
,
441 .end
= S3C24XX_PA_SPI
+ 0x1f,
442 .flags
= IORESOURCE_MEM
,
447 .flags
= IORESOURCE_IRQ
,
452 static u64 s3c_device_spi0_dmamask
= 0xffffffffUL
;
454 struct platform_device s3c_device_spi0
= {
455 .name
= "s3c2410-spi",
457 .num_resources
= ARRAY_SIZE(s3c_spi0_resource
),
458 .resource
= s3c_spi0_resource
,
460 .dma_mask
= &s3c_device_spi0_dmamask
,
461 .coherent_dma_mask
= 0xffffffffUL
465 EXPORT_SYMBOL(s3c_device_spi0
);
469 static struct resource s3c_spi1_resource
[] = {
471 .start
= S3C24XX_PA_SPI
+ S3C2410_SPI1
,
472 .end
= S3C24XX_PA_SPI
+ S3C2410_SPI1
+ 0x1f,
473 .flags
= IORESOURCE_MEM
,
478 .flags
= IORESOURCE_IRQ
,
483 static u64 s3c_device_spi1_dmamask
= 0xffffffffUL
;
485 struct platform_device s3c_device_spi1
= {
486 .name
= "s3c2410-spi",
488 .num_resources
= ARRAY_SIZE(s3c_spi1_resource
),
489 .resource
= s3c_spi1_resource
,
491 .dma_mask
= &s3c_device_spi1_dmamask
,
492 .coherent_dma_mask
= 0xffffffffUL
496 EXPORT_SYMBOL(s3c_device_spi1
);
498 /* pwm timer blocks */
500 static struct resource s3c_timer0_resource
[] = {
502 .start
= S3C24XX_PA_TIMER
+ 0x0C,
503 .end
= S3C24XX_PA_TIMER
+ 0x0C + 0xB,
504 .flags
= IORESOURCE_MEM
,
509 .flags
= IORESOURCE_IRQ
,
514 struct platform_device s3c_device_timer0
= {
515 .name
= "s3c2410-timer",
517 .num_resources
= ARRAY_SIZE(s3c_timer0_resource
),
518 .resource
= s3c_timer0_resource
,
521 EXPORT_SYMBOL(s3c_device_timer0
);
525 static struct resource s3c_timer1_resource
[] = {
527 .start
= S3C24XX_PA_TIMER
+ 0x18,
528 .end
= S3C24XX_PA_TIMER
+ 0x23,
529 .flags
= IORESOURCE_MEM
,
534 .flags
= IORESOURCE_IRQ
,
539 struct platform_device s3c_device_timer1
= {
540 .name
= "s3c2410-timer",
542 .num_resources
= ARRAY_SIZE(s3c_timer1_resource
),
543 .resource
= s3c_timer1_resource
,
546 EXPORT_SYMBOL(s3c_device_timer1
);
550 static struct resource s3c_timer2_resource
[] = {
552 .start
= S3C24XX_PA_TIMER
+ 0x24,
553 .end
= S3C24XX_PA_TIMER
+ 0x2F,
554 .flags
= IORESOURCE_MEM
,
559 .flags
= IORESOURCE_IRQ
,
564 struct platform_device s3c_device_timer2
= {
565 .name
= "s3c2410-timer",
567 .num_resources
= ARRAY_SIZE(s3c_timer2_resource
),
568 .resource
= s3c_timer2_resource
,
571 EXPORT_SYMBOL(s3c_device_timer2
);
575 static struct resource s3c_timer3_resource
[] = {
577 .start
= S3C24XX_PA_TIMER
+ 0x30,
578 .end
= S3C24XX_PA_TIMER
+ 0x3B,
579 .flags
= IORESOURCE_MEM
,
584 .flags
= IORESOURCE_IRQ
,
589 struct platform_device s3c_device_timer3
= {
590 .name
= "s3c2410-timer",
592 .num_resources
= ARRAY_SIZE(s3c_timer3_resource
),
593 .resource
= s3c_timer3_resource
,
596 EXPORT_SYMBOL(s3c_device_timer3
);
598 #ifdef CONFIG_CPU_S3C2440
600 /* Camif Controller */
602 static struct resource s3c_camif_resource
[] = {
604 .start
= S3C2440_PA_CAMIF
,
605 .end
= S3C2440_PA_CAMIF
+ S3C2440_SZ_CAMIF
- 1,
606 .flags
= IORESOURCE_MEM
,
611 .flags
= IORESOURCE_IRQ
,
616 static u64 s3c_device_camif_dmamask
= 0xffffffffUL
;
618 struct platform_device s3c_device_camif
= {
619 .name
= "s3c2440-camif",
621 .num_resources
= ARRAY_SIZE(s3c_camif_resource
),
622 .resource
= s3c_camif_resource
,
624 .dma_mask
= &s3c_device_camif_dmamask
,
625 .coherent_dma_mask
= 0xffffffffUL
629 EXPORT_SYMBOL(s3c_device_camif
);
631 #endif // CONFIG_CPU_S32440