Commit ba20085c20f1c9e8af546dea6ad0efa421bdef32

Authored by Kyle McMartin
1 parent caf96194c0

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
... ... @@ -32,6 +32,9 @@
32 32 }
33 33  
34 34 struct irq_chip;
  35 +struct irq_desc;
  36 +
  37 +extern void parisc_do_IRQ(unsigned int irq, struct irq_desc *desc);
35 38  
36 39 /*
37 40 * Some useful "we don't have to do anything here" handlers. Should
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 /*