* [PATCH 0/2] iio: magnetometer: fix the register restore on resume in mmc35240 and mmc5633
@ 2026-10-11 5:19 Shashank Mohan Jain
2026-10-11 5:19 ` [PATCH 1/2] iio: magnetometer: mmc35240: leave cache-only mode before the cache sync Shashank Mohan Jain
2026-10-11 5:19 ` [PATCH 2/2] iio: magnetometer: mmc5633: " Shashank Mohan Jain
0 siblings, 2 replies; 3+ messages in thread
From: Shashank Mohan Jain @ 2026-10-11 5:19 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, Mark Brown, bui duc phuc, Frank Li, linux-iio,
linux-kernel
The resume callbacks of mmc35240 and mmc5633 call
regcache_sync_region() before they take the regmap out of cache-only
mode. Since v7.3-rc1 regmap refuses a sync in cache-only mode with a
WARN and -EINVAL (86fc3483a4d6 and afc8e3ee8307), so both drivers now
warn on every resume and no longer restore their control registers.
The kernel-doc added by 86fc3483a4d6 says that the caller has to
disable cache-only mode before the sync, so the two patches change the
order in the drivers.
The Fixes tags name the regcache commit, because that is where the
behaviour changed: the drivers have used this order since their resume
callbacks were added, and it worked until v7.2. Please tell me if you
would rather have the driver commits there.
I have no hardware for either chip. The patches were tested in qemu
with the drivers bound to an i2c-stub device and a suspend/resume
cycle through /sys/power/pm_test; the details are in the changelogs.
A scan of drivers/ and sound/ for other resume paths which sync before
leaving cache-only mode in the same function found only these two.
Based on mainline (a5ebb76233b7, v7.3-rc6+); the patches also apply
to next-20261009.
Shashank Mohan Jain (2):
iio: magnetometer: mmc35240: leave cache-only mode before the cache
sync
iio: magnetometer: mmc5633: leave cache-only mode before the cache
sync
drivers/iio/magnetometer/mmc35240.c | 3 +--
drivers/iio/magnetometer/mmc5633.c | 3 +--
2 files changed, 2 insertions(+), 4 deletions(-)
base-commit: a5ebb76233b79db01e82e061173cb73c6d2b5c6b
--
2.43.0
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH 1/2] iio: magnetometer: mmc35240: leave cache-only mode before the cache sync
2026-10-11 5:19 [PATCH 0/2] iio: magnetometer: fix the register restore on resume in mmc35240 and mmc5633 Shashank Mohan Jain
@ 2026-10-11 5:19 ` Shashank Mohan Jain
2026-10-11 5:19 ` [PATCH 2/2] iio: magnetometer: mmc5633: " Shashank Mohan Jain
1 sibling, 0 replies; 3+ messages in thread
From: Shashank Mohan Jain @ 2026-10-11 5:19 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, Mark Brown, bui duc phuc, Frank Li, linux-iio,
linux-kernel
mmc35240_resume() marks the register cache dirty and calls
regcache_sync_region() while the regmap is still in cache-only mode.
It calls regcache_cache_only(false) only after the sync.
Since commit afc8e3ee8307 ("regcache: Validate cache_only state in
regcache_sync_region()") a sync in cache-only mode is refused with a
WARN and -EINVAL. Every resume now gives
WARNING: drivers/base/regmap/regcache.c:536 at regcache_sync_region+0x1a4/0x1c0
...
mmc35240_resume+0x30/0x70
dpm_run_callback+0x7d/0x1c0
device_resume+0x175/0x270
...
mmc35240 1-0030: Failed to restore control registers
and the control registers are not written. If the chip lost its state
during suspend, it runs with the reset value of CTRL1 while the cache,
and with it the sampling frequency attribute, still has the configured
value. Writing the same frequency again does not repair this, because
regmap_update_bits() finds no difference to the cache.
Leave cache-only mode first, then mark the cache dirty and sync it.
Reproduced in qemu with the driver bound to an i2c-stub device: set
in_magn_sampling_frequency to 25 (CTRL1 = 0x02), clear CTRL0 and CTRL1
of the stub behind the driver's back to emulate the power loss, and run
a suspend/resume cycle with "devices" in /sys/power/pm_test. Without
this change CTRL1 is still 0x00 after resume and the warning is
printed. With it, and also with the regcache commit reverted, CTRL1 is
0x02 again and there is no warning. Not tested on real hardware.
Fixes: afc8e3ee8307 ("regcache: Validate cache_only state in regcache_sync_region()")
Assisted-by: LLM
Signed-off-by: Shashank Mohan Jain <jain.sm@gmail.com>
---
Prepared with Claude Code (Anthropic), model Claude Opus 5.5
(claude-opus-5-5).
drivers/iio/magnetometer/mmc35240.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/iio/magnetometer/mmc35240.c b/drivers/iio/magnetometer/mmc35240.c
index 6f40cba4b1..7f028d7f1f 100644
--- a/drivers/iio/magnetometer/mmc35240.c
+++ b/drivers/iio/magnetometer/mmc35240.c
@@ -532,14 +532,13 @@ static int mmc35240_resume(struct device *dev)
struct mmc35240_data *data = iio_priv(indio_dev);
int ret;
+ regcache_cache_only(data->regmap, false);
regcache_mark_dirty(data->regmap);
ret = regcache_sync_region(data->regmap, MMC35240_REG_CTRL0,
MMC35240_REG_CTRL1);
if (ret < 0)
dev_err(dev, "Failed to restore control registers\n");
- regcache_cache_only(data->regmap, false);
-
return 0;
}
--
2.43.0
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH 2/2] iio: magnetometer: mmc5633: leave cache-only mode before the cache sync
2026-10-11 5:19 [PATCH 0/2] iio: magnetometer: fix the register restore on resume in mmc35240 and mmc5633 Shashank Mohan Jain
2026-10-11 5:19 ` [PATCH 1/2] iio: magnetometer: mmc35240: leave cache-only mode before the cache sync Shashank Mohan Jain
@ 2026-10-11 5:19 ` Shashank Mohan Jain
1 sibling, 0 replies; 3+ messages in thread
From: Shashank Mohan Jain @ 2026-10-11 5:19 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, Mark Brown, bui duc phuc, Frank Li, linux-iio,
linux-kernel
mmc5633_resume() marks the register cache dirty and calls
regcache_sync_region() while the regmap is still in cache-only mode.
It calls regcache_cache_only(false) only after the sync.
Since commit afc8e3ee8307 ("regcache: Validate cache_only state in
regcache_sync_region()") a sync in cache-only mode is refused with a
WARN and -EINVAL. Every resume now gives
WARNING: drivers/base/regmap/regcache.c:536 at regcache_sync_region+0x1a4/0x1c0
...
mmc5633_resume+0x2d/0x70
dpm_run_callback+0x7d/0x1c0
device_resume+0x175/0x270
...
mmc5633_i2c 1-0030: Failed to restore control registers
and the control registers are not written. If the chip lost its state
during suspend, it runs with the reset value of CTRL1 while the cache,
and with it the sampling frequency attribute, still has the configured
value. Writing the same frequency again does not repair this, because
regmap_update_bits() finds no difference to the cache.
Leave cache-only mode first, then mark the cache dirty and sync it.
Reproduced in qemu with the I2C driver bound to an i2c-stub device: set
in_magn_sampling_frequency to 3.5 (CTRL1 = 0x02), clear CTRL0 and CTRL1
of the stub behind the driver's back to emulate the power loss, and run
a suspend/resume cycle with "devices" in /sys/power/pm_test. Without
this change CTRL1 is still 0x00 after resume and the warning is
printed. With it, and also with the regcache commit reverted, CTRL1 is
0x02 again and there is no warning. Not tested on real hardware.
Fixes: afc8e3ee8307 ("regcache: Validate cache_only state in regcache_sync_region()")
Assisted-by: LLM
Signed-off-by: Shashank Mohan Jain <jain.sm@gmail.com>
---
Prepared with Claude Code (Anthropic), model Claude Opus 5.5
(claude-opus-5-5).
drivers/iio/magnetometer/mmc5633.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/iio/magnetometer/mmc5633.c b/drivers/iio/magnetometer/mmc5633.c
index f4dae7ba13..b651f01e1b 100644
--- a/drivers/iio/magnetometer/mmc5633.c
+++ b/drivers/iio/magnetometer/mmc5633.c
@@ -499,13 +499,12 @@ static int mmc5633_resume(struct device *dev)
struct regmap *regmap = dev_get_regmap(dev, NULL);
int ret;
+ regcache_cache_only(regmap, false);
regcache_mark_dirty(regmap);
ret = regcache_sync_region(regmap, MMC5633_REG_CTRL0, MMC5633_REG_CTRL1);
if (ret)
dev_err(dev, "Failed to restore control registers\n");
- regcache_cache_only(regmap, false);
-
return 0;
}
--
2.43.0
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-11 5:19 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-11 5:19 [PATCH 0/2] iio: magnetometer: fix the register restore on resume in mmc35240 and mmc5633 Shashank Mohan Jain
2026-10-11 5:19 ` [PATCH 1/2] iio: magnetometer: mmc35240: leave cache-only mode before the cache sync Shashank Mohan Jain
2026-10-11 5:19 ` [PATCH 2/2] iio: magnetometer: mmc5633: " Shashank Mohan Jain
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®