diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/irq/chip.c | 5 | ||||
-rw-r--r-- | kernel/irq/resend.c | 7 |
2 files changed, 7 insertions, 5 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 615ce97c6cfd..f1a73f0b54e7 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -352,13 +352,10 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc) | |||
352 | * keep it masked and get out of here | 352 | * keep it masked and get out of here |
353 | */ | 353 | */ |
354 | action = desc->action; | 354 | action = desc->action; |
355 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) { | 355 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) |
356 | desc->status |= IRQ_PENDING; | ||
357 | goto out_unlock; | 356 | goto out_unlock; |
358 | } | ||
359 | 357 | ||
360 | desc->status |= IRQ_INPROGRESS; | 358 | desc->status |= IRQ_INPROGRESS; |
361 | desc->status &= ~IRQ_PENDING; | ||
362 | spin_unlock(&desc->lock); | 359 | spin_unlock(&desc->lock); |
363 | 360 | ||
364 | action_ret = handle_IRQ_event(irq, action); | 361 | action_ret = handle_IRQ_event(irq, action); |
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c index 5bfeaed7e487..a8046791ba2d 100644 --- a/kernel/irq/resend.c +++ b/kernel/irq/resend.c | |||
@@ -62,7 +62,12 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq) | |||
62 | */ | 62 | */ |
63 | desc->chip->enable(irq); | 63 | desc->chip->enable(irq); |
64 | 64 | ||
65 | if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { | 65 | /* |
66 | * We do not resend level type interrupts. Level type | ||
67 | * interrupts are resent by hardware when they are still | ||
68 | * active. | ||
69 | */ | ||
70 | if ((status & (IRQ_LEVEL | IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { | ||
66 | desc->status = (status & ~IRQ_PENDING) | IRQ_REPLAY; | 71 | desc->status = (status & ~IRQ_PENDING) | IRQ_REPLAY; |
67 | 72 | ||
68 | if (!desc->chip || !desc->chip->retrigger || | 73 | if (!desc->chip || !desc->chip->retrigger || |