Commit 47c2a3aa authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds

[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: default avatarIngo Molnar <mingo@elte.hu>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Roland Dreier <rolandd@cisco.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f702d701
...@@ -74,7 +74,8 @@ struct proc_dir_entry; ...@@ -74,7 +74,8 @@ struct proc_dir_entry;
* @mask: mask an interrupt source * @mask: mask an interrupt source
* @mask_ack: ack and mask an interrupt source * @mask_ack: ack and mask an interrupt source
* @unmask: unmask an interrupt source * @unmask: unmask an interrupt source
* @end: end of interrupt * @eoi: end of interrupt - chip level
* @end: end of interrupt - flow level
* @set_affinity: set the CPU affinity on SMP machines * @set_affinity: set the CPU affinity on SMP machines
* @retrigger: resend an IRQ to the CPU * @retrigger: resend an IRQ to the CPU
* @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ
...@@ -94,6 +95,7 @@ struct irq_chip { ...@@ -94,6 +95,7 @@ struct irq_chip {
void (*mask)(unsigned int irq); void (*mask)(unsigned int irq);
void (*mask_ack)(unsigned int irq); void (*mask_ack)(unsigned int irq);
void (*unmask)(unsigned int irq); void (*unmask)(unsigned int irq);
void (*eoi)(unsigned int irq);
void (*end)(unsigned int irq); void (*end)(unsigned int irq);
void (*set_affinity)(unsigned int irq, cpumask_t dest); 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, ...@@ -287,7 +289,7 @@ extern int handle_IRQ_event(unsigned int irq, struct pt_regs *regs,
extern void fastcall extern void fastcall
handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs);
extern void fastcall extern void fastcall
handle_fastack_irq(unsigned int irq, struct irq_desc *desc, handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc,
struct pt_regs *regs); struct pt_regs *regs);
extern void fastcall extern void fastcall
handle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); handle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs);
......
...@@ -280,18 +280,18 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) ...@@ -280,18 +280,18 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs)
} }
/** /**
* handle_fastack_irq - irq handler for transparent controllers * handle_fasteoi_irq - irq handler for transparent controllers
* @irq: the interrupt number * @irq: the interrupt number
* @desc: the interrupt description structure for this irq * @desc: the interrupt description structure for this irq
* @regs: pointer to a register structure * @regs: pointer to a register structure
* *
* Only a single callback will be issued to the chip: an ->ack() * Only a single callback will be issued to the chip: an ->eoi()
* call when the interrupt has been serviced. This enables support * call when the interrupt has been serviced. This enables support
* for modern forms of interrupt handlers, which handle the flow * for modern forms of interrupt handlers, which handle the flow
* details in hardware, transparently. * details in hardware, transparently.
*/ */
void fastcall void fastcall
handle_fastack_irq(unsigned int irq, struct irq_desc *desc, handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc,
struct pt_regs *regs) struct pt_regs *regs)
{ {
unsigned int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();
...@@ -327,10 +327,7 @@ handle_fastack_irq(unsigned int irq, struct irq_desc *desc, ...@@ -327,10 +327,7 @@ handle_fastack_irq(unsigned int irq, struct irq_desc *desc,
spin_lock(&desc->lock); spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS; desc->status &= ~IRQ_INPROGRESS;
out: out:
if (!(desc->status & IRQ_DISABLED)) desc->chip->eoi(irq);
desc->chip->ack(irq);
else
desc->chip->mask(irq);
spin_unlock(&desc->lock); spin_unlock(&desc->lock);
} }
...@@ -510,19 +507,19 @@ handle_irq_name(void fastcall (*handle)(unsigned int, struct irq_desc *, ...@@ -510,19 +507,19 @@ handle_irq_name(void fastcall (*handle)(unsigned int, struct irq_desc *,
struct pt_regs *)) struct pt_regs *))
{ {
if (handle == handle_level_irq) if (handle == handle_level_irq)
return "level "; return "level ";
if (handle == handle_fastack_irq) if (handle == handle_fasteoi_irq)
return "level "; return "fasteoi";
if (handle == handle_edge_irq) if (handle == handle_edge_irq)
return "edge "; return "edge ";
if (handle == handle_simple_irq) if (handle == handle_simple_irq)
return "simple"; return "simple ";
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (handle == handle_percpu_irq) if (handle == handle_percpu_irq)
return "percpu"; return "percpu ";
#endif #endif
if (handle == handle_bad_irq) if (handle == handle_bad_irq)
return "bad "; return "bad ";
return NULL; return NULL;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment