Thread (13 messages) 13 messages, 6 authors, 2013-09-24

Re: [RFC] gpio/omap: auto-setup a GPIO when used as an IRQ

From: Javier Martinez Canillas <hidden>
Date: 2013-09-24 07:55:25
Also in: linux-gpio, linux-omap, lkml

On 09/24/2013 09:39 AM, Sricharan R wrote:
Hi,
On Monday 23 September 2013 10:37 PM, Tony Lindgren wrote:
quoted
* Javier Martinez Canillas [off-list ref] [130923 10:09]:
quoted
On 09/23/2013 06:45 PM, Tony Lindgren wrote:
quoted
Hmm does this still work for legacy platform data based
drivers that are doing gpio_request() first?
Yes it still work when booting using board files. I tested on my OMAP3 board and
it worked in both DT and legacy booting mode.
OK great.
 
quoted
quoted
And what's the path for clearing things for PM when free_irq()
gets called? It seems that this would leave the GPIO bank
enabled causing a PM regression?
Indeed, I did set bank->mod_usage |= 1 << offset so the bank is enabled if the
device goes to suspended and then resumed but I completely forget about the
clearing path when the IRQ is freed.

Which makes me think that we should probably maintain two usage variables, one
for GPIO and another one for IRQ and check both of them on the suspend/resume pm
functions.
Yes that it seems that they should be treated separately.
 To understand, why cant the flag be cleared in gpio_irq_shutdown ?
Hi Sricharan,

Without this patch today drivers do this:

gpio_request(gpio, "foo IRQ"); // bank->mod_usage |= 1 << offset
gpio_direction_input(gpio);

and then request a IRQ with:

irq = gpio_to_irq(gpio);
request_irq(irq, ...);

later on its cleanup path:

free_irq(irq, dev);
gpio_free(gpio) // bank->mod_usage &= ~(1 << offset);

So if you clear the flag on gpio_irq_shutdown then bank module won't be enabled
after a suspend making drivers using the GPIO after freeing the IRQ to fail.

So the idea is to have something like this:

a) Drivers that request both the GPIO and IRQ

gpio_request(gpio, "foo IRQ"); // bank->mod_usage |= 1 << offset
gpio_direction_input(gpio);

irq = gpio_to_irq(gpio);
request_irq(irq, ...); // bank->irq_usage |= 1 << offset

free_irq(irq, dev); // bank->irq_usage &= ~(1 << offset);
gpio_free(gpio) // bank->mod_usage &= ~(1 << offset);

b) Drivers that just request the IRQ:

irq = gpio_to_irq(gpio);
request_irq(irq, ...); // bank->irq_usage |= 1 << offset
free_irq(irq, dev); // bank->irq_usage &= ~(1 << offset);

So irq_usage or mod_usage is set means that the bank has to be enabled and if
both are not set means that the bank module can be disabled.
Regards,
 Sricharan
Best regards,
Javier
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help