From: Rafael J. Wysocki Date: Tue, 18 Feb 2025 20:13:09 +0000 (+0100) Subject: PM: runtime: Introduce pm_runtime_blocked() X-Git-Tag: v6.15-rc1~191^2~1^2~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=758cc55ce3d5d79e8f98adbd03ad2cd29133af33;p=thirdparty%2Fkernel%2Flinux.git PM: runtime: Introduce pm_runtime_blocked() Introduce a new helper function called pm_runtime_blocked() for checking the power.last_status value indicating whether or not enabling runtime PM for the given device has been blocked (which happens in the "prepare" phase of system-wide suspend if runtime PM is disabled for the given device at that point). Signed-off-by: Rafael J. Wysocki Reviewed-by: Ulf Hansson Link: https://patch.msgid.link/4632087.LvFx2qVVIh@rjwysocki.net --- diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 797ea38ceba7d..c0f5a9f892997 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -1555,6 +1555,23 @@ out: } EXPORT_SYMBOL_GPL(pm_runtime_enable); +bool pm_runtime_blocked(struct device *dev) +{ + bool ret; + + /* + * dev->power.last_status is a bit field, so in case it is updated via + * RMW, read it under the spin lock. + */ + spin_lock_irq(&dev->power.lock); + + ret = dev->power.last_status == RPM_BLOCKED; + + spin_unlock_irq(&dev->power.lock); + + return ret; +} + static void pm_runtime_disable_action(void *data) { pm_runtime_dont_use_autosuspend(data); diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 10769119867b5..aea0395c10a14 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -81,6 +81,7 @@ extern void pm_runtime_block_if_disabled(struct device *dev); extern void pm_runtime_unblock(struct device *dev); extern void pm_runtime_enable(struct device *dev); extern void __pm_runtime_disable(struct device *dev, bool check_resume); +extern bool pm_runtime_blocked(struct device *dev); extern void pm_runtime_allow(struct device *dev); extern void pm_runtime_forbid(struct device *dev); extern void pm_runtime_no_callbacks(struct device *dev); @@ -277,6 +278,7 @@ static inline void pm_runtime_block_if_disabled(struct device *dev) {} static inline void pm_runtime_unblock(struct device *dev) {} static inline void pm_runtime_enable(struct device *dev) {} static inline void __pm_runtime_disable(struct device *dev, bool c) {} +static inline bool pm_runtime_blocked(struct device *dev) { return true; } static inline void pm_runtime_allow(struct device *dev) {} static inline void pm_runtime_forbid(struct device *dev) {}