Thread (9 messages) 9 messages, 5 authors, 2015-10-30

[PATCH] gpio: zynq: Implement irq_(request|release)_resources

From: Thomas Gleixner <hidden>
Date: 2015-10-30 10:05:45
Also in: linux-gpio, lkml

On Tue, 27 Oct 2015, Lars-Peter Clausen wrote:
On 10/27/2015 04:53 PM, Linus Walleij wrote:
quoted
On Fri, Oct 23, 2015 at 3:36 PM, Soren Brinkmann
[off-list ref] wrote:
quoted
The driver uses runtime PM to leverage low power techniques. For
use-cases using GPIO as interrupt the device needs to be in an
appropriate state.

Reported-by: John Linn <redacted>
Signed-off-by: Soren Brinkmann <redacted>
Tested-by: John Linn <redacted>
As pointed out by Grygorii in
commit aca82d1cbb49af34b69ecd4571a0fe48ad9247c1:

    The PM runtime API can't be used in atomic contex on -RT even if
    it's configured as irqsafe. As result, below error report can
    be seen when PM runtime API called from IRQ chip's callbacks
    irq_startup/irq_shutdown/irq_set_type, because they are
    protected by RAW spinlock:
(...)
    The IRQ chip interface defines only two callbacks which are executed in
    non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
    PM runtime calls there.

I.e. these calls are atomic context and it's just luck that it works
and this is fragile.

Can you please check if you can move it to
irq_bus_lock()/irq_sync_unlock()
like Grygorii does?
That only powers up the chip when the chip is accessed. For proper IRQ
operation the chip needs to be powered up though as long as the IRQ is
enabled. request_irq() and free_irq() must always be called from sleepable
context. The thing is just that request_resource/release_resource are called
from within a raw spinlock, which is necessary since otherwise you can't
guarantee that they are only called once for shared interrupts.

It might make sense to add a separate set of callbacks to the irq_chip
struct that are called from the sleepable sections of
request_irq()/free_irq() which are meant for power management purposes and
which wont have the guarantee that they are only called once for shared IRQs
(but are still balanced).

Thomas, do you have any thoughts on this?
If you want to keep the chip powered as long as an interrupt is
enabled, then having a irq chip callback might be the proper solution.

Thanks,

	tglx
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help