Commit 51890613f2bfa70453a5cc22c91c63946dd311cd
Committed by
Kyle McMartin
1 parent
d16cd297d2
Exists in
master
and in
4 other branches
parisc: convert the rest of the irq handlers to simple/percpu
The generic conversion eliminates the spurious no_ack and no_end routines, converts all the cascaded handlers to handle_simple_irq() and makes iosapic use a modified handle_percpu_irq() to become the same as the CPU irq's. This isn't an essential change, but it eliminates the mask/unmask overhead of handle_level_irq(). Signed-off-by: James Bottomley <James.Bottomley@suse.de> Tested-by: Helge Deller <deller@gmx.de> Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>
Showing 6 changed files with 12 additions and 11 deletions Side-by-side Diff
arch/parisc/kernel/irq.c
... | ... | @@ -75,9 +75,6 @@ |
75 | 75 | smp_send_all_nop(); |
76 | 76 | } |
77 | 77 | |
78 | -void no_ack_irq(unsigned int irq) { } | |
79 | -void no_end_irq(unsigned int irq) { } | |
80 | - | |
81 | 78 | void cpu_ack_irq(unsigned int irq) |
82 | 79 | { |
83 | 80 | unsigned long mask = EIEM_MASK(irq); |
... | ... | @@ -241,7 +238,7 @@ |
241 | 238 | |
242 | 239 | /* for iosapic interrupts */ |
243 | 240 | if (type) { |
244 | - set_irq_chip_and_handler(irq, type, handle_level_irq); | |
241 | + set_irq_chip_and_handler(irq, type, handle_percpu_irq); | |
245 | 242 | set_irq_chip_data(irq, data); |
246 | 243 | cpu_unmask_irq(irq); |
247 | 244 | } |
drivers/parisc/dino.c
drivers/parisc/eisa.c
... | ... | @@ -186,7 +186,6 @@ |
186 | 186 | .name = "EISA", |
187 | 187 | .unmask = eisa_unmask_irq, |
188 | 188 | .mask = eisa_mask_irq, |
189 | - .ack = no_ack_irq, | |
190 | 189 | }; |
191 | 190 | |
192 | 191 | static irqreturn_t eisa_irq(int wax_irq, void *intr_dev) |
... | ... | @@ -340,7 +339,7 @@ |
340 | 339 | setup_irq(2, &irq2_action); |
341 | 340 | for (i = 0; i < 16; i++) { |
342 | 341 | set_irq_chip_and_handler(i, &eisa_interrupt_type, |
343 | - handle_level_irq); | |
342 | + handle_simple_irq); | |
344 | 343 | } |
345 | 344 | |
346 | 345 | EISA_bus = 1; |
drivers/parisc/gsc.c
... | ... | @@ -143,7 +143,6 @@ |
143 | 143 | .name = "GSC-ASIC", |
144 | 144 | .unmask = gsc_asic_unmask_irq, |
145 | 145 | .mask = gsc_asic_mask_irq, |
146 | - .ack = no_ack_irq, | |
147 | 146 | }; |
148 | 147 | |
149 | 148 | int gsc_assign_irq(struct irq_chip *type, void *data) |
... | ... | @@ -153,7 +152,7 @@ |
153 | 152 | if (irq > GSC_IRQ_MAX) |
154 | 153 | return NO_IRQ; |
155 | 154 | |
156 | - set_irq_chip_and_handler(irq, type, handle_level_irq); | |
155 | + set_irq_chip_and_handler(irq, type, handle_simple_irq); | |
157 | 156 | set_irq_chip_data(irq, data); |
158 | 157 | |
159 | 158 | return irq++; |
drivers/parisc/iosapic.c
... | ... | @@ -669,6 +669,13 @@ |
669 | 669 | DBG(KERN_DEBUG "enable_irq(%d): eoi(%p, 0x%x)\n", irq, |
670 | 670 | vi->eoi_addr, vi->eoi_data); |
671 | 671 | iosapic_eoi(vi->eoi_addr, vi->eoi_data); |
672 | +} | |
673 | + | |
674 | +static void iosapic_eoi_irq(unsigned int irq) | |
675 | +{ | |
676 | + struct vector_info *vi = get_irq_chip_data(irq); | |
677 | + | |
678 | + iosapic_eoi(vi->eoi_addr, vi->eoi_data); | |
672 | 679 | cpu_eoi_irq(irq); |
673 | 680 | } |
674 | 681 | |
... | ... | @@ -705,6 +712,7 @@ |
705 | 712 | .unmask = iosapic_unmask_irq, |
706 | 713 | .mask = iosapic_mask_irq, |
707 | 714 | .ack = cpu_ack_irq, |
715 | + .eoi = iosapic_eoi_irq, | |
708 | 716 | #ifdef CONFIG_SMP |
709 | 717 | .set_affinity = iosapic_set_affinity_irq, |
710 | 718 | #endif |
drivers/parisc/superio.c
... | ... | @@ -323,7 +323,6 @@ |
323 | 323 | .name = SUPERIO, |
324 | 324 | .unmask = superio_unmask_irq, |
325 | 325 | .mask = superio_mask_irq, |
326 | - .ack = no_ack_irq, | |
327 | 326 | }; |
328 | 327 | |
329 | 328 | #ifdef DEBUG_SUPERIO_INIT |
... | ... | @@ -354,7 +353,7 @@ |
354 | 353 | #endif |
355 | 354 | |
356 | 355 | for (i = 0; i < 16; i++) { |
357 | - set_irq_chip_and_handler(i, &superio_interrupt_type, handle_level_irq); | |
356 | + set_irq_chip_and_handler(i, &superio_interrupt_type, handle_simple_irq); | |
358 | 357 | } |
359 | 358 | |
360 | 359 | /* |