3.16.50-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Michał Mirosław <mirq-linux@xxxxxxxxxxxx> commit 9e9509e38fbe034782339eb09c915f0b5765ff69 upstream. When more than one GPIO IRQs are triggered simultaneously, tegra_gpio_irq_handler() called chained_irq_exit() multiple times for one chained_irq_enter(). Fixes: 3c92db9ac0ca3eee8e46e2424b6c074e2e394ad9 Signed-off-by: Michał Mirosław <mirq-linux@xxxxxxxxxxxx> [Also changed the variable to a bool] Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> [bwh: Backported to 3.16: adjust context] Signed-off-by: Ben Hutchings <ben@xxxxxxxxxxxxxxx> --- drivers/gpio/gpio-tegra.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) --- a/drivers/gpio/gpio-tegra.c +++ b/drivers/gpio/gpio-tegra.c @@ -271,7 +271,7 @@ static void tegra_gpio_irq_handler(unsig struct tegra_gpio_bank *bank; int port; int pin; - int unmasked = 0; + bool unmasked = false; struct irq_chip *chip = irq_desc_get_chip(desc); chained_irq_enter(chip, desc); @@ -291,8 +291,8 @@ static void tegra_gpio_irq_handler(unsig * before executing the hander so that we don't * miss edges */ - if (lvl & (0x100 << pin)) { - unmasked = 1; + if (!unmasked && lvl & (0x100 << pin)) { + unmasked = true; chained_irq_exit(chip, desc); }