[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>
This commit is contained in:
committed by
Linus Torvalds
parent
f702d7013c
commit
47c2a3aa44
@@ -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 {
|
|||||||
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,
|
|||||||
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 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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,
|
|||||||
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 *,
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user