ARM: gemini: Fix race in installing GPIO chained IRQ handler
authorRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 16 Jun 2015 22:06:35 +0000 (23:06 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 18 Jun 2015 12:03:08 +0000 (14:03 +0200)
The gemini code was installing its chained interrupt handler (which
enables the interrupt) before it was setting its data, which is bad if
the IRQ was previously pending.  Avoid this problem by converting it to
irq_set_chained_handler_and_data().

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Hans Ulli Kroll <ulli.kroll@googlemail.com>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/E1Z4z07-0002SO-Gv@rmk-PC.arm.linux.org.uk
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/arm/mach-gemini/gpio.c

index f8cb571..3292f2e 100644 (file)
@@ -223,8 +223,8 @@ void __init gemini_gpio_init(void)
                        set_irq_flags(j, IRQF_VALID);
                }
 
-               irq_set_chained_handler(IRQ_GPIO(i), gpio_irq_handler);
-               irq_set_handler_data(IRQ_GPIO(i), (void *)i);
+               irq_set_chained_handler_and_data(IRQ_GPIO(i), gpio_irq_handler,
+                                                (void *)i);
        }
 
        BUG_ON(gpiochip_add(&gemini_gpio_chip));