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 | /* |