diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-02-15 04:33:57 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2011-02-19 06:58:24 -0500 |
commit | 77694b408abb8f92195ad5ed6ce5492f1d794c77 (patch) | |
tree | a0f7e81a0a155523f69146cd560cc2f49543a99e | |
parent | 781295762defc709a609efc01d8bb065276cd9a2 (diff) |
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>
-rw-r--r-- | include/linux/irq.h | 4 | ||||
-rw-r--r-- | kernel/irq/chip.c | 9 |
2 files changed, 11 insertions, 2 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 36390970693c..ea2970c294aa 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -328,10 +328,12 @@ struct irq_chip { | |||
328 | /* | 328 | /* |
329 | * irq_chip specific flags | 329 | * irq_chip specific flags |
330 | * | 330 | * |
331 | * IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type() | 331 | * IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type() |
332 | * IRQCHIP_EOI_IF_HANDLED: Only issue irq_eoi() when irq was handled | ||
332 | */ | 333 | */ |
333 | enum { | 334 | enum { |
334 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), | 335 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), |
336 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), | ||
335 | }; | 337 | }; |
336 | 338 | ||
337 | /* This include will go away once we isolated irq_desc usage to core code */ | 339 | /* This include will go away once we isolated irq_desc usage to core code */ |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 08be5d182be3..1d3e25e68b0c 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -515,9 +515,16 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc) | |||
515 | } | 515 | } |
516 | preflow_handler(desc); | 516 | preflow_handler(desc); |
517 | handle_irq_event(desc); | 517 | handle_irq_event(desc); |
518 | out: | 518 | |
519 | out_eoi: | ||
519 | desc->irq_data.chip->irq_eoi(&desc->irq_data); | 520 | desc->irq_data.chip->irq_eoi(&desc->irq_data); |
521 | out_unlock: | ||
520 | raw_spin_unlock(&desc->lock); | 522 | raw_spin_unlock(&desc->lock); |
523 | return; | ||
524 | out: | ||
525 | if (!(desc->irq_data.chip->flags & IRQCHIP_EOI_IF_HANDLED)) | ||
526 | goto out_eoi; | ||
527 | goto out_unlock; | ||
521 | } | 528 | } |
522 | 529 | ||
523 | /** | 530 | /** |