gpio: convince line to become input in irq helper
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 22 Jun 2016 14:31:54 +0000 (16:31 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 23 Jun 2016 09:06:58 +0000 (11:06 +0200)
The generic IRQ helper library just checks if the IRQ line is
set as input before activating it for interrupts. As we
recently started to check things better with .get_dir() it
turns out that it's good to try to convince the line to become
an input before attempting to lock it as IRQ.

Reviewed-by: Björn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib.c

index 5a21a6acf8af98d577c429b5ea8e8f81d151b47b..b195ec406ff4cea2625da4c8eaad89b4ca58d92e 100644 (file)
@@ -1505,6 +1505,25 @@ static int gpiochip_irq_reqres(struct irq_data *d)
        if (!try_module_get(chip->gpiodev->owner))
                return -ENODEV;
 
+       /*
+        * If it is possible to switch this GPIO to an input
+        * this is a good time to do it.
+        */
+       if (chip->direction_input) {
+               struct gpio_desc *desc;
+               int ret;
+
+               desc = gpiochip_get_desc(chip, d->hwirq);
+               if (IS_ERR(desc))
+                       return PTR_ERR(desc);
+
+               ret = chip->direction_input(chip, d->hwirq);
+               if (ret)
+                       return ret;
+
+               clear_bit(FLAG_IS_OUT, &desc->flags);
+       }
+
        if (gpiochip_lock_as_irq(chip, d->hwirq)) {
                chip_err(chip,
                        "unable to lock HW IRQ %lu for IRQ\n",