[PATCH 0/9] regmap: clean up and improve __regmap_init()
From: Peng Fan (OSS)
Date: Tue Nov 10 2026 - 03:40:44 EST
This patchset improves the __regmap_init() error handling and removes the
regmap_bus::free_on_exit. Patches 1-2 fix I2C adapter quirk handling;
patches 3-8 are cleanups with no functional change; patch 9 adds KUnit
coverage for the new bus callback.
Patch 1 fixes regmap_get_i2c_bus() so that applying an adapter read quirk
no longer drops the raw write limit advertised by the selected bus (and
vice versa). It currently starts from zero-initialised locals and
overwrites both limits of the bus copy.
Patch 2 avoids an underflow when the adapter's max_write_len quirk is not
larger than the register address size. In that case the maximum raw
payload size cannot be represented and no raw write can succeed, so the
existing limit is kept instead of being replaced with a bogus value.
Patches 3-6 are mechanical: evaluate fast_io once, and factor out
regmap_set_lock(), regmap_init_ranges() and the format selection into
helpers. The forward goto and the label-based unwinding are reduced to a
single error path.
Patch 7 drops regmap_bus::free_on_exit. Instead of kmemdup()ing the
static I2C/SPI bus to store per-device raw I/O limits, add an optional
regmap_bus::init_limits() callback. __regmap_init() invokes it before
regcache_init(), which is required because regcache_hw_init() may read
raw register defaults from the device during initialization and must
already see the effective max_raw_read limit. The static bus structures
can then be used directly and the per-device allocations disappear.
Patch 8 converts the error unwinding to the cleanup API and drops all
err_* labels. map->cache_type is now assigned just before
regcache_init() and reset to REGCACHE_NONE on failure, so the release
helper can safely call regcache_exit() on a partially initialised map.
Patch 9 adds a KUnit test which verifies that init_limits() is invoked
before regcache_init() by checking that the raw default readback is split
according to the limit installed by the callback.
Testing:
- Built drivers/base/regmap/ with W=1 on x86_64.
- regmap KUnit suite: tests pass under UML.
Signed-off-by: Peng Fan <peng.fan@xxxxxxx>
---
Peng Fan (9):
regmap-i2c: keep bus raw write limit when applying read quirk
regmap-i2c: avoid underflow when applying write length quirk
regmap: deduplicate fast_io checks
regmap: factor out regmap_set_lock()
regmap: factor out regmap_init_ranges()
regmap: factor out format initialisation into helpers
regmap: drop regmap_bus::free_on_exit
regmap: use cleanup API in __regmap_init()
regmap: kunit: add test for regmap_bus::init_limits
drivers/base/regmap/regmap-i2c.c | 62 ++--
drivers/base/regmap/regmap-kunit.c | 89 +++++
drivers/base/regmap/regmap-spi.c | 64 ++--
drivers/base/regmap/regmap.c | 700 +++++++++++++++++++------------------
include/linux/regmap.h | 7 +-
5 files changed, 520 insertions(+), 402 deletions(-)
---
base-commit: f652a40d7240c9df35755316569afd12d7a85c57
change-id: 20261109-regmap-improve-915eee5a80ec
Best regards,
--
Peng Fan <peng.fan@xxxxxxx>