Similar to this effort:
Subject: [PATCH v1 00/23] PM: runtime: Convert pm_runtime_put() to a void function https://lore.kernel.org/all/6245770.lOV4Wx5bFT@rafael.j.wysocki/
i.e., commit 3afd8df02433 ("PM: runtime: Change pm_runtime_put() return type to void") and friends.
As with pm_runtime_put(), there is very little value in return-code checking for any of the other async __pm_runtime_suspend() and __pm_runtime_idle() APIs:
pm_runtime_put_autosuspend() pm_request_idle() pm_request_autosuspend()
Checking the return code is more likely to produce a race condition (fighting with user space writing "on" to the "control" attribute) than to tell a consumer useful info.
Nobody outside KUnit tests checks pm_request_idle() or pm_request_autosuspend() return codes, but there are a number of pm_runtime_put_autosuspend() callers that check its return code. Thus, this series largely deals with pm_runtime_put_autosuspend().
Patches 1-11 are independent of each other, and similarly to the last series, I expect the respective maintainers can pick them up. We can apply patch 12 later. Patch 13 is also independent, but included in this topic for completeness. It can be applied any time.
This touches a lot of trees/maintainers, so I tried to keep CC's only for the relevant patch(es), plus the cover letter. I hope that's not too noisy.
- Brian
Brian Norris (13): hwrng: cctrng: Discard pm_runtime_put_autosuspend() return value drm: Discard pm_runtime_put_autosuspend() return values iio: Discard pm_runtime_put_autosuspend() return values media: venus: Discard pm_runtime_put_autosuspend() return values pinctrl: qcom: lpass-lpi: Discard pm_runtime_put_autosuspend() return values spi: ti-qspi: Discard pm_runtime_put_autosuspend() return value greybus: Discard pm_runtime_put_autosuspend() return value ALSA: hda: Discard pm_runtime_put_autosuspend() return value ASoC: codecs: lpass: Discard pm_runtime_put_autosuspend() return values ASoC: intel: atom: Discard pm_runtime_put_autosuspend() return value ASoC: SOF: Discard pm_runtime_put_autosuspend() return values PM: runtime: Drop pm_runtime_put_autosuspend() return code PM: runtime: Drop pm_request_{idle,autosuspend}() return codes
drivers/base/power/runtime-test.c | 8 --- drivers/char/hw_random/cctrng.c | 6 +- drivers/gpu/drm/panel/panel-simple.c | 8 +-- drivers/gpu/drm/tidss/tidss_drv.c | 7 +-- drivers/gpu/drm/v3d/v3d_drv.h | 4 +- drivers/iio/accel/bmc150-accel-core.c | 14 ++--- drivers/iio/accel/fxls8962af-core.c | 11 +--- drivers/iio/accel/kxcjk-1013.c | 15 ++--- drivers/iio/accel/mma8452.c | 15 +++-- drivers/iio/accel/mma9551_core.c | 15 +++-- drivers/iio/adc/rcar-gyroadc.c | 4 +- drivers/iio/adc/ti-ads1015.c | 8 +-- drivers/iio/chemical/atlas-sensor.c | 4 +- .../common/hid-sensors/hid-sensor-trigger.c | 14 ++--- drivers/iio/gyro/bmg160_core.c | 17 +++-- drivers/iio/gyro/fxas21002c_core.c | 12 ++-- drivers/iio/imu/kmx61.c | 17 +++-- drivers/iio/light/apds9960.c | 2 +- drivers/iio/light/isl29028.c | 15 +---- drivers/iio/light/pa12203001.c | 3 +- drivers/iio/light/rpr0521.c | 15 +++-- drivers/iio/light/tsl2583.c | 27 ++------ drivers/iio/light/us5182d.c | 3 +- drivers/media/platform/qcom/venus/vdec.c | 10 ++- drivers/media/platform/qcom/venus/venc.c | 10 ++- drivers/pinctrl/qcom/pinctrl-lpass-lpi.c | 16 +++-- drivers/spi/spi-ti-qspi.c | 6 +- drivers/staging/greybus/power_supply.c | 8 +-- include/linux/greybus/bundle.h | 12 +--- include/linux/pm_runtime.h | 63 +++---------------- include/sound/hdaudio.h | 8 +-- sound/hda/core/device.c | 13 ++-- sound/soc/codecs/lpass-rx-macro.c | 4 +- sound/soc/codecs/lpass-tx-macro.c | 4 +- sound/soc/codecs/lpass-va-macro.c | 17 ++--- sound/soc/codecs/lpass-wsa-macro.c | 8 +-- sound/soc/intel/atom/sst/sst.h | 2 +- sound/soc/intel/atom/sst/sst_drv_interface.c | 4 +- sound/soc/intel/atom/sst/sst_pvt.c | 9 +-- sound/soc/sof/control.c | 6 +- sound/soc/sof/sof-client-ipc-flood-test.c | 5 +- .../soc/sof/sof-client-ipc-kernel-injector.c | 4 +- sound/soc/sof/sof-client-ipc-msg-injector.c | 6 +- sound/soc/sof/sof-client-probes.c | 18 ++---- 44 files changed, 152 insertions(+), 325 deletions(-)
Returning an error code from pm_runtime_put_autosuspend() merely means that it has not queued up a timer or work item to check whether or not the device can be suspended and there are many perfectly valid situations in which that can happen, like after writing "on" to the device's runtime PM "control" attribute in sysfs for one example.
Modify gb_pm_runtime_put_autosuspend() to discard the pm_runtime_put_autosuspend() return value, change its return type to void, and update its caller in the Greybus power supply driver accordingly. Also drop the redundant pm_runtime_mark_last_busy() call from gb_pm_runtime_put_autosuspend() while we're here, as this is already part of pm_runtime_put_autosuspend().
Note that this resolves a bug in the power_supply driver: in tracking 'gbpsy->pm_acquired', it erroneously assumed that pm_runtime_put_autosuspend() would not release a refcount when it returned a non-zero value. That's a false assumption.
This will facilitate a planned change of the pm_runtime_put_autosuspend() return type to void in the future, similar to commit 3afd8df02433 ("PM: runtime: Change pm_runtime_put() return type to void").
Signed-off-by: Brian Norris briannorris@chromium.org --- This patch is independent of the rest of the series, except for the end (changing the return type). I expect it can be applied by individual maintainers, and we pick up the end once the dust is settled.
drivers/staging/greybus/power_supply.c | 8 ++------ include/linux/greybus/bundle.h | 12 +++--------- 2 files changed, 5 insertions(+), 15 deletions(-)
diff --git a/drivers/staging/greybus/power_supply.c b/drivers/staging/greybus/power_supply.c index 44bd8a72fa50..beefcbaf3681 100644 --- a/drivers/staging/greybus/power_supply.c +++ b/drivers/staging/greybus/power_supply.c @@ -377,12 +377,8 @@ static void gb_power_supply_state_change(struct gb_power_supply *gbpsy, gbpsy->pm_acquired = true; } else { if (gbpsy->pm_acquired) { - ret = gb_pm_runtime_put_autosuspend(connection->bundle); - if (ret) - dev_err(&connection->bundle->dev, - "Fail to set wake unlock for none charging\n"); - else - gbpsy->pm_acquired = false; + gb_pm_runtime_put_autosuspend(connection->bundle); + gbpsy->pm_acquired = false; } }
diff --git a/include/linux/greybus/bundle.h b/include/linux/greybus/bundle.h index df8d88424cb7..361a94d3499b 100644 --- a/include/linux/greybus/bundle.h +++ b/include/linux/greybus/bundle.h @@ -59,14 +59,9 @@ static inline int gb_pm_runtime_get_sync(struct gb_bundle *bundle) return 0; }
-static inline int gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) +static inline void gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) { - int retval; - - pm_runtime_mark_last_busy(&bundle->dev); - retval = pm_runtime_put_autosuspend(&bundle->dev); - - return retval; + pm_runtime_put_autosuspend(&bundle->dev); }
static inline void gb_pm_runtime_get_noresume(struct gb_bundle *bundle) @@ -82,8 +77,7 @@ static inline void gb_pm_runtime_put_noidle(struct gb_bundle *bundle) #else static inline int gb_pm_runtime_get_sync(struct gb_bundle *bundle) { return 0; } -static inline int gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) -{ return 0; } +static inline void gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) {}
static inline void gb_pm_runtime_get_noresume(struct gb_bundle *bundle) {} static inline void gb_pm_runtime_put_noidle(struct gb_bundle *bundle) {}
On 10/6/26 6:13 PM, Brian Norris wrote:
Returning an error code from pm_runtime_put_autosuspend() merely means that it has not queued up a timer or work item to check whether or not the device can be suspended and there are many perfectly valid situations in which that can happen, like after writing "on" to the device's runtime PM "control" attribute in sysfs for one example.
If I understand this right, "put autosuspend" is basically an unconditional "put" with the assumption that auto-suspend will ensure the eventual suspend occurs sometime after the reference count reaches zero.
Modify gb_pm_runtime_put_autosuspend() to discard the pm_runtime_put_autosuspend() return value, change its return type to void, and update its caller in the Greybus power supply driver accordingly. Also drop the redundant pm_runtime_mark_last_busy() call from gb_pm_runtime_put_autosuspend() while we're here, as this is already part of pm_runtime_put_autosuspend().
I support including this fix in this patch.
Note that this resolves a bug in the power_supply driver: in tracking 'gbpsy->pm_acquired', it erroneously assumed that pm_runtime_put_autosuspend() would not release a refcount when it returned a non-zero value. That's a false assumption.
So is it safe for this code to assume the reference count has been decremented in this case? The comments say we're trying to ensure there's exactly one get/put pair. (I don't know the reasoning behind that though.)
This will facilitate a planned change of the pm_runtime_put_autosuspend() return type to void in the future, similar to commit 3afd8df02433 ("PM: runtime: Change pm_runtime_put() return type to void").
Signed-off-by: Brian Norris briannorris@chromium.org
Despite my questions/comments I think this looks good.
Reviewed-by: Alex Elder elder@riscstar.com
This patch is independent of the rest of the series, except for the end (changing the return type). I expect it can be applied by individual maintainers, and we pick up the end once the dust is settled.
drivers/staging/greybus/power_supply.c | 8 ++------ include/linux/greybus/bundle.h | 12 +++--------- 2 files changed, 5 insertions(+), 15 deletions(-)
diff --git a/drivers/staging/greybus/power_supply.c b/drivers/staging/greybus/power_supply.c index 44bd8a72fa50..beefcbaf3681 100644 --- a/drivers/staging/greybus/power_supply.c +++ b/drivers/staging/greybus/power_supply.c @@ -377,12 +377,8 @@ static void gb_power_supply_state_change(struct gb_power_supply *gbpsy, gbpsy->pm_acquired = true; } else { if (gbpsy->pm_acquired) {
ret = gb_pm_runtime_put_autosuspend(connection->bundle);if (ret)dev_err(&connection->bundle->dev,"Fail to set wake unlock for none charging\n");elsegbpsy->pm_acquired = false;
gb_pm_runtime_put_autosuspend(connection->bundle); } }gbpsy->pm_acquired = false;diff --git a/include/linux/greybus/bundle.h b/include/linux/greybus/bundle.h index df8d88424cb7..361a94d3499b 100644 --- a/include/linux/greybus/bundle.h +++ b/include/linux/greybus/bundle.h @@ -59,14 +59,9 @@ static inline int gb_pm_runtime_get_sync(struct gb_bundle *bundle) return 0; } -static inline int gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) +static inline void gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) {
- int retval;
- pm_runtime_mark_last_busy(&bundle->dev);
- retval = pm_runtime_put_autosuspend(&bundle->dev);
- return retval;
- pm_runtime_put_autosuspend(&bundle->dev); }
static inline void gb_pm_runtime_get_noresume(struct gb_bundle *bundle) @@ -82,8 +77,7 @@ static inline void gb_pm_runtime_put_noidle(struct gb_bundle *bundle) #else static inline int gb_pm_runtime_get_sync(struct gb_bundle *bundle) { return 0; } -static inline int gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) -{ return 0; } +static inline void gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) {} static inline void gb_pm_runtime_get_noresume(struct gb_bundle *bundle) {} static inline void gb_pm_runtime_put_noidle(struct gb_bundle *bundle) {}
Hi Alex,
On Wed, Oct 07, 2026 at 09:28:45AM -0500, Alex Elder wrote:
On 10/6/26 6:13 PM, Brian Norris wrote:
Returning an error code from pm_runtime_put_autosuspend() merely means that it has not queued up a timer or work item to check whether or not the device can be suspended and there are many perfectly valid situations in which that can happen, like after writing "on" to the device's runtime PM "control" attribute in sysfs for one example.
If I understand this right, "put autosuspend" is basically an unconditional "put" with the assumption that auto-suspend will ensure the eventual suspend occurs sometime after the reference count reaches zero.
Yes. Similar pattern for any other pm_runtime_put... variant -- they always decrement the reference counter, even if they otherwise return non-zero/error.
It definitely can be confusing, and it's one reason for $subject series -- to remove confusing API surface when it doesn't help. (Similar story for pm_runtime_get_sync() -- it increments the reference count, even on error. That's why pm_runtime_resume_and_get() was invented.)
Modify gb_pm_runtime_put_autosuspend() to discard the pm_runtime_put_autosuspend() return value, change its return type to void, and update its caller in the Greybus power supply driver accordingly. Also drop the redundant pm_runtime_mark_last_busy() call from gb_pm_runtime_put_autosuspend() while we're here, as this is already part of pm_runtime_put_autosuspend().
I support including this fix in this patch.
Note that this resolves a bug in the power_supply driver: in tracking 'gbpsy->pm_acquired', it erroneously assumed that pm_runtime_put_autosuspend() would not release a refcount when it returned a non-zero value. That's a false assumption.
So is it safe for this code to assume the reference count has been decremented in this case?
Correct.
The comments say we're trying to ensure there's exactly one get/put pair. (I don't know the reasoning behind that though.)
I didn't look too far into this, but on first glance, it looks like gb_power_supply_state_change() can receieve a number of different properties, several of which mean "off". We only want the first "off" to drop a reference count.
That seems like a fairly typical sort of pattern, and the right answer is to ignore the return code, because the reference count was decremented unconditionally.
This will facilitate a planned change of the pm_runtime_put_autosuspend() return type to void in the future, similar to commit 3afd8df02433 ("PM: runtime: Change pm_runtime_put() return type to void").
Signed-off-by: Brian Norris briannorris@chromium.org
Despite my questions/comments I think this looks good.
Reviewed-by: Alex Elder elder@riscstar.com
Thanks, Brian
This patch is independent of the rest of the series, except for the end (changing the return type). I expect it can be applied by individual maintainers, and we pick up the end once the dust is settled.
drivers/staging/greybus/power_supply.c | 8 ++------ include/linux/greybus/bundle.h | 12 +++--------- 2 files changed, 5 insertions(+), 15 deletions(-)
diff --git a/drivers/staging/greybus/power_supply.c b/drivers/staging/greybus/power_supply.c index 44bd8a72fa50..beefcbaf3681 100644 --- a/drivers/staging/greybus/power_supply.c +++ b/drivers/staging/greybus/power_supply.c @@ -377,12 +377,8 @@ static void gb_power_supply_state_change(struct gb_power_supply *gbpsy, gbpsy->pm_acquired = true; } else { if (gbpsy->pm_acquired) {
ret = gb_pm_runtime_put_autosuspend(connection->bundle);if (ret)dev_err(&connection->bundle->dev,"Fail to set wake unlock for none charging\n");elsegbpsy->pm_acquired = false;
gb_pm_runtime_put_autosuspend(connection->bundle); } }gbpsy->pm_acquired = false;diff --git a/include/linux/greybus/bundle.h b/include/linux/greybus/bundle.h index df8d88424cb7..361a94d3499b 100644 --- a/include/linux/greybus/bundle.h +++ b/include/linux/greybus/bundle.h @@ -59,14 +59,9 @@ static inline int gb_pm_runtime_get_sync(struct gb_bundle *bundle) return 0; } -static inline int gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) +static inline void gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) {
- int retval;
- pm_runtime_mark_last_busy(&bundle->dev);
- retval = pm_runtime_put_autosuspend(&bundle->dev);
- return retval;
- pm_runtime_put_autosuspend(&bundle->dev); } static inline void gb_pm_runtime_get_noresume(struct gb_bundle *bundle)
@@ -82,8 +77,7 @@ static inline void gb_pm_runtime_put_noidle(struct gb_bundle *bundle) #else static inline int gb_pm_runtime_get_sync(struct gb_bundle *bundle) { return 0; } -static inline int gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) -{ return 0; } +static inline void gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) {} static inline void gb_pm_runtime_get_noresume(struct gb_bundle *bundle) {} static inline void gb_pm_runtime_put_noidle(struct gb_bundle *bundle) {}
On Tue, 06 Oct 2026 16:13:28 -0700, Brian Norris wrote:
Similar to this effort:
Subject: [PATCH v1 00/23] PM: runtime: Convert pm_runtime_put() to a void function https://lore.kernel.org/all/6245770.lOV4Wx5bFT@rafael.j.wysocki/
i.e., commit 3afd8df02433 ("PM: runtime: Change pm_runtime_put() return type to void") and friends.
[...]
Applied, thanks!
[05/13] pinctrl: qcom: lpass-lpi: Discard pm_runtime_put_autosuspend() return values https://git.kernel.org/brgl/c/9bcd1725b0cc7954525e3d0d02fecaec7c7aab33
Best regards,