22 #include <linux/device.h>
49 #include <mach/hardware.h>
50 #include <mach/platform.h>
65 #define VA_VIC_BASE __io_address(VERSATILE_VIC_BASE)
66 #define VA_SIC_BASE __io_address(VERSATILE_SIC_BASE)
69 #define IRQ_MMCI0A IRQ_VICSOURCE22
70 #define IRQ_AACI IRQ_VICSOURCE24
71 #define IRQ_ETH IRQ_VICSOURCE25
72 #define PIC_MASK 0xFFD00000
74 #define IRQ_MMCI0A IRQ_SIC_MMCI0A
75 #define IRQ_AACI IRQ_SIC_AACI
76 #define IRQ_ETH IRQ_SIC_ETH
82 { .compatible =
"arm,versatile-vic", },
86 static const struct of_device_id sic_of_match[] __initconst = {
139 #ifdef CONFIG_MACH_VERSATILE_AB
147 #ifdef CONFIG_DEBUG_LL
181 #define VERSATILE_FLASHCTRL (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_FLASH_OFFSET)
183 static void versatile_flash_set_vpp(
struct platform_device *pdev,
int on)
197 .set_vpp = versatile_flash_set_vpp,
200 static struct resource versatile_flash_resource = {
207 .name =
"physmap-flash",
210 .platform_data = &versatile_flash_data,
213 .resource = &versatile_flash_resource,
216 static struct resource smc91x_resources[] = {
232 .num_resources =
ARRAY_SIZE(smc91x_resources),
233 .resource = smc91x_resources,
236 static struct resource versatile_i2c_resource = {
243 .name =
"versatile-i2c",
246 .resource = &versatile_i2c_resource,
255 static int __init versatile_i2c_init(
void)
262 #define VERSATILE_SYSMCI (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_MCI_OFFSET)
284 static struct resource char_lcd_resources[] = {
293 .name =
"arm-charlcd",
295 .num_resources =
ARRAY_SIZE(char_lcd_resources),
296 .resource = char_lcd_resources,
302 static const struct icst_params versatile_oscvco_params = {
314 static void versatile_oscvco_set(
struct clk *
clk,
struct icst_vco vco)
320 val |= vco.
v | (vco.
r << 9) | (vco.
s << 16);
327 static const struct clk_ops osc4_clk_ops = {
330 .setvco = versatile_oscvco_set,
333 static struct clk osc4_clk = {
334 .ops = &osc4_clk_ops,
335 .params = &versatile_oscvco_params,
341 static struct clk ref24_clk = {
345 static struct clk sp804_clk = {
349 static struct clk dummy_apb_pclk;
353 .con_id =
"apb_pclk",
354 .clk = &dummy_apb_pclk,
394 #define SYS_CLCD_MODE_MASK (3 << 0)
395 #define SYS_CLCD_MODE_888 (0 << 0)
396 #define SYS_CLCD_MODE_5551 (1 << 0)
397 #define SYS_CLCD_MODE_565_RLSB (2 << 0)
398 #define SYS_CLCD_MODE_565_BLSB (3 << 0)
399 #define SYS_CLCD_NLCDIOON (1 << 2)
400 #define SYS_CLCD_VDDPOSSWITCH (1 << 3)
401 #define SYS_CLCD_PWR3V5SWITCH (1 << 4)
402 #define SYS_CLCD_ID_MASK (0x1f << 8)
403 #define SYS_CLCD_ID_SANYO_3_8 (0x00 << 8)
404 #define SYS_CLCD_ID_UNKNOWN_8_4 (0x01 << 8)
405 #define SYS_CLCD_ID_EPSON_2_2 (0x02 << 8)
406 #define SYS_CLCD_ID_SANYO_2_5 (0x07 << 8)
407 #define SYS_CLCD_ID_VGA (0x1f << 8)
409 static bool is_sanyo_2_5_lcd;
414 static void versatile_clcd_disable(
struct clcd_fb *
fb)
419 val =
readl(sys_clcd);
423 #ifdef CONFIG_MACH_VERSATILE_AB
427 if (machine_is_versatile_ab() && is_sanyo_2_5_lcd) {
431 ctrl =
readl(versatile_ib2_ctrl);
433 writel(ctrl, versatile_ib2_ctrl);
441 static void versatile_clcd_enable(
struct clcd_fb *
fb)
447 val =
readl(sys_clcd);
450 switch (var->
green.length) {
455 if (var->
red.offset == 0)
476 #ifdef CONFIG_MACH_VERSATILE_AB
480 if (machine_is_versatile_ab() && is_sanyo_2_5_lcd) {
484 ctrl =
readl(versatile_ib2_ctrl);
486 writel(ctrl, versatile_ib2_ctrl);
497 static int versatile_clcd_setup(
struct clcd_fb *fb)
500 const char *panel_name;
503 is_sanyo_2_5_lcd =
false;
507 panel_name =
"Sanyo TM38QV67A02A";
509 panel_name =
"Sanyo QVGA Portrait";
510 is_sanyo_2_5_lcd =
true;
512 panel_name =
"Epson L2F50113T00";
530 clcdfb_decode(fb, regs);
533 if (fb->
fb.var.green.length == 6)
540 .check = clcdfb_check,
541 .decode = versatile_clcd_decode,
542 .disable = versatile_clcd_disable,
543 .enable = versatile_clcd_enable,
544 .setup = versatile_clcd_setup,
565 #define AACI_IRQ { IRQ_AACI }
566 #define MMCI0_IRQ { IRQ_MMCI0A,IRQ_SIC_MMCI0B }
567 #define KMI0_IRQ { IRQ_SIC_KMI0 }
568 #define KMI1_IRQ { IRQ_SIC_KMI1 }
575 #define CLCD_IRQ { IRQ_CLCDINT }
576 #define DMAC_IRQ { IRQ_DMAINT }
582 #define WATCHDOG_IRQ { IRQ_WDOGINT }
583 #define GPIO0_IRQ { IRQ_GPIOINT0 }
584 #define GPIO1_IRQ { IRQ_GPIOINT1 }
585 #define RTC_IRQ { IRQ_RTCINT }
590 #define SCI_IRQ { IRQ_SCIINT }
591 #define UART0_IRQ { IRQ_UARTINT0 }
592 #define UART1_IRQ { IRQ_UARTINT1 }
593 #define UART2_IRQ { IRQ_UARTINT2 }
594 #define SSP_IRQ { IRQ_SSPINT }
598 APB_DEVICE(mmc0,
"fpga:05", MMCI0, &mmc0_plat_data);
605 AHB_DEVICE(clcd,
"dev:20", CLCD, &clcd_plat_data);
618 static struct amba_device *amba_devs[] __initdata = {
646 struct of_dev_auxdata versatile_auxdata_lookup[] __initdata = {
687 #define VA_LEDS_BASE (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_LED_OFFSET)
689 static void versatile_leds_event(led_event_t ledevt)
695 val =
readl(VA_LEDS_BASE);
718 writel(val, VA_LEDS_BASE);
765 #define TIMER0_VA_BASE __io_address(VERSATILE_TIMER0_1_BASE)
766 #define TIMER1_VA_BASE (__io_address(VERSATILE_TIMER0_1_BASE) + 0x20)
767 #define TIMER2_VA_BASE __io_address(VERSATILE_TIMER2_3_BASE)
768 #define TIMER3_VA_BASE (__io_address(VERSATILE_TIMER2_3_BASE) + 0x20)
773 static void __init versatile_timer_init(
void)
802 .init = versatile_timer_init,