Commit 51890613f2bfa70453a5cc22c91c63946dd311cd
Committed by
Kyle McMartin
1 parent
d16cd297d2
Exists in
master
and in
7 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 | /* |