[1/7] gpio: omap: fix omap_gpio_free to not clean up irq configuration
diff mbox

Message ID 1432305354-5968-2-git-send-email-grygorii.strashko@linaro.org
State New
Headers show

Commit Message

Grygorii.Strashko@linaro.org May 22, 2015, 2:35 p.m. UTC
This patch fixes following issue:
- GPIOn is used as IRQ by some dev, for example PCF8575.INT ->  gpio6.11
- PCFx driver knows nothing about type of IRQ line (GPIO or not)
  so it doesn't request gpio and just do request_irq()
- If gpio6.11 will be exported through the sysfs and then un-xeported
then IRQs from PCFx will not be received any more, because
IRQ configuration for gpio6.11 will be cleaned up unconditionally
in omap_gpio_free.

Fix this by removing all GPIO IRQ specific code from omap_gpio_free()
and also do GPIO clean up (change direction to 'in' and disable debounce)
only if corresponding GPIO is not used as IRQ too.
GPIO IRQ will be properly cleaned up by GPIO irqchip code.

Signed-off-by: Grygorii Strashko <grygorii.strashko@linaro.org>
---
 drivers/gpio/gpio-omap.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Linus Walleij June 1, 2015, 1:11 p.m. UTC | #1
On Fri, May 22, 2015 at 4:35 PM, Grygorii Strashko
<grygorii.strashko@linaro.org> wrote:

> This patch fixes following issue:
> - GPIOn is used as IRQ by some dev, for example PCF8575.INT ->  gpio6.11
> - PCFx driver knows nothing about type of IRQ line (GPIO or not)
>   so it doesn't request gpio and just do request_irq()
> - If gpio6.11 will be exported through the sysfs and then un-xeported
> then IRQs from PCFx will not be received any more, because
> IRQ configuration for gpio6.11 will be cleaned up unconditionally
> in omap_gpio_free.
>
> Fix this by removing all GPIO IRQ specific code from omap_gpio_free()
> and also do GPIO clean up (change direction to 'in' and disable debounce)
> only if corresponding GPIO is not used as IRQ too.
> GPIO IRQ will be properly cleaned up by GPIO irqchip code.
>
> Signed-off-by: Grygorii Strashko <grygorii.strashko@linaro.org>

Can I get an ACK or comment from one of the three (!) maintainers
on atleast these non-RFC patches?

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Javier Martinez Canillas June 2, 2015, 9:31 a.m. UTC | #2
Hello Linus,

On Mon, Jun 1, 2015 at 3:11 PM, Linus Walleij <linus.walleij@linaro.org> wrote:
> On Fri, May 22, 2015 at 4:35 PM, Grygorii Strashko
> <grygorii.strashko@linaro.org> wrote:
>
>> This patch fixes following issue:
>> - GPIOn is used as IRQ by some dev, for example PCF8575.INT ->  gpio6.11
>> - PCFx driver knows nothing about type of IRQ line (GPIO or not)
>>   so it doesn't request gpio and just do request_irq()
>> - If gpio6.11 will be exported through the sysfs and then un-xeported
>> then IRQs from PCFx will not be received any more, because
>> IRQ configuration for gpio6.11 will be cleaned up unconditionally
>> in omap_gpio_free.
>>
>> Fix this by removing all GPIO IRQ specific code from omap_gpio_free()
>> and also do GPIO clean up (change direction to 'in' and disable debounce)
>> only if corresponding GPIO is not used as IRQ too.
>> GPIO IRQ will be properly cleaned up by GPIO irqchip code.
>>
>> Signed-off-by: Grygorii Strashko <grygorii.strashko@linaro.org>
>
> Can I get an ACK or comment from one of the three (!) maintainers
> on atleast these non-RFC patches?
>

Sorry for the delay, the patch looks good to me.

Acked-by: Javier Martinez Canillas <javier@dowhile0.org>

> Yours,
> Linus Walleij

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

Patch
diff mbox

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index b232397..bb60cbc 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -690,8 +690,11 @@  static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
 
 	spin_lock_irqsave(&bank->lock, flags);
 	bank->mod_usage &= ~(BIT(offset));
+	if (!LINE_USED(bank->irq_usage, offset)) {
+		omap_set_gpio_direction(bank, offset, 1);
+		omap_clear_gpio_debounce(bank, offset);
+	}
 	omap_disable_gpio_module(bank, offset);
-	omap_reset_gpio(bank, offset);
 	spin_unlock_irqrestore(&bank->lock, flags);
 
 	/*