diff mbox

[v2] gpio: convince line to become input in irq helper

Message ID 1466630758-26231-1-git-send-email-linus.walleij@linaro.org
State Accepted
Commit 7e7c059cb50c7c72d5a393b2c34fc57de1b01b55
Headers show

Commit Message

Linus Walleij June 22, 2016, 9:25 p.m. UTC
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.

Cc: Björn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

---
ChangeLog v1->v2:
- Propagate the error from .direction_input() so we can rely on
  it being used.
---
 drivers/gpio/gpiolib.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

-- 
2.4.11

--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Bjorn Andersson June 22, 2016, 9:51 p.m. UTC | #1
On Wed 22 Jun 14:25 PDT 2016, Linus Walleij wrote:

> 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.

> 

> Cc: Björn Andersson <bjorn.andersson@linaro.org>


Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>


Regards,
Bjorn

> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

> ---

> ChangeLog v1->v2:

> - Propagate the error from .direction_input() so we can rely on

>   it being used.

> ---

>  drivers/gpio/gpiolib.c | 19 +++++++++++++++++++

>  1 file changed, 19 insertions(+)

> 

> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c

> index 5a21a6acf8af..b195ec406ff4 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",

> -- 

> 2.4.11

> 

--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 5a21a6acf8af..b195ec406ff4 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",