diff options
Diffstat (limited to 'kernel/irq/chip.c')
| -rw-r--r-- | kernel/irq/chip.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 13c68e71b726..b08c0d24f202 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -382,7 +382,10 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc) | |||
| 382 | 382 | ||
| 383 | spin_lock(&desc->lock); | 383 | spin_lock(&desc->lock); |
| 384 | desc->status &= ~IRQ_INPROGRESS; | 384 | desc->status &= ~IRQ_INPROGRESS; |
| 385 | if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) | 385 | |
| 386 | if (unlikely(desc->status & IRQ_ONESHOT)) | ||
| 387 | desc->status |= IRQ_MASKED; | ||
| 388 | else if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) | ||
| 386 | desc->chip->unmask(irq); | 389 | desc->chip->unmask(irq); |
| 387 | out_unlock: | 390 | out_unlock: |
| 388 | spin_unlock(&desc->lock); | 391 | spin_unlock(&desc->lock); |
| @@ -478,8 +481,13 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
| 478 | kstat_incr_irqs_this_cpu(irq, desc); | 481 | kstat_incr_irqs_this_cpu(irq, desc); |
| 479 | 482 | ||
| 480 | /* Start handling the irq */ | 483 | /* Start handling the irq */ |
| 481 | if (desc->chip->ack) | 484 | if (unlikely(desc->status & IRQ_ONESHOT)) { |
| 482 | desc->chip->ack(irq); | 485 | desc->status |= IRQ_MASKED; |
| 486 | mask_ack_irq(desc, irq); | ||
| 487 | } else { | ||
| 488 | if (desc->chip->ack) | ||
| 489 | desc->chip->ack(irq); | ||
| 490 | } | ||
| 483 | 491 | ||
| 484 | /* Mark the IRQ currently in progress.*/ | 492 | /* Mark the IRQ currently in progress.*/ |
| 485 | desc->status |= IRQ_INPROGRESS; | 493 | desc->status |= IRQ_INPROGRESS; |
