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.
Showing the changes to kernel (1 of 1 file). Show all
Unified · Split
| @@ -86,6 +86,18 @@ static int irq_sw_resend(struct irq_desc *desc) · 85 unmodified lines | |||
| 86 | } | 86 | } |
| 87 | #endif | 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 | * IRQ resend | 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 | desc->istate &= ~IRQS_PENDING; | 126 | desc->istate &= ~IRQS_PENDING; |
| 115 | 127 | ||
| 116 | if (!desc->irq_data.chip->irq_retrigger || | 128 | if (!try_retrigger(desc)) |
| 117 | !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) | ||
| 118 | err = irq_sw_resend(desc); | 129 | err = irq_sw_resend(desc); |
| 119 | 130 | ||
| 120 | /* If the retrigger was successfull, mark it with the REPLAY bit */ | 131 | /* If the retrigger was successfull, mark it with the REPLAY bit */ |