diff options
Diffstat (limited to 'arch/arm/mach-omap2/irq.c')
-rw-r--r-- | arch/arm/mach-omap2/irq.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 65f1be6a182c..42b1d6591912 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
18 | #include <asm/exception.h> | ||
18 | #include <asm/mach/irq.h> | 19 | #include <asm/mach/irq.h> |
19 | 20 | ||
20 | 21 | ||
@@ -35,6 +36,11 @@ | |||
35 | /* Number of IRQ state bits in each MIR register */ | 36 | /* Number of IRQ state bits in each MIR register */ |
36 | #define IRQ_BITS_PER_REG 32 | 37 | #define IRQ_BITS_PER_REG 32 |
37 | 38 | ||
39 | #define OMAP2_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE) | ||
40 | #define OMAP3_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE) | ||
41 | #define INTCPS_SIR_IRQ_OFFSET 0x0040 /* omap2/3 active interrupt offset */ | ||
42 | #define ACTIVEIRQ_MASK 0x7f /* omap2/3 active interrupt bits */ | ||
43 | |||
38 | /* | 44 | /* |
39 | * OMAP2 has a number of different interrupt controllers, each interrupt | 45 | * OMAP2 has a number of different interrupt controllers, each interrupt |
40 | * controller is identified as its own "bank". Register definitions are | 46 | * controller is identified as its own "bank". Register definitions are |
@@ -143,6 +149,7 @@ omap_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num) | |||
143 | 149 | ||
144 | static void __init omap_init_irq(u32 base, int nr_irqs) | 150 | static void __init omap_init_irq(u32 base, int nr_irqs) |
145 | { | 151 | { |
152 | void __iomem *omap_irq_base; | ||
146 | unsigned long nr_of_irqs = 0; | 153 | unsigned long nr_of_irqs = 0; |
147 | unsigned int nr_banks = 0; | 154 | unsigned int nr_banks = 0; |
148 | int i, j; | 155 | int i, j; |
@@ -191,6 +198,44 @@ void __init ti816x_init_irq(void) | |||
191 | omap_init_irq(OMAP34XX_IC_BASE, 128); | 198 | omap_init_irq(OMAP34XX_IC_BASE, 128); |
192 | } | 199 | } |
193 | 200 | ||
201 | static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs *regs) | ||
202 | { | ||
203 | u32 irqnr; | ||
204 | |||
205 | do { | ||
206 | irqnr = readl_relaxed(base_addr + 0x98); | ||
207 | if (irqnr) | ||
208 | goto out; | ||
209 | |||
210 | irqnr = readl_relaxed(base_addr + 0xb8); | ||
211 | if (irqnr) | ||
212 | goto out; | ||
213 | |||
214 | irqnr = readl_relaxed(base_addr + 0xd8); | ||
215 | #ifdef CONFIG_SOC_OMAPTI816X | ||
216 | if (irqnr) | ||
217 | goto out; | ||
218 | irqnr = readl_relaxed(base_addr + 0xf8); | ||
219 | #endif | ||
220 | |||
221 | out: | ||
222 | if (!irqnr) | ||
223 | break; | ||
224 | |||
225 | irqnr = readl_relaxed(base_addr + INTCPS_SIR_IRQ_OFFSET); | ||
226 | irqnr &= ACTIVEIRQ_MASK; | ||
227 | |||
228 | if (irqnr) | ||
229 | handle_IRQ(irqnr, regs); | ||
230 | } while (irqnr); | ||
231 | } | ||
232 | |||
233 | asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs) | ||
234 | { | ||
235 | void __iomem *base_addr = OMAP2_IRQ_BASE; | ||
236 | omap_intc_handle_irq(base_addr, regs); | ||
237 | } | ||
238 | |||
194 | #ifdef CONFIG_ARCH_OMAP3 | 239 | #ifdef CONFIG_ARCH_OMAP3 |
195 | static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)]; | 240 | static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)]; |
196 | 241 | ||
@@ -263,4 +308,10 @@ void omap3_intc_resume_idle(void) | |||
263 | /* Re-enable autoidle */ | 308 | /* Re-enable autoidle */ |
264 | intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG); | 309 | intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG); |
265 | } | 310 | } |
311 | |||
312 | asmlinkage void __exception_irq_entry omap3_intc_handle_irq(struct pt_regs *regs) | ||
313 | { | ||
314 | void __iomem *base_addr = OMAP3_IRQ_BASE; | ||
315 | omap_intc_handle_irq(base_addr, regs); | ||
316 | } | ||
266 | #endif /* CONFIG_ARCH_OMAP3 */ | 317 | #endif /* CONFIG_ARCH_OMAP3 */ |