|
@@ -74,6 +74,14 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq)
|
|
if (!desc->irq_data.chip->irq_retrigger ||
|
|
if (!desc->irq_data.chip->irq_retrigger ||
|
|
!desc->irq_data.chip->irq_retrigger(&desc->irq_data)) {
|
|
!desc->irq_data.chip->irq_retrigger(&desc->irq_data)) {
|
|
#ifdef CONFIG_HARDIRQS_SW_RESEND
|
|
#ifdef CONFIG_HARDIRQS_SW_RESEND
|
|
|
|
+ /*
|
|
|
|
+ * If the interrupt has a parent irq and runs
|
|
|
|
+ * in the thread context of the parent irq,
|
|
|
|
+ * retrigger the parent.
|
|
|
|
+ */
|
|
|
|
+ if (desc->parent_irq &&
|
|
|
|
+ irq_settings_is_nested_thread(desc))
|
|
|
|
+ irq = desc->parent_irq;
|
|
/* Set it pending and activate the softirq: */
|
|
/* Set it pending and activate the softirq: */
|
|
set_bit(irq, irqs_resend);
|
|
set_bit(irq, irqs_resend);
|
|
tasklet_schedule(&resend_tasklet);
|
|
tasklet_schedule(&resend_tasklet);
|