aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2006-06-29 05:25:03 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-29 13:26:26 -0400
commit47c2a3aa4475d27073dd3c7e183fcc13f495c8f5 (patch)
treed151e03da804103753977c2c94e17b71104e3d35
parentf702d7013c7470284843a6370aaa53b8b75c5a40 (diff)
[PATCH] genirq: add chip->eoi(), fastack -> fasteoi
Clean up the fastack concept by turning it into fasteoi and introducing the ->eoi() method for chips. This also allows the cleanup of an i386 EOI quirk - now the quirk is cleanly separated from the pure ACK implementation. Signed-off-by: Ingo Molnar <mingo@elte.hu> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Roland Dreier <rolandd@cisco.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--include/linux/irq.h6
-rw-r--r--kernel/irq/chip.c25
2 files changed, 15 insertions, 16 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 0d8eaf3e4036..0832149cdb18 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -74,7 +74,8 @@ struct proc_dir_entry;
74 * @mask: mask an interrupt source 74 * @mask: mask an interrupt source
75 * @mask_ack: ack and mask an interrupt source 75 * @mask_ack: ack and mask an interrupt source
76 * @unmask: unmask an interrupt source 76 * @unmask: unmask an interrupt source
77 * @end: end of interrupt 77 * @eoi: end of interrupt - chip level
78 * @end: end of interrupt - flow level
78 * @set_affinity: set the CPU affinity on SMP machines 79 * @set_affinity: set the CPU affinity on SMP machines
79 * @retrigger: resend an IRQ to the CPU 80 * @retrigger: resend an IRQ to the CPU
80 * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ 81 * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ
@@ -94,6 +95,7 @@ struct irq_chip {
94 void (*mask)(unsigned int irq); 95 void (*mask)(unsigned int irq);
95 void (*mask_ack)(unsigned int irq); 96 void (*mask_ack)(unsigned int irq);
96 void (*unmask)(unsigned int irq); 97 void (*unmask)(unsigned int irq);
98 void (*eoi)(unsigned int irq);
97 99
98 void (*end)(unsigned int irq); 100 void (*end)(unsigned int irq);
99 void (*set_affinity)(unsigned int irq, cpumask_t dest); 101 void (*set_affinity)(unsigned int irq, cpumask_t dest);
@@ -287,7 +289,7 @@ extern int handle_IRQ_event(unsigned int irq, struct pt_regs *regs,
287extern void fastcall 289extern void fastcall
288handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); 290handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs);
289extern void fastcall 291extern void fastcall
290handle_fastack_irq(unsigned int irq, struct irq_desc *desc, 292handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc,
291 struct pt_regs *regs); 293 struct pt_regs *regs);
292extern void fastcall 294extern void fastcall
293handle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); 295handle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs);
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index a99047a324eb..4a0952d9458b 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -280,18 +280,18 @@ out:
280} 280}
281 281
282/** 282/**
283 * handle_fastack_irq - irq handler for transparent controllers 283 * handle_fasteoi_irq - irq handler for transparent controllers
284 * @irq: the interrupt number 284 * @irq: the interrupt number
285 * @desc: the interrupt description structure for this irq 285 * @desc: the interrupt description structure for this irq
286 * @regs: pointer to a register structure 286 * @regs: pointer to a register structure
287 * 287 *
288 * Only a single callback will be issued to the chip: an ->ack() 288 * Only a single callback will be issued to the chip: an ->eoi()
289 * call when the interrupt has been serviced. This enables support 289 * call when the interrupt has been serviced. This enables support
290 * for modern forms of interrupt handlers, which handle the flow 290 * for modern forms of interrupt handlers, which handle the flow
291 * details in hardware, transparently. 291 * details in hardware, transparently.
292 */ 292 */
293void fastcall 293void fastcall
294handle_fastack_irq(unsigned int irq, struct irq_desc *desc, 294handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc,
295 struct pt_regs *regs) 295 struct pt_regs *regs)
296{ 296{
297 unsigned int cpu = smp_processor_id(); 297 unsigned int cpu = smp_processor_id();
@@ -327,10 +327,7 @@ handle_fastack_irq(unsigned int irq, struct irq_desc *desc,
327 spin_lock(&desc->lock); 327 spin_lock(&desc->lock);
328 desc->status &= ~IRQ_INPROGRESS; 328 desc->status &= ~IRQ_INPROGRESS;
329out: 329out:
330 if (!(desc->status & IRQ_DISABLED)) 330 desc->chip->eoi(irq);
331 desc->chip->ack(irq);
332 else
333 desc->chip->mask(irq);
334 331
335 spin_unlock(&desc->lock); 332 spin_unlock(&desc->lock);
336} 333}
@@ -510,19 +507,19 @@ handle_irq_name(void fastcall (*handle)(unsigned int, struct irq_desc *,
510 struct pt_regs *)) 507 struct pt_regs *))
511{ 508{
512 if (handle == handle_level_irq) 509 if (handle == handle_level_irq)
513 return "level "; 510 return "level ";
514 if (handle == handle_fastack_irq) 511 if (handle == handle_fasteoi_irq)
515 return "level "; 512 return "fasteoi";
516 if (handle == handle_edge_irq) 513 if (handle == handle_edge_irq)
517 return "edge "; 514 return "edge ";
518 if (handle == handle_simple_irq) 515 if (handle == handle_simple_irq)
519 return "simple"; 516 return "simple ";
520#ifdef CONFIG_SMP 517#ifdef CONFIG_SMP
521 if (handle == handle_percpu_irq) 518 if (handle == handle_percpu_irq)
522 return "percpu"; 519 return "percpu ";
523#endif 520#endif
524 if (handle == handle_bad_irq) 521 if (handle == handle_bad_irq)
525 return "bad "; 522 return "bad ";
526 523
527 return NULL; 524 return NULL;
528} 525}