mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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
					
				
					 1 changed files with 13 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -86,6 +86,18 @@ static int irq_sw_resend(struct irq_desc *desc)
 | 
			
		|||
}
 | 
			
		||||
#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
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -113,8 +125,7 @@ int check_irq_resend(struct irq_desc *desc, bool inject)
 | 
			
		|||
 | 
			
		||||
	desc->istate &= ~IRQS_PENDING;
 | 
			
		||||
 | 
			
		||||
	if (!desc->irq_data.chip->irq_retrigger ||
 | 
			
		||||
	    !desc->irq_data.chip->irq_retrigger(&desc->irq_data))
 | 
			
		||||
	if (!try_retrigger(desc))
 | 
			
		||||
		err = irq_sw_resend(desc);
 | 
			
		||||
 | 
			
		||||
	/* If the retrigger was successfull, mark it with the REPLAY bit */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue