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>
This commit is contained in:
Geert Uytterhoeven 2011-08-18 14:45:57 +02:00
Родитель 6c490c4da4
Коммит bc7485acd0
2 изменённых файлов: 23 добавлений и 3 удалений

Просмотреть файл

@ -87,7 +87,6 @@ config MMU_SUN3
config USE_GENERIC_HARDIRQS config USE_GENERIC_HARDIRQS
bool "Use genirq" bool "Use genirq"
depends on MMU depends on MMU
depends on !APOLLO
depends on !SUN3X depends on !SUN3X
depends on !Q40 depends on !Q40
depends on !SUN3 depends on !SUN3

Просмотреть файл

@ -1,9 +1,14 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#ifdef CONFIG_GENERIC_HARDIRQS
#include <linux/irq.h>
#else
#include <asm/irq.h> #include <asm/irq.h>
#endif
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/apollohw.h> #include <asm/apollohw.h>
#ifndef CONFIG_GENERIC_HARDIRQS
void dn_process_int(unsigned int irq, struct pt_regs *fp) void dn_process_int(unsigned int irq, struct pt_regs *fp)
{ {
do_IRQ(irq, 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 *)(pica)=0x20;
*(volatile unsigned char *)(picb)=0x20; *(volatile unsigned char *)(picb)=0x20;
} }
#endif
unsigned int apollo_irq_startup(struct irq_data *data) 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)); *(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 = { static struct irq_chip apollo_irq_chip = {
.name = "apollo", .name = "apollo",
.irq_startup = apollo_irq_startup, .irq_startup = apollo_irq_startup,
.irq_shutdown = apollo_irq_shutdown, .irq_shutdown = apollo_irq_shutdown,
#ifdef CONFIG_GENERIC_HARDIRQS
.irq_eoi = apollo_irq_eoi,
#endif
}; };
void __init dn_init_IRQ(void) 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_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); IRQ_APOLLO, 16);
} }