aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m68k/mac/baboon.c
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert@linux-m68k.org>2011-08-10 06:48:29 -0400
committerGeert Uytterhoeven <geert@linux-m68k.org>2011-11-08 16:35:50 -0500
commit9145db564eae98134de8eb8d64b47d7177eccfdd (patch)
tree7d0e25514abba33b6082f5a13963442cf390a058 /arch/m68k/mac/baboon.c
parentddc7fd25d09678f8252c0321ef4b66e8451abe7d (diff)
m68k/mac: Optimize interrupts using chain handlers
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Diffstat (limited to 'arch/m68k/mac/baboon.c')
-rw-r--r--arch/m68k/mac/baboon.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c
index ff11746b0621..425144cbfa7d 100644
--- a/arch/m68k/mac/baboon.c
+++ b/arch/m68k/mac/baboon.c
@@ -56,6 +56,39 @@ void __init baboon_init(void)
56 * Baboon interrupt handler. This works a lot like a VIA. 56 * Baboon interrupt handler. This works a lot like a VIA.
57 */ 57 */
58 58
59#ifdef CONFIG_GENERIC_HARDIRQS
60static void baboon_irq(unsigned int irq, struct irq_desc *desc)
61{
62 int irq_bit, irq_num;
63 unsigned char events;
64
65#ifdef DEBUG_IRQS
66 printk("baboon_irq: mb_control %02X mb_ifr %02X mb_status %02X\n",
67 (uint) baboon->mb_control, (uint) baboon->mb_ifr,
68 (uint) baboon->mb_status);
69#endif
70
71 events = baboon->mb_ifr & 0x07;
72 if (!events)
73 return;
74
75 irq_num = IRQ_BABOON_0;
76 irq_bit = 1;
77 do {
78 if (events & irq_bit) {
79 baboon->mb_ifr &= ~irq_bit;
80 generic_handle_irq(irq_num);
81 }
82 irq_bit <<= 1;
83 irq_num++;
84 } while(events >= irq_bit);
85#if 0
86 if (baboon->mb_ifr & 0x02) macide_ack_intr(NULL);
87 /* for now we need to smash all interrupts */
88 baboon->mb_ifr &= ~events;
89#endif
90}
91#else
59static irqreturn_t baboon_irq(int irq, void *dev_id) 92static irqreturn_t baboon_irq(int irq, void *dev_id)
60{ 93{
61 int irq_bit, irq_num; 94 int irq_bit, irq_num;
@@ -87,6 +120,7 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
87#endif 120#endif
88 return IRQ_HANDLED; 121 return IRQ_HANDLED;
89} 122}
123#endif
90 124
91/* 125/*
92 * Register the Baboon interrupt dispatcher on nubus slot $C. 126 * Register the Baboon interrupt dispatcher on nubus slot $C.
@@ -95,8 +129,12 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
95void __init baboon_register_interrupts(void) 129void __init baboon_register_interrupts(void)
96{ 130{
97 baboon_disabled = 0; 131 baboon_disabled = 0;
132#ifdef CONFIG_GENERIC_HARDIRQS
133 irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq);
134#else
98 if (request_irq(IRQ_NUBUS_C, baboon_irq, 0, "baboon", (void *)baboon)) 135 if (request_irq(IRQ_NUBUS_C, baboon_irq, 0, "baboon", (void *)baboon))
99 pr_err("Couldn't register baboon interrupt\n"); 136 pr_err("Couldn't register baboon interrupt\n");
137#endif
100} 138}
101 139
102/* 140/*