On resending an interrupt, we only check the outermost irqchip for a irq_retrigger callback. However, this callback could be implemented at an inner level. Use irq_chip_retrigger_hierarchy() in this case.
Unified · Split
| @@ -86,6 +86,18 @@ static int irq_sw_resend(struct irq_desc *desc) · 85 unmodified lines | ||
| 86 | 86 | } |
| 87 | 87 | #endif |
| 88 | 88 | |
| 89 | +static int try_retrigger(struct irq_desc *desc) | |
| 90 | +{ | |
| 91 | + if (desc->irq_data.chip->irq_retrigger) | |
| 92 | + return desc->irq_data.chip->irq_retrigger(&desc->irq_data); | |
| 93 | + | |
| 94 | +#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY | |
| 95 | + return irq_chip_retrigger_hierarchy(&desc->irq_data); | |
| 96 | +#else | |
| 97 | + return 0; | |
| 98 | +#endif | |
| 99 | +} | |
| 100 | + | |
| 89 | 101 | /* |
| 90 | 102 | * IRQ resend |
| 91 | 103 | * |
| @@ -113,8 +125,7 @@ int check_irq_resend(struct irq_desc *desc, bool inject) · 21 unmodified lines | ||
| 113 | 125 | |
| 114 | 126 | desc->istate &= ~IRQS_PENDING; |
| 115 | 127 | |
| 116 | − if (!desc->irq_data.chip->irq_retrigger || | |
| 117 | − !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) | |
| 128 | + if (!try_retrigger(desc)) | |
| 118 | 129 | err = irq_sw_resend(desc); |
| 119 | 130 | |
| 120 | 131 | /* If the retrigger was successfull, mark it with the REPLAY bit */ |