gpio: tegra: Fix tegra_gpio_irq_set_type()
Subsystems (2)
PATCH 1/1 gpio: tegra: Fix tegra_gpio_irq_set_type()
Commit 36b312792b97 ("gpiolib: Respect error code of ->get_direction()") broke tegra_gpio_irq_set_type() because requesting of GPIO direction must be done after enabling GPIO function for a pin.
This patch fixes drivers probe failure like this:
gpio gpiochip0: (tegra-gpio): gpiochip_lock_as_irq: cannot get GPIO direction tegra-gpio 6000d000.gpio: unable to lock Tegra GPIO 144 as IRQ
--- drivers/gpio/gpio-tegra.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/gpio/gpio-tegra.c +8 -7
@@ -323,13 +323,6 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type)return -EINVAL ; } - ret =gpiochip_lock_as_irq (&tgi->gc, gpio); -if (ret) { -dev_err (tgi->dev, -"unable to lock Tegra GPIO %u as IRQ\n" , gpio); -return ret; - } -spin_lock_irqsave (&bank->lvl_lock[port], flags); val =tegra_gpio_readl (tgi,GPIO_INT_LVL (tgi, gpio));
@@ -342,6 +335,14 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type)tegra_gpio_mask_write (tgi,GPIO_MSK_OE (tgi, gpio), gpio,0 );tegra_gpio_enable (tgi, gpio); + ret =gpiochip_lock_as_irq (&tgi->gc, gpio); +if (ret) { +dev_err (tgi->dev, +"unable to lock Tegra GPIO %u as IRQ\n" , gpio); +tegra_gpio_disable (tgi, gpio); +return ret; + } +if (type & (IRQ_TYPE_LEVEL_LOW |IRQ_TYPE_LEVEL_HIGH ))irq_set_handler_locked (d, handle_level_irq);else if (type & (IRQ_TYPE_EDGE_FALLING |IRQ_TYPE_EDGE_RISING ))
Signature · 1 line
2.18.0
Hi Dmitry
Quoted 38 lines · Dmitry Osipenko
Commit
36b312792b97("gpiolib: Respect error code of ->get_direction()") broketegra_gpio_irq_set_type()because requesting of GPIO direction must be done after enabling GPIO function for a pin.This patch fixes drivers probe failure like this:
gpio gpiochip0: (tegra-gpio):
gpiochip_lock_as_irq: cannot get GPIO direction tegra-gpio 6000d000.gpio: unable to lock Tegra GPIO 144 as IRQFixes 36b312792b97 ("gpiolib: Respect error code of ->get_direction()")Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/gpio/gpio-tegra.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)drivers/gpio/gpio-tegra.c +1
-7@@ -323,13 +323,6 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type)return -EINVAL ; } - ret =gpiochip_lock_as_irq (&tgi->gc, gpio); -if (ret) { -dev_err (tgi->dev, -"unable to lock Tegra GPIO %u as IRQ\n" , gpio); -return ret; - } -spin_lock_irqsave (&bank->lvl_lock[port], flags); val =tegra_gpio_readl (tgi,GPIO_INT_LVL (tgi, gpio));@@ -342,6 +335,14 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type)tegra_gpio_mask_write (tgi,GPIO_MSK_OE (tgi, gpio), gpio,0 );tegra_gpio_enable (tgi, gpio); + ret =gpiochip_lock_as_irq (&tgi->gc, gpio);
drivers/gpio/gpio-tegra.c static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type) · line 348
Quoted 10 lines
drivers/gpio/gpio-tegra.c +7
-0+if (ret) { +dev_err (tgi->dev, +"unable to lock Tegra GPIO %u as IRQ\n" , gpio); +tegra_gpio_disable (tgi, gpio); +return ret; + } +if (type & (IRQ_TYPE_LEVEL_LOW |IRQ_TYPE_LEVEL_HIGH ))irq_set_handler_locked (d, handle_level_irq);else if (type & (IRQ_TYPE_EDGE_FALLING |IRQ_TYPE_EDGE_RISING ))
Thanks for reporting this. I am seeing this as well on Tegra20 Ventana and Tegra30 Cardhu looking at the boot log. Given that gpiochip_lock_as_irq is checking the direction, the above fix looks good to me. So ...
Cheers
Jon
Signature · 1 line
nvpublic
Quoted 11 lines · Dmitry Osipenko
Commit
36b312792b97("gpiolib: Respect error code of ->get_direction()") broketegra_gpio_irq_set_type()because requesting of GPIO direction must be done after enabling GPIO function for a pin.This patch fixes drivers probe failure like this:
gpio gpiochip0: (tegra-gpio):
gpiochip_lock_as_irq: cannot get GPIO direction tegra-gpio 6000d000.gpio: unable to lock Tegra GPIO 144 as IRQFixes 36b312792b97 ("gpiolib: Respect error code of ->get_direction()")Signed-off-by Dmitry Osipenko <[email protected]>
Patch applied with Jon's tags.
Yours,
Linus Walleij