2 * linux/arch/arm/mach-pxa/mainstone.c
4 * Support for the Intel HCDDBBVA0 Development Platform.
5 * (go figure how they came up with such name...)
7 * Author: Nicolas Pitre
8 * Created: Nov 05, 2002
9 * Copyright: MontaVista Software Inc.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
16 #include <linux/init.h>
17 #include <linux/device.h>
18 #include <linux/interrupt.h>
19 #include <linux/sched.h>
20 #include <linux/bitops.h>
23 #include <asm/types.h>
24 #include <asm/setup.h>
25 #include <asm/memory.h>
26 #include <asm/mach-types.h>
27 #include <asm/hardware.h>
30 #include <asm/mach/arch.h>
31 #include <asm/mach/map.h>
32 #include <asm/mach/irq.h>
34 #include <asm/arch/mainstone.h>
35 #include <asm/arch/pxafb.h>
40 static unsigned long mainstone_irq_enabled;
42 static void mainstone_mask_irq(unsigned int irq)
44 int mainstone_irq = (irq - MAINSTONE_IRQ(0));
45 MST_INTMSKENA = (mainstone_irq_enabled &= ~(1 << mainstone_irq));
48 static void mainstone_unmask_irq(unsigned int irq)
50 int mainstone_irq = (irq - MAINSTONE_IRQ(0));
51 /* the irq can be acknowledged only if deasserted, so it's done here */
52 MST_INTSETCLR &= ~(1 << mainstone_irq);
53 MST_INTMSKENA = (mainstone_irq_enabled |= (1 << mainstone_irq));
56 static struct irqchip mainstone_irq_chip = {
57 .ack = mainstone_mask_irq,
58 .mask = mainstone_mask_irq,
59 .unmask = mainstone_unmask_irq,
63 static void mainstone_irq_handler(unsigned int irq, struct irqdesc *desc,
66 unsigned long pending = MST_INTSETCLR & mainstone_irq_enabled;
68 GEDR(0) = GPIO_bit(0); /* clear useless edge notification */
69 if (likely(pending)) {
70 irq = MAINSTONE_IRQ(0) + __ffs(pending);
71 desc = irq_desc + irq;
72 desc->handle(irq, desc, regs);
74 pending = MST_INTSETCLR & mainstone_irq_enabled;
78 static void __init mainstone_init_irq(void)
84 /* setup extra Mainstone irqs */
85 for(irq = MAINSTONE_IRQ(0); irq <= MAINSTONE_IRQ(15); irq++) {
86 set_irq_chip(irq, &mainstone_irq_chip);
87 set_irq_handler(irq, do_level_IRQ);
88 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
90 set_irq_flags(MAINSTONE_IRQ(8), 0);
91 set_irq_flags(MAINSTONE_IRQ(12), 0);
96 set_irq_chained_handler(IRQ_GPIO(0), mainstone_irq_handler);
97 set_irq_type(IRQ_GPIO(0), IRQT_FALLING);
101 static struct resource smc91x_resources[] = {
103 .start = (MST_ETH_PHYS + 0x300),
104 .end = (MST_ETH_PHYS + 0xfffff),
105 .flags = IORESOURCE_MEM,
108 .start = MAINSTONE_IRQ(3),
109 .end = MAINSTONE_IRQ(3),
110 .flags = IORESOURCE_IRQ,
114 static struct platform_device smc91x_device = {
117 .num_resources = ARRAY_SIZE(smc91x_resources),
118 .resource = smc91x_resources,
122 static void mainstone_backlight_power(int on)
125 pxa_gpio_mode(GPIO16_PWM0_MD);
126 pxa_set_cken(CKEN0_PWM0, 1);
134 pxa_set_cken(CKEN0_PWM0, 0);
138 static struct pxafb_mach_info toshiba_ltm04c380k __initdata = {
149 .sync = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,
152 .pxafb_backlight_power = mainstone_backlight_power,
155 static struct pxafb_mach_info toshiba_ltm035a776c __initdata = {
166 .sync = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,
169 .pxafb_backlight_power = mainstone_backlight_power,
172 static void __init mainstone_init(void)
174 platform_device_register(&smc91x_device);
176 /* reading Mainstone's "Virtual Configuration Register"
177 might be handy to select LCD type here */
179 set_pxa_fb_info(&toshiba_ltm04c380k);
181 set_pxa_fb_info(&toshiba_ltm035a776c);
185 static struct map_desc mainstone_io_desc[] __initdata = {
186 { MST_FPGA_VIRT, MST_FPGA_PHYS, 0x00100000, MT_DEVICE }, /* CPLD */
189 static void __init mainstone_map_io(void)
192 iotable_init(mainstone_io_desc, ARRAY_SIZE(mainstone_io_desc));
195 MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
196 MAINTAINER("MontaVista Software Inc.")
197 BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
198 MAPIO(mainstone_map_io)
199 INITIRQ(mainstone_init_irq)
200 INITTIME(pxa_init_time)
201 INIT_MACHINE(mainstone_init)