Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -74,7 +74,8 @@ struct proc_dir_entry;
 * @mask:		mask an interrupt source
 * @mask_ack:		ack and mask 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
 * @retrigger:		resend an IRQ to the CPU
 * @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_ack)(unsigned int irq);
	void		(*unmask)(unsigned int irq);
	void		(*eoi)(unsigned int irq);

	void		(*end)(unsigned int irq);
	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
handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs);
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);
extern void fastcall
handle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs);
+11 −14
Original line number Diff line number Diff line
@@ -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
 *	@desc:	the interrupt description structure for this irq
 *	@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
 *	for modern forms of interrupt handlers, which handle the flow
 *	details in hardware, transparently.
 */
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)
{
	unsigned int cpu = smp_processor_id();
@@ -327,10 +327,7 @@ handle_fastack_irq(unsigned int irq, struct irq_desc *desc,
	spin_lock(&desc->lock);
	desc->status &= ~IRQ_INPROGRESS;
out:
	if (!(desc->status & IRQ_DISABLED))
		desc->chip->ack(irq);
	else
		desc->chip->mask(irq);
	desc->chip->eoi(irq);

	spin_unlock(&desc->lock);
}
@@ -511,8 +508,8 @@ handle_irq_name(void fastcall (*handle)(unsigned int, struct irq_desc *,
{
	if (handle == handle_level_irq)
		return "level  ";
	if (handle == handle_fastack_irq)
		return "level ";
	if (handle == handle_fasteoi_irq)
		return "fasteoi";
	if (handle == handle_edge_irq)
		return "edge   ";
	if (handle == handle_simple_irq)