UPSTREAM: PM: runtime: Have devm_pm_runtime_enable() handle pm_runtime_dont_use_autosuspend()

[ Upstream commit b4060db9251f919506e4d672737c6b8ab9a84701 ]

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>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Stable-dep-of: 3d07a411b4fa ("drm/msm/dsi: Use pm_runtime_resume_and_get to prevent refcnt leaks")
Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
Change-Id: I3433f1936cdc52ed4c26263de7c5c6fcd058e30c
This commit is contained in:
Douglas Anderson 2022-02-23 08:34:48 -08:00 committed by Amit Pundir
parent f9f96d9da7
commit 7c607fec96
2 changed files with 10 additions and 0 deletions

View File

@ -1477,11 +1477,16 @@ EXPORT_SYMBOL_GPL(pm_runtime_enable);
static void pm_runtime_disable_action(void *data) static void pm_runtime_disable_action(void *data)
{ {
pm_runtime_dont_use_autosuspend(data);
pm_runtime_disable(data); pm_runtime_disable(data);
} }
/** /**
* devm_pm_runtime_enable - devres-enabled version of pm_runtime_enable. * 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. * @dev: Device to handle.
*/ */
int devm_pm_runtime_enable(struct device *dev) int devm_pm_runtime_enable(struct device *dev)

View File

@ -296,6 +296,11 @@ static inline void pm_runtime_disable(struct device *dev)
__pm_runtime_disable(dev, true); __pm_runtime_disable(dev, true);
} }
/**
* 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) static inline void pm_runtime_use_autosuspend(struct device *dev)
{ {
__pm_runtime_use_autosuspend(dev, true); __pm_runtime_use_autosuspend(dev, true);