gpiolib: check if irqchip already has the irq hook replacements
authorHans Verkuil <hverkuil@xs4all.nl>
Fri, 14 Sep 2018 08:36:39 +0000 (10:36 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 17 Sep 2018 15:24:02 +0000 (08:24 -0700)
Some drivers use a single irqchip for multiple gpiochips. As a result the
irqchip hooks are overridden for the first gpiochip that was added, but
for the other gpiochip instances this should not happen again, otherwise
we would go into an infinite recursion.

Check for this, but also log a message that the driver should be fixed
since this is bad practice.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Tested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib.c

index 74f3af2d8ca092aa8ab1c1e584a47f2a562d1550..940180b5704e197bf478a26afd0cc41346037a78 100644 (file)
@@ -1858,6 +1858,16 @@ static void gpiochip_set_irq_hooks(struct gpio_chip *gpiochip)
        }
        if (WARN_ON(gpiochip->irq.irq_enable))
                return;
+       /* Check if the irqchip already has this hook... */
+       if (irqchip->irq_enable == gpiochip_irq_enable) {
+               /*
+                * ...and if so, give a gentle warning that this is bad
+                * practice.
+                */
+               chip_info(gpiochip,
+                         "detected irqchip that is shared with multiple gpiochips: please fix the driver.\n");
+               return;
+       }
        gpiochip->irq.irq_enable = irqchip->irq_enable;
        gpiochip->irq.irq_disable = irqchip->irq_disable;
        irqchip->irq_enable = gpiochip_irq_enable;