[PATCH togreg 2/2] iio: imu: inv_icm42607: restore runtime PM on system resume errors
From: Linmao Li
Date: Tue Aug 04 2026 - 23:55:28 EST
pm_runtime_force_suspend() leaves runtime PM disabled after it succeeds and
expects pm_runtime_force_resume() to restore runtime PM management during
system resume.
The resume callback returns early if enabling the vddio regulator or
synchronizing the register cache fails, skipping the matching
pm_runtime_force_resume() call. Runtime PM consequently remains disabled
after the system has resumed, so runtime autosuspend can no longer turn off
sensors enabled afterward.
Call pm_runtime_force_resume() on both error paths. Keep the first error as
the return value and report a runtime PM restore failure separately.
Fixes: 3007c1530f96 ("iio: imu: inv_icm42607: Add PM support for icm42607")
Signed-off-by: Linmao Li <lilinmao@xxxxxxxxxx>
---
Based on iio.git togreg at 0efaefce4e95.
.../iio/imu/inv_icm42607/inv_icm42607_core.c | 21 ++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/drivers/iio/imu/inv_icm42607/inv_icm42607_core.c b/drivers/iio/imu/inv_icm42607/inv_icm42607_core.c
index 0da362967f63b..5384596dd8d79 100644
--- a/drivers/iio/imu/inv_icm42607/inv_icm42607_core.c
+++ b/drivers/iio/imu/inv_icm42607/inv_icm42607_core.c
@@ -667,19 +667,26 @@ static int inv_icm42607_suspend(struct device *dev)
static int inv_icm42607_resume(struct device *dev)
{
struct inv_icm42607_state *st = dev_get_drvdata(dev);
+ int resume_ret;
int ret;
ret = inv_icm42607_enable_vddio_reg(st);
- if (ret)
- return ret;
+ if (!ret) {
+ /* Sync the regcache again after regulator shutdown. */
+ regcache_mark_dirty(st->map);
+ ret = regcache_sync(st->map);
+ }
+
+ resume_ret = pm_runtime_force_resume(dev);
+ if (ret) {
+ if (resume_ret)
+ dev_warn(dev, "Failed to restore runtime PM state: %d\n",
+ resume_ret);
- /* Sync the regcache again after regulator shutdown. */
- regcache_mark_dirty(st->map);
- ret = regcache_sync(st->map);
- if (ret)
return ret;
+ }
- return pm_runtime_force_resume(dev);
+ return resume_ret;
}
static int inv_icm42607_runtime_suspend(struct device *dev)
--
2.25.1