summaryrefslogtreecommitdiff
path: root/drivers/gpio
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2016-06-22 14:31:54 (GMT)
committerLinus Walleij <linus.walleij@linaro.org>2016-06-23 09:06:58 (GMT)
commit7e7c059cb50c7c72d5a393b2c34fc57de1b01b55 (patch)
treef3eaefba111d62cf5fcac48f9c73058c8b5154e6 /drivers/gpio
parent33265b17e06e2d84900efebfa8620d2f5bfcc5de (diff)
downloadlinux-7e7c059cb50c7c72d5a393b2c34fc57de1b01b55.tar.xz
gpio: convince line to become input in irq helper
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>
Diffstat (limited to 'drivers/gpio')
-rw-r--r--drivers/gpio/gpiolib.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 5a21a6a..b195ec4 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -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",