On 11/22/2012 04:59 PM, Linus Walleij wrote:
On Thu, Nov 22, 2012 at 2:52 PM, Rickard Andersson
<rickard.andersson@xxxxxxxxxxxxxx> wrote:
Another thing that I am trying to find out is if genpd works ok if a driver
in the power domain does pm_runtime_get_sync(..) in interrupt context?
I discussed this with Kevin Hilman in Copenhagen some weeks
back.
Basically IIRC it is OK to call *_sync() operations from interrupt
context if and only if you have first called
pm_runtime_irq_safe(struct device *dev)
on the device.
You can check in
drivers/base/power/runtime.c
what happens when this flag is set: for example idling
does not propagate upwards to parents immediately, since
the parent may not be able to *_sync() in interrupt context.
Documentation/power/runtime.txt has even more details,
but doesn't talk about the PM domains explicitly, as far as
I can tell it's a convention that if you set pm_runtime_irq_safe()
for the device, then the PM domain, bus, and device
suspend/resume/etc callbacks (whatever you have) all
need to be IRQ safe.
I guess the driver has to mark itself irqsafe in its
probe().
If a driver does *_sync() in IRQ context and the device
is not flagged as IRQ safe the PM core will puke warnings
from code sites like this:
might_sleep_if(!(rpmflags& RPM_ASYNC)&& !dev->power.irq_safe);
So you will notice.
However I wonder what I as a driver writer should do if
I mark my driver as pm_runtime_irq_safe() and then do
a *_sync() operation in IRQ context.
I *guess* I shall just assume that any PM domain using this
will have to adopt to this constraint coming from the device
it is trying to handle, as it gets this _sync() call, basically
the PM domain will inherit the limitation and cannot do
anything non-atomic if it is to handle a device like this.
So its like a PROLOG engine that propagates constraints
upward at runtime and screams if it can't resolve the
constraints.
Now Kevin& Rafael can correct all my mistakes in the
above understanding ...
Yours,
Linus Walleij
My question was particularly regarding using the generic power domains
implemented in drivers/base/power/domain.c.
BR
Rickard