2 * linux/arch/arm/mach-lpc22xx/irq.c
4 * Copyright (C) 2004 Philips Semiconductors
7 #include <linux/types.h>
8 #include <linux/sched.h>
9 #include <linux/interrupt.h>
10 #include <linux/types.h>
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/list.h>
14 #include <linux/device.h>
15 #include <linux/slab.h>
16 #include <linux/string.h>
17 #include <linux/sysdev.h>
19 #include <asm/hardware.h>
22 #include <asm/setup.h>
23 #include <asm/mach-types.h>
25 #include <asm/mach/arch.h>
26 #include <asm/mach/irq.h>
27 #include <asm/mach/map.h>
29 void __inline__
lpc22xx_mask_irq(unsigned int irq
)
31 VICIntEnClr
= 1 << irq
;
34 void __inline__
lpc22xx_unmask_irq(unsigned int irq
)
36 VICIntEnable
|= 1 << irq
;
39 /* Clear pending bit */
40 void __inline__
lpc22xx_clear_pb(unsigned int irq
)
42 /* write any thing to VICVectAddr */
44 /* clear external interrupt */
48 void __inline__
lpc22xx_mask_ack_irq(unsigned int irq
)
51 lpc22xx_clear_pb(irq
);
52 lpc22xx_mask_irq(irq
);
56 /* YOU CAN CHANGE THIS ROUTINE FOR SPEED UP */
57 __inline__
unsigned int fixup_irq (int irq
)
59 lpc22xx_clear_pb(irq
);
63 static struct irqchip lpc22xx_chip
= {
64 .ack
= lpc22xx_mask_ack_irq
,
65 .mask
= lpc22xx_mask_irq
,
66 .unmask
= lpc22xx_unmask_irq
,
70 static unsigned long ic_irq_enable
;
72 static int irq_suspend(struct sys_device
*dev
, u32 state
)
77 static int irq_resume(struct sys_device
*dev
)
79 /* disable all irq sources */
83 #define irq_suspend NULL
84 #define irq_resume NULL
87 static struct sysdev_class irq_class
= {
89 .suspend
= irq_suspend
,
93 static struct sys_device irq_device
= {
98 static int __init
irq_init_sysfs(void)
100 int ret
= sysdev_class_register(&irq_class
);
102 ret
= sysdev_register(&irq_device
);
106 device_initcall(irq_init_sysfs
);
108 void __init
lpc22xx_init_irq(void)
112 for (irq
= 0; irq
< NR_IRQS
; irq
++) {
113 set_irq_chip(irq
, &lpc22xx_chip
);
114 set_irq_handler(irq
, do_level_IRQ
);
115 if(irq
>= LPC22xx_INTERRUPT_EINT0
&& irq
<= LPC22xx_INTERRUPT_EINT3
)
116 set_irq_flags(irq
, IRQF_VALID
| IRQF_PROBE
| IRQF_NOAUTOEN
);
118 set_irq_flags(irq
, IRQF_VALID
| IRQF_PROBE
);
121 /* mask and disable all further interrupts */
122 VICIntEnClr
= 0xFFFFFFFF;
124 /* set all to IRQ mode, not FIQ */
125 VICIntSelect
= 0x00000000;
127 /* Clear Intrerrupt pending register */
128 VICVectAddr
= 0x00000000;
130 /* Set external interrupts*/
131 /* These should be different with your board */
132 /* ext2: for ethernet controller rtl8019as */
133 EXTMODE
= 0x04; // set ext2 edge sensitive
134 EXTPOLAR
= 0x04; // set ext2 rising edge effective
135 EXTINT
= 0x04; // clear flags