Commit ba20085c20f1c9e8af546dea6ad0efa421bdef32
1 parent
caf96194c0
Exists in
master
and in
4 other branches
parisc: lay groundwork for killing __do_IRQ
Use proper accessors and handlers for generic irq cleanups. We just call back into __do_IRQ through desc->handler now, and remove the explicit calls. Signed-off-by: Kyle McMartin <kyle@redhat.com>
Showing 7 changed files with 38 additions and 43 deletions Side-by-side Diff
arch/parisc/include/asm/irq.h
arch/parisc/kernel/irq.c
... | ... | @@ -151,7 +151,7 @@ |
151 | 151 | .enable = cpu_enable_irq, |
152 | 152 | .disable = cpu_disable_irq, |
153 | 153 | .ack = cpu_ack_irq, |
154 | - .end = cpu_end_irq, | |
154 | + .eoi = cpu_end_irq, | |
155 | 155 | #ifdef CONFIG_SMP |
156 | 156 | .set_affinity = cpu_set_affinity_irq, |
157 | 157 | #endif |
158 | 158 | |
... | ... | @@ -247,10 +247,11 @@ |
247 | 247 | if (irq_desc[irq].chip != &cpu_interrupt_type) |
248 | 248 | return -EBUSY; |
249 | 249 | |
250 | + /* for iosapic interrupts */ | |
250 | 251 | if (type) { |
251 | - irq_desc[irq].chip = type; | |
252 | - irq_desc[irq].chip_data = data; | |
253 | - cpu_interrupt_type.enable(irq); | |
252 | + set_irq_chip_and_handler(irq, type, parisc_do_IRQ); | |
253 | + set_irq_chip_data(irq, data); | |
254 | + cpu_enable_irq(irq); | |
254 | 255 | } |
255 | 256 | return 0; |
256 | 257 | } |
... | ... | @@ -368,7 +369,7 @@ |
368 | 369 | goto set_out; |
369 | 370 | } |
370 | 371 | #endif |
371 | - __do_IRQ(irq); | |
372 | + generic_handle_irq(irq); | |
372 | 373 | |
373 | 374 | out: |
374 | 375 | irq_exit(); |
375 | 376 | |
376 | 377 | |
... | ... | @@ -398,14 +399,14 @@ |
398 | 399 | { |
399 | 400 | int i; |
400 | 401 | for (i = CPU_IRQ_BASE; i <= CPU_IRQ_MAX; i++) { |
401 | - irq_desc[i].chip = &cpu_interrupt_type; | |
402 | + set_irq_chip_and_handler(i, &cpu_interrupt_type, parisc_do_IRQ); | |
402 | 403 | } |
403 | 404 | |
404 | - irq_desc[TIMER_IRQ].action = &timer_action; | |
405 | - irq_desc[TIMER_IRQ].status = IRQ_PER_CPU; | |
405 | + set_irq_handler(TIMER_IRQ, handle_percpu_irq); | |
406 | + setup_irq(TIMER_IRQ, &timer_action); | |
406 | 407 | #ifdef CONFIG_SMP |
407 | - irq_desc[IPI_IRQ].action = &ipi_action; | |
408 | - irq_desc[IPI_IRQ].status = IRQ_PER_CPU; | |
408 | + set_irq_handler(IPI_IRQ, handle_percpu_irq); | |
409 | + setup_irq(IPI_IRQ, &ipi_action); | |
409 | 410 | #endif |
410 | 411 | } |
411 | 412 | |
... | ... | @@ -422,5 +423,10 @@ |
422 | 423 | #endif |
423 | 424 | set_eiem(cpu_eiem); /* EIEM : enable all external intr */ |
424 | 425 | |
426 | +} | |
427 | + | |
428 | +void parisc_do_IRQ(unsigned int irq, struct irq_desc *desc) | |
429 | +{ | |
430 | + __do_IRQ(irq); | |
425 | 431 | } |
drivers/parisc/dino.c
... | ... | @@ -298,8 +298,7 @@ |
298 | 298 | |
299 | 299 | static void dino_disable_irq(unsigned int irq) |
300 | 300 | { |
301 | - struct irq_desc *desc = irq_to_desc(irq); | |
302 | - struct dino_device *dino_dev = desc->chip_data; | |
301 | + struct dino_device *dino_dev = get_irq_chip_data(irq); | |
303 | 302 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); |
304 | 303 | |
305 | 304 | DBG(KERN_WARNING "%s(0x%p, %d)\n", __func__, dino_dev, irq); |
... | ... | @@ -311,8 +310,7 @@ |
311 | 310 | |
312 | 311 | static void dino_enable_irq(unsigned int irq) |
313 | 312 | { |
314 | - struct irq_desc *desc = irq_to_desc(irq); | |
315 | - struct dino_device *dino_dev = desc->chip_data; | |
313 | + struct dino_device *dino_dev = get_irq_chip_data(irq); | |
316 | 314 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); |
317 | 315 | u32 tmp; |
318 | 316 | |
... | ... | @@ -391,7 +389,7 @@ |
391 | 389 | int irq = dino_dev->global_irq[local_irq]; |
392 | 390 | DBG(KERN_DEBUG "%s(%d, %p) mask 0x%x\n", |
393 | 391 | __func__, irq, intr_dev, mask); |
394 | - __do_IRQ(irq); | |
392 | + generic_handle_irq(irq); | |
395 | 393 | mask &= ~(1 << local_irq); |
396 | 394 | } while (mask); |
397 | 395 |
drivers/parisc/eisa.c
... | ... | @@ -233,7 +233,7 @@ |
233 | 233 | } |
234 | 234 | spin_unlock_irqrestore(&eisa_irq_lock, flags); |
235 | 235 | |
236 | - __do_IRQ(irq); | |
236 | + generic_handle_irq(irq); | |
237 | 237 | |
238 | 238 | spin_lock_irqsave(&eisa_irq_lock, flags); |
239 | 239 | /* unmask */ |
240 | 240 | |
... | ... | @@ -346,10 +346,10 @@ |
346 | 346 | } |
347 | 347 | |
348 | 348 | /* Reserve IRQ2 */ |
349 | - irq_to_desc(2)->action = &irq2_action; | |
350 | - | |
349 | + setup_irq(2, &irq2_action); | |
351 | 350 | for (i = 0; i < 16; i++) { |
352 | - irq_to_desc(i)->chip = &eisa_interrupt_type; | |
351 | + set_irq_chip_and_handler(i, &eisa_interrupt_type, | |
352 | + parisc_do_IRQ); | |
353 | 353 | } |
354 | 354 | |
355 | 355 | EISA_bus = 1; |
drivers/parisc/gsc.c
... | ... | @@ -86,7 +86,7 @@ |
86 | 86 | do { |
87 | 87 | int local_irq = __ffs(irr); |
88 | 88 | unsigned int irq = gsc_asic->global_irq[local_irq]; |
89 | - __do_IRQ(irq); | |
89 | + generic_handle_irq(irq); | |
90 | 90 | irr &= ~(1 << local_irq); |
91 | 91 | } while (irr); |
92 | 92 | |
... | ... | @@ -107,8 +107,7 @@ |
107 | 107 | |
108 | 108 | static void gsc_asic_disable_irq(unsigned int irq) |
109 | 109 | { |
110 | - struct irq_desc *desc = irq_to_desc(irq); | |
111 | - struct gsc_asic *irq_dev = desc->chip_data; | |
110 | + struct gsc_asic *irq_dev = get_irq_chip_data(irq); | |
112 | 111 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); |
113 | 112 | u32 imr; |
114 | 113 | |
... | ... | @@ -123,8 +122,7 @@ |
123 | 122 | |
124 | 123 | static void gsc_asic_enable_irq(unsigned int irq) |
125 | 124 | { |
126 | - struct irq_desc *desc = irq_to_desc(irq); | |
127 | - struct gsc_asic *irq_dev = desc->chip_data; | |
125 | + struct gsc_asic *irq_dev = get_irq_chip_data(irq); | |
128 | 126 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); |
129 | 127 | u32 imr; |
130 | 128 | |
131 | 129 | |
... | ... | @@ -160,14 +158,13 @@ |
160 | 158 | int gsc_assign_irq(struct irq_chip *type, void *data) |
161 | 159 | { |
162 | 160 | static int irq = GSC_IRQ_BASE; |
163 | - struct irq_desc *desc; | |
164 | 161 | |
165 | 162 | if (irq > GSC_IRQ_MAX) |
166 | 163 | return NO_IRQ; |
167 | 164 | |
168 | - desc = irq_to_desc(irq); | |
169 | - desc->chip = type; | |
170 | - desc->chip_data = data; | |
165 | + set_irq_chip_and_handler(irq, type, parisc_do_IRQ); | |
166 | + set_irq_chip_data(irq, data); | |
167 | + | |
171 | 168 | return irq++; |
172 | 169 | } |
173 | 170 |
drivers/parisc/iosapic.c
... | ... | @@ -615,17 +615,10 @@ |
615 | 615 | } |
616 | 616 | |
617 | 617 | |
618 | -static struct vector_info *iosapic_get_vector(unsigned int irq) | |
619 | -{ | |
620 | - struct irq_desc *desc = irq_to_desc(irq); | |
621 | - | |
622 | - return desc->chip_data; | |
623 | -} | |
624 | - | |
625 | 618 | static void iosapic_disable_irq(unsigned int irq) |
626 | 619 | { |
627 | 620 | unsigned long flags; |
628 | - struct vector_info *vi = iosapic_get_vector(irq); | |
621 | + struct vector_info *vi = get_irq_chip_data(irq); | |
629 | 622 | u32 d0, d1; |
630 | 623 | |
631 | 624 | spin_lock_irqsave(&iosapic_lock, flags); |
... | ... | @@ -637,7 +630,7 @@ |
637 | 630 | |
638 | 631 | static void iosapic_enable_irq(unsigned int irq) |
639 | 632 | { |
640 | - struct vector_info *vi = iosapic_get_vector(irq); | |
633 | + struct vector_info *vi = get_irq_chip_data(irq); | |
641 | 634 | u32 d0, d1; |
642 | 635 | |
643 | 636 | /* data is initialized by fixup_irq */ |
... | ... | @@ -688,7 +681,7 @@ |
688 | 681 | */ |
689 | 682 | static void iosapic_end_irq(unsigned int irq) |
690 | 683 | { |
691 | - struct vector_info *vi = iosapic_get_vector(irq); | |
684 | + struct vector_info *vi = get_irq_chip_data(irq); | |
692 | 685 | DBG(KERN_DEBUG "end_irq(%d): eoi(%p, 0x%x)\n", irq, |
693 | 686 | vi->eoi_addr, vi->eoi_data); |
694 | 687 | iosapic_eoi(vi->eoi_addr, vi->eoi_data); |
... | ... | @@ -705,7 +698,7 @@ |
705 | 698 | static int iosapic_set_affinity_irq(unsigned int irq, |
706 | 699 | const struct cpumask *dest) |
707 | 700 | { |
708 | - struct vector_info *vi = iosapic_get_vector(irq); | |
701 | + struct vector_info *vi = get_irq_chip_data(irq); | |
709 | 702 | u32 d0, d1, dummy_d0; |
710 | 703 | unsigned long flags; |
711 | 704 | int dest_cpu; |
drivers/parisc/superio.c
... | ... | @@ -139,7 +139,7 @@ |
139 | 139 | } |
140 | 140 | |
141 | 141 | /* Call the appropriate device's interrupt */ |
142 | - __do_IRQ(local_irq); | |
142 | + generic_handle_irq(local_irq); | |
143 | 143 | |
144 | 144 | /* set EOI - forces a new interrupt if a lower priority device |
145 | 145 | * still needs service. |
... | ... | @@ -363,9 +363,7 @@ |
363 | 363 | #endif |
364 | 364 | |
365 | 365 | for (i = 0; i < 16; i++) { |
366 | - struct irq_desc *desc = irq_to_desc(i); | |
367 | - | |
368 | - desc->chip = &superio_interrupt_type; | |
366 | + set_irq_chip_and_handler(i, &superio_interrupt_type, parisc_do_IRQ); | |
369 | 367 | } |
370 | 368 | |
371 | 369 | /* |