diff options
author | Geert Uytterhoeven <geert@linux-m68k.org> | 2011-08-10 06:48:29 -0400 |
---|---|---|
committer | Geert Uytterhoeven <geert@linux-m68k.org> | 2011-11-08 16:35:50 -0500 |
commit | 9145db564eae98134de8eb8d64b47d7177eccfdd (patch) | |
tree | 7d0e25514abba33b6082f5a13963442cf390a058 /arch/m68k/mac/baboon.c | |
parent | ddc7fd25d09678f8252c0321ef4b66e8451abe7d (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.c | 38 |
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 | ||
60 | static 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 | ||
59 | static irqreturn_t baboon_irq(int irq, void *dev_id) | 92 | static 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) | |||
95 | void __init baboon_register_interrupts(void) | 129 | void __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 | /* |