diff options
Diffstat (limited to 'drivers/gpio/gpiolib.c')
| -rw-r--r-- | drivers/gpio/gpiolib.c | 19 | 
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index e59884cc12a7..085348e08986 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -1404,6 +1404,16 @@ static int gpiochip_to_irq(struct gpio_chip *gc, unsigned int offset)  {  	struct irq_domain *domain = gc->irq.domain; +#ifdef CONFIG_GPIOLIB_IRQCHIP +	/* +	 * Avoid race condition with other code, which tries to lookup +	 * an IRQ before the irqchip has been properly registered, +	 * i.e. while gpiochip is still being brought up. +	 */ +	if (!gc->irq.initialized) +		return -EPROBE_DEFER; +#endif +  	if (!gpiochip_irqchip_irq_valid(gc, offset))  		return -ENXIO; @@ -1593,6 +1603,15 @@ static int gpiochip_add_irqchip(struct gpio_chip *gc,  	acpi_gpiochip_request_interrupts(gc); +	/* +	 * Using barrier() here to prevent compiler from reordering +	 * gc->irq.initialized before initialization of above +	 * GPIO chip irq members. +	 */ +	barrier(); + +	gc->irq.initialized = true; +  	return 0;  }  | 
