On 16 October 2013 02:21, Rafael J. Wysocki <r...@rjwysocki.net> wrote: > On Tuesday, October 15, 2013 04:43:38 PM Alan Stern wrote: >> On Tue, 15 Oct 2013, Ulf Hansson wrote: >> >> > For devices which don't have a .runtime_idle callback or if it returns >> > 0, rpm_idle will end up in triggering a call to rpm_suspend, thus >> > trying to carry out a runtime_suspend directly from runtime_idle. >> > >> > In the above situation we want to respect devices which has enabled >> > autosuspend, we therfore append the flag sent to rpm_suspend with >> > RPM_AUTO. >> > >> > Do note that drivers still needs to update the device last busy mark, >> > to control the delay for this circumstance. >> > >> > Updated runtime PM documentation accordingly. >> > >> > Cc: Alan Stern <st...@rowland.harvard.edu> >> > Cc: Mika Westerberg <mika.westerb...@linux.intel.com> >> > Cc: Kevin Hilman <khil...@linaro.org> >> > Cc: Rob Landley <r...@landley.net> >> > Cc: Chris Ball <c...@laptop.org> >> > Cc: linux-mmc@vger.kernel.org >> > Signed-off-by: Ulf Hansson <ulf.hans...@linaro.org> >> > Acked-by: Kevin Hilman <khil...@linaro.org> >> > --- >> > Documentation/power/runtime_pm.txt | 14 ++++++++------ >> > drivers/base/power/runtime.c | 5 +++-- >> > 2 files changed, 11 insertions(+), 8 deletions(-) >> > >> > diff --git a/Documentation/power/runtime_pm.txt >> > b/Documentation/power/runtime_pm.txt >> > index 71d8fe4..0f54333 100644 >> > --- a/Documentation/power/runtime_pm.txt >> > +++ b/Documentation/power/runtime_pm.txt >> > @@ -145,11 +145,13 @@ The action performed by the idle callback is totally >> > dependent on the subsystem >> > if the device can be suspended (i.e. if all of the conditions necessary >> > for >> > suspending the device are satisfied) and to queue up a suspend request >> > for the >> > device in that case. If there is no idle callback, or if the callback >> > returns >> > -0, then the PM core will attempt to carry out a runtime suspend of the >> > device; >> > -in essence, it will call pm_runtime_suspend() directly. To prevent this >> > (for >> > -example, if the callback routine has started a delayed suspend), the >> > routine >> > -should return a non-zero value. Negative error return codes are ignored >> > by the >> > -PM core. >> > +0, then the PM core will attempt to carry out a runtime suspend of the >> > device, >> > +also respecting devices configured for autosuspend. In essence this >> > means a >> > +call to pm_runtime_autosuspend() (do note that drivers needs to update the >> > +device last busy mark, pm_runtime_mark_last_busy(), to control the delay >> > under >> > +this circumstance). To prevent this (for example, if the callback >> > routine has >> > +started a delayed suspend), the routine must return a non-zero value. >> > Negative >> > +error return codes are ignored by the PM core. >> > >> > The helper functions provided by the PM core, described in Section 4, >> > guarantee >> > that the following constraints are met with respect to runtime PM >> > callbacks for >> > @@ -308,7 +310,7 @@ drivers/base/power/runtime.c and >> > include/linux/pm_runtime.h: >> > - execute the subsystem-level idle callback for the device; returns an >> > error code on failure, where -EINPROGRESS means that >> > ->runtime_idle() is >> > already being executed; if there is no callback or the callback >> > returns 0 >> > - then run pm_runtime_suspend(dev) and return its result >> > + then run pm_runtime_autosuspend(dev) and return its result >> > >> > int pm_runtime_suspend(struct device *dev); >> > - execute the subsystem-level suspend callback for the device; >> > returns 0 on >> > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c >> > index 268a350..72e00e6 100644 >> > --- a/drivers/base/power/runtime.c >> > +++ b/drivers/base/power/runtime.c >> > @@ -258,7 +258,8 @@ static int __rpm_callback(int (*cb)(struct device *), >> > struct device *dev) >> > * Check if the device's runtime PM status allows it to be suspended. If >> > * another idle notification has been started earlier, return >> > immediately. If >> > * the RPM_ASYNC flag is set then queue an idle-notification request; >> > otherwise >> > - * run the ->runtime_idle() callback directly. >> > + * run the ->runtime_idle() callback directly. If the ->runtime_idle >> > callback >> > + * doesn't exist or if it returns 0, call rpm_suspend with the RPM_AUTO >> > flag. >> > * >> > * This function must be called under dev->power.lock with interrupts >> > disabled. >> > */ >> > @@ -331,7 +332,7 @@ static int rpm_idle(struct device *dev, int rpmflags) >> > >> > out: >> > trace_rpm_return_int(dev, _THIS_IP_, retval); >> > - return retval ? retval : rpm_suspend(dev, rpmflags); >> > + return retval ? retval : rpm_suspend(dev, rpmflags | RPM_AUTO); >> > } >> > >> > /** >> >> Acked-by: Alan Stern <st...@rowland.harvard.edu> > > I've queued up this patch for 3.13. > > Thanks!
Rafael, Alan - thanks a lot for helping out around this patch! Kind regards Ulf Hansson > > -- > I speak only for myself. > Rafael J. Wysocki, Intel Open Source Technology Center. -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html