| From stable+bounces-188094-greg=kroah.com@vger.kernel.org Mon Oct 20 15:02:47 2025 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 20 Oct 2025 09:02:38 -0400 |
| Subject: PM: runtime: Add new devm functions |
| To: stable@vger.kernel.org |
| Cc: "Bence Csókás" <csokas.bence@prolan.hu>, "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>, "Sasha Levin" <sashal@kernel.org> |
| Message-ID: <20251020130239.1763909-1-sashal@kernel.org> |
| |
| From: Bence Csókás <csokas.bence@prolan.hu> |
| |
| [ Upstream commit 73db799bf5efc5a04654bb3ff6c9bf63a0dfa473 ] |
| |
| Add `devm_pm_runtime_set_active_enabled()` and |
| `devm_pm_runtime_get_noresume()` for simplifying |
| common cases in drivers. |
| |
| Signed-off-by: Bence Csókás <csokas.bence@prolan.hu> |
| Link: https://patch.msgid.link/20250327195928.680771-3-csokas.bence@prolan.hu |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Stable-dep-of: 0792c1984a45 ("iio: imu: inv_icm42600: Simplify pm_runtime setup") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/base/power/runtime.c | 44 +++++++++++++++++++++++++++++++++++++++++++ |
| include/linux/pm_runtime.h | 4 +++ |
| 2 files changed, 48 insertions(+) |
| |
| --- a/drivers/base/power/runtime.c |
| +++ b/drivers/base/power/runtime.c |
| @@ -1554,6 +1554,32 @@ out: |
| } |
| EXPORT_SYMBOL_GPL(pm_runtime_enable); |
| |
| +static void pm_runtime_set_suspended_action(void *data) |
| +{ |
| + pm_runtime_set_suspended(data); |
| +} |
| + |
| +/** |
| + * devm_pm_runtime_set_active_enabled - set_active version of devm_pm_runtime_enable. |
| + * |
| + * @dev: Device to handle. |
| + */ |
| +int devm_pm_runtime_set_active_enabled(struct device *dev) |
| +{ |
| + int err; |
| + |
| + err = pm_runtime_set_active(dev); |
| + if (err) |
| + return err; |
| + |
| + err = devm_add_action_or_reset(dev, pm_runtime_set_suspended_action, dev); |
| + if (err) |
| + return err; |
| + |
| + return devm_pm_runtime_enable(dev); |
| +} |
| +EXPORT_SYMBOL_GPL(devm_pm_runtime_set_active_enabled); |
| + |
| static void pm_runtime_disable_action(void *data) |
| { |
| pm_runtime_dont_use_autosuspend(data); |
| @@ -1576,6 +1602,24 @@ int devm_pm_runtime_enable(struct device |
| } |
| EXPORT_SYMBOL_GPL(devm_pm_runtime_enable); |
| |
| +static void pm_runtime_put_noidle_action(void *data) |
| +{ |
| + pm_runtime_put_noidle(data); |
| +} |
| + |
| +/** |
| + * devm_pm_runtime_get_noresume - devres-enabled version of pm_runtime_get_noresume. |
| + * |
| + * @dev: Device to handle. |
| + */ |
| +int devm_pm_runtime_get_noresume(struct device *dev) |
| +{ |
| + pm_runtime_get_noresume(dev); |
| + |
| + return devm_add_action_or_reset(dev, pm_runtime_put_noidle_action, dev); |
| +} |
| +EXPORT_SYMBOL_GPL(devm_pm_runtime_get_noresume); |
| + |
| /** |
| * pm_runtime_forbid - Block runtime PM of a device. |
| * @dev: Device to handle. |
| --- a/include/linux/pm_runtime.h |
| +++ b/include/linux/pm_runtime.h |
| @@ -94,7 +94,9 @@ extern void pm_runtime_new_link(struct d |
| extern void pm_runtime_drop_link(struct device_link *link); |
| extern void pm_runtime_release_supplier(struct device_link *link); |
| |
| +int devm_pm_runtime_set_active_enabled(struct device *dev); |
| extern int devm_pm_runtime_enable(struct device *dev); |
| +int devm_pm_runtime_get_noresume(struct device *dev); |
| |
| /** |
| * pm_suspend_ignore_children - Set runtime PM behavior regarding children. |
| @@ -278,7 +280,9 @@ static inline void __pm_runtime_disable( |
| static inline void pm_runtime_allow(struct device *dev) {} |
| static inline void pm_runtime_forbid(struct device *dev) {} |
| |
| +static inline int devm_pm_runtime_set_active_enabled(struct device *dev) { return 0; } |
| static inline int devm_pm_runtime_enable(struct device *dev) { return 0; } |
| +static inline int devm_pm_runtime_get_noresume(struct device *dev) { return 0; } |
| |
| static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {} |
| static inline void pm_runtime_get_noresume(struct device *dev) {} |