diff options
Diffstat (limited to 'kernel/irq/chip.c')
-rw-r--r-- | kernel/irq/chip.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 6080f6bc8c33..eebd6d5cfb44 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -275,8 +275,10 @@ void handle_nested_irq(unsigned int irq) | |||
275 | kstat_incr_irqs_this_cpu(irq, desc); | 275 | kstat_incr_irqs_this_cpu(irq, desc); |
276 | 276 | ||
277 | action = desc->action; | 277 | action = desc->action; |
278 | if (unlikely(!action || irqd_irq_disabled(&desc->irq_data))) | 278 | if (unlikely(!action || irqd_irq_disabled(&desc->irq_data))) { |
279 | desc->istate |= IRQS_PENDING; | ||
279 | goto out_unlock; | 280 | goto out_unlock; |
281 | } | ||
280 | 282 | ||
281 | irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS); | 283 | irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS); |
282 | raw_spin_unlock_irq(&desc->lock); | 284 | raw_spin_unlock_irq(&desc->lock); |
@@ -324,8 +326,10 @@ handle_simple_irq(unsigned int irq, struct irq_desc *desc) | |||
324 | desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); | 326 | desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); |
325 | kstat_incr_irqs_this_cpu(irq, desc); | 327 | kstat_incr_irqs_this_cpu(irq, desc); |
326 | 328 | ||
327 | if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) | 329 | if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) { |
330 | desc->istate |= IRQS_PENDING; | ||
328 | goto out_unlock; | 331 | goto out_unlock; |
332 | } | ||
329 | 333 | ||
330 | handle_irq_event(desc); | 334 | handle_irq_event(desc); |
331 | 335 | ||
@@ -379,8 +383,10 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc) | |||
379 | * If its disabled or no action available | 383 | * If its disabled or no action available |
380 | * keep it masked and get out of here | 384 | * keep it masked and get out of here |
381 | */ | 385 | */ |
382 | if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) | 386 | if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) { |
387 | desc->istate |= IRQS_PENDING; | ||
383 | goto out_unlock; | 388 | goto out_unlock; |
389 | } | ||
384 | 390 | ||
385 | handle_irq_event(desc); | 391 | handle_irq_event(desc); |
386 | 392 | ||
@@ -518,6 +524,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
518 | out_unlock: | 524 | out_unlock: |
519 | raw_spin_unlock(&desc->lock); | 525 | raw_spin_unlock(&desc->lock); |
520 | } | 526 | } |
527 | EXPORT_SYMBOL(handle_edge_irq); | ||
521 | 528 | ||
522 | #ifdef CONFIG_IRQ_EDGE_EOI_HANDLER | 529 | #ifdef CONFIG_IRQ_EDGE_EOI_HANDLER |
523 | /** | 530 | /** |