diff options
Diffstat (limited to 'kernel/irq/resend.c')
| -rw-r--r-- | kernel/irq/resend.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c index dc49358b73f..ad683a99b1e 100644 --- a/kernel/irq/resend.c +++ b/kernel/irq/resend.c | |||
| @@ -55,20 +55,19 @@ static DECLARE_TASKLET(resend_tasklet, resend_irqs, 0); | |||
| 55 | */ | 55 | */ |
| 56 | void check_irq_resend(struct irq_desc *desc, unsigned int irq) | 56 | void check_irq_resend(struct irq_desc *desc, unsigned int irq) |
| 57 | { | 57 | { |
| 58 | unsigned int status = desc->status; | ||
| 59 | |||
| 60 | /* | ||
| 61 | * Make sure the interrupt is enabled, before resending it: | ||
| 62 | */ | ||
| 63 | desc->irq_data.chip->irq_enable(&desc->irq_data); | ||
| 64 | |||
| 65 | /* | 58 | /* |
| 66 | * We do not resend level type interrupts. Level type | 59 | * We do not resend level type interrupts. Level type |
| 67 | * interrupts are resent by hardware when they are still | 60 | * interrupts are resent by hardware when they are still |
| 68 | * active. | 61 | * active. |
| 69 | */ | 62 | */ |
| 70 | if ((status & (IRQ_LEVEL | IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { | 63 | if (irq_settings_is_level(desc)) |
| 71 | desc->status = (status & ~IRQ_PENDING) | IRQ_REPLAY; | 64 | return; |
| 65 | if (desc->istate & IRQS_REPLAY) | ||
| 66 | return; | ||
| 67 | if (desc->istate & IRQS_PENDING) { | ||
| 68 | irq_compat_clr_pending(desc); | ||
| 69 | desc->istate &= ~IRQS_PENDING; | ||
| 70 | desc->istate |= IRQS_REPLAY; | ||
| 72 | 71 | ||
| 73 | if (!desc->irq_data.chip->irq_retrigger || | 72 | if (!desc->irq_data.chip->irq_retrigger || |
| 74 | !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) { | 73 | !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) { |
