diff options
| author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2010-12-02 21:01:05 -0500 |
|---|---|---|
| committer | Kyle McMartin <kyle@mcmartin.ca> | 2010-12-04 11:15:19 -0500 |
| commit | 51890613f2bfa70453a5cc22c91c63946dd311cd (patch) | |
| tree | 72450f5f53939d42444f260708fa6639c41a8904 | |
| parent | d16cd297d288e48482c3c261db434a2e13bd9f20 (diff) | |
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>
| -rw-r--r-- | arch/parisc/kernel/irq.c | 5 | ||||
| -rw-r--r-- | drivers/parisc/dino.c | 1 | ||||
| -rw-r--r-- | drivers/parisc/eisa.c | 3 | ||||
| -rw-r--r-- | drivers/parisc/gsc.c | 3 | ||||
| -rw-r--r-- | drivers/parisc/iosapic.c | 8 | ||||
| -rw-r--r-- | drivers/parisc/superio.c | 3 |
6 files changed, 12 insertions, 11 deletions
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 48aa71106db8..d7d94b845dc2 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
| @@ -75,9 +75,6 @@ static void cpu_unmask_irq(unsigned int irq) | |||
| 75 | smp_send_all_nop(); | 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 | void cpu_ack_irq(unsigned int irq) | 78 | void cpu_ack_irq(unsigned int irq) |
| 82 | { | 79 | { |
| 83 | unsigned long mask = EIEM_MASK(irq); | 80 | unsigned long mask = EIEM_MASK(irq); |
| @@ -241,7 +238,7 @@ int cpu_claim_irq(unsigned int irq, struct irq_chip *type, void *data) | |||
| 241 | 238 | ||
| 242 | /* for iosapic interrupts */ | 239 | /* for iosapic interrupts */ |
| 243 | if (type) { | 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 | set_irq_chip_data(irq, data); | 242 | set_irq_chip_data(irq, data); |
| 246 | cpu_unmask_irq(irq); | 243 | cpu_unmask_irq(irq); |
| 247 | } | 244 | } |
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index d9f51485beee..9383063d2b16 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c | |||
| @@ -349,7 +349,6 @@ static struct irq_chip dino_interrupt_type = { | |||
| 349 | .name = "GSC-PCI", | 349 | .name = "GSC-PCI", |
| 350 | .unmask = dino_unmask_irq, | 350 | .unmask = dino_unmask_irq, |
| 351 | .mask = dino_mask_irq, | 351 | .mask = dino_mask_irq, |
| 352 | .ack = no_ack_irq, | ||
| 353 | }; | 352 | }; |
| 354 | 353 | ||
| 355 | 354 | ||
diff --git a/drivers/parisc/eisa.c b/drivers/parisc/eisa.c index 1211974f55aa..e860038b0b84 100644 --- a/drivers/parisc/eisa.c +++ b/drivers/parisc/eisa.c | |||
| @@ -186,7 +186,6 @@ static struct irq_chip eisa_interrupt_type = { | |||
| 186 | .name = "EISA", | 186 | .name = "EISA", |
| 187 | .unmask = eisa_unmask_irq, | 187 | .unmask = eisa_unmask_irq, |
| 188 | .mask = eisa_mask_irq, | 188 | .mask = eisa_mask_irq, |
| 189 | .ack = no_ack_irq, | ||
| 190 | }; | 189 | }; |
| 191 | 190 | ||
| 192 | static irqreturn_t eisa_irq(int wax_irq, void *intr_dev) | 191 | static irqreturn_t eisa_irq(int wax_irq, void *intr_dev) |
| @@ -340,7 +339,7 @@ static int __init eisa_probe(struct parisc_device *dev) | |||
| 340 | setup_irq(2, &irq2_action); | 339 | setup_irq(2, &irq2_action); |
| 341 | for (i = 0; i < 16; i++) { | 340 | for (i = 0; i < 16; i++) { |
| 342 | set_irq_chip_and_handler(i, &eisa_interrupt_type, | 341 | set_irq_chip_and_handler(i, &eisa_interrupt_type, |
| 343 | handle_level_irq); | 342 | handle_simple_irq); |
| 344 | } | 343 | } |
| 345 | 344 | ||
| 346 | EISA_bus = 1; | 345 | EISA_bus = 1; |
diff --git a/drivers/parisc/gsc.c b/drivers/parisc/gsc.c index e605298e3aee..772b1939ac21 100644 --- a/drivers/parisc/gsc.c +++ b/drivers/parisc/gsc.c | |||
| @@ -143,7 +143,6 @@ static struct irq_chip gsc_asic_interrupt_type = { | |||
| 143 | .name = "GSC-ASIC", | 143 | .name = "GSC-ASIC", |
| 144 | .unmask = gsc_asic_unmask_irq, | 144 | .unmask = gsc_asic_unmask_irq, |
| 145 | .mask = gsc_asic_mask_irq, | 145 | .mask = gsc_asic_mask_irq, |
| 146 | .ack = no_ack_irq, | ||
| 147 | }; | 146 | }; |
| 148 | 147 | ||
| 149 | int gsc_assign_irq(struct irq_chip *type, void *data) | 148 | int gsc_assign_irq(struct irq_chip *type, void *data) |
| @@ -153,7 +152,7 @@ int gsc_assign_irq(struct irq_chip *type, void *data) | |||
| 153 | if (irq > GSC_IRQ_MAX) | 152 | if (irq > GSC_IRQ_MAX) |
| 154 | return NO_IRQ; | 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 | set_irq_chip_data(irq, data); | 156 | set_irq_chip_data(irq, data); |
| 158 | 157 | ||
| 159 | return irq++; | 158 | return irq++; |
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index a3120a09c43d..0327894bf235 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
| @@ -669,6 +669,13 @@ printk("\n"); | |||
| 669 | DBG(KERN_DEBUG "enable_irq(%d): eoi(%p, 0x%x)\n", irq, | 669 | DBG(KERN_DEBUG "enable_irq(%d): eoi(%p, 0x%x)\n", irq, |
| 670 | vi->eoi_addr, vi->eoi_data); | 670 | vi->eoi_addr, vi->eoi_data); |
| 671 | iosapic_eoi(vi->eoi_addr, vi->eoi_data); | 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 | cpu_eoi_irq(irq); | 679 | cpu_eoi_irq(irq); |
| 673 | } | 680 | } |
| 674 | 681 | ||
| @@ -705,6 +712,7 @@ static struct irq_chip iosapic_interrupt_type = { | |||
| 705 | .unmask = iosapic_unmask_irq, | 712 | .unmask = iosapic_unmask_irq, |
| 706 | .mask = iosapic_mask_irq, | 713 | .mask = iosapic_mask_irq, |
| 707 | .ack = cpu_ack_irq, | 714 | .ack = cpu_ack_irq, |
| 715 | .eoi = iosapic_eoi_irq, | ||
| 708 | #ifdef CONFIG_SMP | 716 | #ifdef CONFIG_SMP |
| 709 | .set_affinity = iosapic_set_affinity_irq, | 717 | .set_affinity = iosapic_set_affinity_irq, |
| 710 | #endif | 718 | #endif |
diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index 0846dafdfff1..28241532c0fd 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c | |||
| @@ -323,7 +323,6 @@ static struct irq_chip superio_interrupt_type = { | |||
| 323 | .name = SUPERIO, | 323 | .name = SUPERIO, |
| 324 | .unmask = superio_unmask_irq, | 324 | .unmask = superio_unmask_irq, |
| 325 | .mask = superio_mask_irq, | 325 | .mask = superio_mask_irq, |
| 326 | .ack = no_ack_irq, | ||
| 327 | }; | 326 | }; |
| 328 | 327 | ||
| 329 | #ifdef DEBUG_SUPERIO_INIT | 328 | #ifdef DEBUG_SUPERIO_INIT |
| @@ -354,7 +353,7 @@ int superio_fixup_irq(struct pci_dev *pcidev) | |||
| 354 | #endif | 353 | #endif |
| 355 | 354 | ||
| 356 | for (i = 0; i < 16; i++) { | 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 | /* |
