genirq; Add fasteoi irq_chip quirk
Some chips want irq_eoi() only called when an interrupt is actually handled. So they have checks for INPROGRESS and DISABLED in their irq_eoi callbacks. Add a chip flag, which allows to handle that in the generic code. No impact on the fastpath. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
@@ -328,10 +328,12 @@ struct irq_chip {
|
|||||||
/*
|
/*
|
||||||
* irq_chip specific flags
|
* irq_chip specific flags
|
||||||
*
|
*
|
||||||
* IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type()
|
* IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type()
|
||||||
|
* IRQCHIP_EOI_IF_HANDLED: Only issue irq_eoi() when irq was handled
|
||||||
*/
|
*/
|
||||||
enum {
|
enum {
|
||||||
IRQCHIP_SET_TYPE_MASKED = (1 << 0),
|
IRQCHIP_SET_TYPE_MASKED = (1 << 0),
|
||||||
|
IRQCHIP_EOI_IF_HANDLED = (1 << 1),
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This include will go away once we isolated irq_desc usage to core code */
|
/* This include will go away once we isolated irq_desc usage to core code */
|
||||||
|
@@ -515,9 +515,16 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)
|
|||||||
}
|
}
|
||||||
preflow_handler(desc);
|
preflow_handler(desc);
|
||||||
handle_irq_event(desc);
|
handle_irq_event(desc);
|
||||||
out:
|
|
||||||
|
out_eoi:
|
||||||
desc->irq_data.chip->irq_eoi(&desc->irq_data);
|
desc->irq_data.chip->irq_eoi(&desc->irq_data);
|
||||||
|
out_unlock:
|
||||||
raw_spin_unlock(&desc->lock);
|
raw_spin_unlock(&desc->lock);
|
||||||
|
return;
|
||||||
|
out:
|
||||||
|
if (!(desc->irq_data.chip->flags & IRQCHIP_EOI_IF_HANDLED))
|
||||||
|
goto out_eoi;
|
||||||
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user