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: Valentin Schneider <valentin.schneider@arm.com> Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
parent
9123e3a74e
commit
cd1752d34e
@ -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)
|
|||||||
|
|
||||||
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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user