diff options
author | Geert Uytterhoeven <geert@linux-m68k.org> | 2011-08-18 14:45:57 +0200 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2011-12-26 22:02:25 +0800 |
commit | f184653754c6809c7711e6474611f25e342508ae (patch) | |
tree | ba2856fb965b45f84ab13dc88c212a9fefca0c8a /arch/m68k/apollo/dn_ints.c | |
parent | d54876a99430063c202950516c00578566031ec3 (diff) |
m68k/apollo: Convert Apollo to genirq
Replace the custom user vector interrupt handler that calls do_IRQ() and
does an EOI by handle_fasteoi_irq().
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Peter De Schrijver <p2@debian.org>
Diffstat (limited to 'arch/m68k/apollo/dn_ints.c')
-rw-r--r-- | arch/m68k/apollo/dn_ints.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c index 4b764312aed..fc190b34b62 100644 --- a/arch/m68k/apollo/dn_ints.c +++ b/arch/m68k/apollo/dn_ints.c @@ -1,9 +1,14 @@ #include <linux/interrupt.h> - +#ifdef CONFIG_GENERIC_HARDIRQS +#include <linux/irq.h> +#else #include <asm/irq.h> +#endif + #include <asm/traps.h> #include <asm/apollohw.h> +#ifndef CONFIG_GENERIC_HARDIRQS void dn_process_int(unsigned int irq, struct pt_regs *fp) { do_IRQ(irq, fp); @@ -11,6 +16,7 @@ void dn_process_int(unsigned int irq, struct pt_regs *fp) *(volatile unsigned char *)(pica)=0x20; *(volatile unsigned char *)(picb)=0x20; } +#endif unsigned int apollo_irq_startup(struct irq_data *data) { @@ -33,16 +39,31 @@ void apollo_irq_shutdown(struct irq_data *data) *(volatile unsigned char *)(picb+1) |= (1 << (irq - 8)); } +#ifdef CONFIG_GENERIC_HARDIRQS +void apollo_irq_eoi(struct irq_data *data) +{ + *(volatile unsigned char *)(pica) = 0x20; + *(volatile unsigned char *)(picb) = 0x20; +} +#endif + static struct irq_chip apollo_irq_chip = { .name = "apollo", .irq_startup = apollo_irq_startup, .irq_shutdown = apollo_irq_shutdown, +#ifdef CONFIG_GENERIC_HARDIRQS + .irq_eoi = apollo_irq_eoi, +#endif }; void __init dn_init_IRQ(void) { +#ifdef CONFIG_GENERIC_HARDIRQS + m68k_setup_user_interrupt(VEC_USER + 96, 16, NULL); +#else m68k_setup_user_interrupt(VEC_USER + 96, 16, dn_process_int); - m68k_setup_irq_controller(&apollo_irq_chip, handle_simple_irq, +#endif + m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq, IRQ_APOLLO, 16); } |