Messages in this thread | | | From | Ulf Hansson <> | Date | Fri, 4 Mar 2022 11:03:28 +0100 | Subject | Re: [PATCH] PM: runtime: Have devm_pm_runtime_enable() handle pm_runtime_dont_use_autosuspend() |
| |
On Wed, 23 Feb 2022 at 17:35, Douglas Anderson <dianders@chromium.org> wrote: > > The PM Runtime docs say: > Drivers in ->remove() callback should undo the runtime PM changes done > in ->probe(). Usually this means calling pm_runtime_disable(), > pm_runtime_dont_use_autosuspend() etc. > > From grepping code, it's clear that many people aren't aware of the > need to call pm_runtime_dont_use_autosuspend(). > > When brainstorming solutions, one idea that came up was to leverage > the new-ish devm_pm_runtime_enable() function. The idea here is that: > * When the devm action is called we know that the driver is being > removed. It's the perfect time to undo the use_autosuspend. > * The code of pm_runtime_dont_use_autosuspend() already handles the > case of being called when autosuspend wasn't enabled. > > Suggested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Signed-off-by: Douglas Anderson <dianders@chromium.org>
Okay, this provides an improvement from the short term perspective.
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
When I get some time, I will try to explore the ->remove() and ->probe() error-path case a bit more, to try to suggest a new interface that might be able to replace the devm_pm_runtime_enable(). Let's see...
Kind regards Uffe
> --- > > drivers/base/power/runtime.c | 5 +++++ > include/linux/pm_runtime.h | 4 ++++ > 2 files changed, 9 insertions(+) > > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c > index 2f3cce17219b..d4059e6ffeae 100644 > --- a/drivers/base/power/runtime.c > +++ b/drivers/base/power/runtime.c > @@ -1476,11 +1476,16 @@ EXPORT_SYMBOL_GPL(pm_runtime_enable); > > static void pm_runtime_disable_action(void *data) > { > + pm_runtime_dont_use_autosuspend(data); > pm_runtime_disable(data); > } > > /** > * devm_pm_runtime_enable - devres-enabled version of pm_runtime_enable. > + * > + * NOTE: this will also handle calling pm_runtime_dont_use_autosuspend() for > + * you at driver exit time if needed. > + * > * @dev: Device to handle. > */ > int devm_pm_runtime_enable(struct device *dev) > diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h > index 9f09601c465a..2bff6a10095d 100644 > --- a/include/linux/pm_runtime.h > +++ b/include/linux/pm_runtime.h > @@ -567,6 +567,10 @@ static inline void pm_runtime_disable(struct device *dev) > * Allow the runtime PM autosuspend mechanism to be used for @dev whenever > * requested (or "autosuspend" will be handled as direct runtime-suspend for > * it). > + * > + * NOTE: It's important to undo this with pm_runtime_dont_use_autosuspend() > + * at driver exit time unless your driver initially enabled pm_runtime > + * with devm_pm_runtime_enable() (which handles it for you). > */ > static inline void pm_runtime_use_autosuspend(struct device *dev) > { > -- > 2.35.1.473.g83b2b277ed-goog >
| |