Commit cd1752d3 authored by Marc Zyngier's avatar Marc Zyngier

genirq: Walk the irq_data hierarchy when resending an interrupt

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.
Reviewed-by: default avatarValentin Schneider <valentin.schneider@arm.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 9123e3a7
...@@ -86,6 +86,18 @@ static int irq_sw_resend(struct irq_desc *desc) ...@@ -86,6 +86,18 @@ static int irq_sw_resend(struct irq_desc *desc)
} }
#endif #endif
static int try_retrigger(struct irq_desc *desc)
{
if (desc->irq_data.chip->irq_retrigger)
return desc->irq_data.chip->irq_retrigger(&desc->irq_data);
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
return irq_chip_retrigger_hierarchy(&desc->irq_data);
#else
return 0;
#endif
}
/* /*
* IRQ resend * IRQ resend
* *
...@@ -113,8 +125,7 @@ int check_irq_resend(struct irq_desc *desc, bool inject) ...@@ -113,8 +125,7 @@ int check_irq_resend(struct irq_desc *desc, bool inject)
desc->istate &= ~IRQS_PENDING; desc->istate &= ~IRQS_PENDING;
if (!desc->irq_data.chip->irq_retrigger || if (!try_retrigger(desc))
!desc->irq_data.chip->irq_retrigger(&desc->irq_data))
err = irq_sw_resend(desc); err = irq_sw_resend(desc);
/* If the retrigger was successfull, mark it with the REPLAY bit */ /* If the retrigger was successfull, mark it with the REPLAY bit */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment