mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v2 00/10] regmap: clean up and improve __regmap_init()
@ 2026-11-13 15:31 Peng Fan
  2026-11-13 15:31 ` [PATCH v2 01/10] regmap: fix reinit cache failure handling Peng Fan
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Peng Fan @ 2026-11-13 15:31 UTC (permalink / raw)
  To: Mark Brown, Greg Kroah-Hartman, Rafael J. Wysocki,
	Danilo Krummrich, Johan Hovold, Lucas Tanure
  Cc: linux-kernel, driver-core, Peng Fan, Sashiko

This series includes three fixes for pre-existing regmap issues noticed
during review, improves the __regmap_init() error handling and removes the
last user of regmap_bus::free_on_exit. Patches 1-3 are fixes suitable for stable;
patches 4-9 are cleanups with no functional change intended; patch 10 adds
KUnit coverage for the new bus callback.

Patch 1 fixes the cache reinitialisation failure paths. regcache_exit()
freed reg_defaults_raw without clearing cache_free, and a failed
regmap_reinit_cache() left map->cache_type set, so a later regmap_exit()
could free the raw defaults a second time. It also drops the old cache_ops
after tearing down the cache, so a successful reinitialisation to
REGCACHE_NONE cannot leave stale cache ops behind. Clear the ownership
state and leave the map without a cache if reinitialisation fails.

Patch 2 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 3 fixes the raw write limit calculation when the adapter's
max_write_len quirk is applied. It compares the bus limit against the
quirk payload size rather than the whole-message size, avoids the
underflow when the register address alone exceeds the quirk limit, and
keeps the existing limit when the quirk cannot fit a single value, which
would otherwise lead to a division by zero in the raw write chunking.
The same minimum-size guard is applied to the read quirk.

Patches 4-7 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 8 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 9 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 10 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.
- checkpatch.pl clean for all patches.
- regmap KUnit suite pass.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
Changes in v2:
- Rebased onto next-20261112.
- New patch 1: regmap: fix reinit cache failure handling
- Patch 3: regmap-i2c: fix write limit clamping for adapter quirks
  Correct fixes tag
  Rename the patch subject.
  Fix write limit clamping.
- Patch 5: regmap: factor out regmap_set_lock():
  Move ret = -EINVAL below the successful regmap_set_lock() call so it
  cannot be clobbered with 0 on success.

---
Peng Fan (10):
      regmap: fix reinit cache failure handling
      regmap-i2c: keep bus raw write limit when applying read quirk
      regmap-i2c: fix write limit clamping for adapter quirks
      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/regcache.c     |   8 +-
 drivers/base/regmap/regmap-i2c.c   |  68 ++--
 drivers/base/regmap/regmap-kunit.c |  89 +++++
 drivers/base/regmap/regmap-spi.c   |  64 ++--
 drivers/base/regmap/regmap.c       | 714 +++++++++++++++++++------------------
 include/linux/regmap.h             |   7 +-
 6 files changed, 541 insertions(+), 409 deletions(-)
---
base-commit: 6d582d78fad9d828e575ca0cdcff8ea47a77220b
change-id: 20261109-regmap-improve-915eee5a80ec

Best regards,
-- 
Peng Fan <peng.fan@nxp.com>


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2026-11-13 15:32 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-13 15:31 [PATCH v2 00/10] regmap: clean up and improve __regmap_init() Peng Fan
2026-11-13 15:31 ` [PATCH v2 01/10] regmap: fix reinit cache failure handling Peng Fan
2026-11-13 15:31 ` [PATCH v2 02/10] regmap-i2c: keep bus raw write limit when applying read quirk Peng Fan
2026-11-13 15:31 ` [PATCH v2 03/10] regmap-i2c: fix write limit clamping for adapter quirks Peng Fan
2026-11-13 15:31 ` [PATCH v2 04/10] regmap: deduplicate fast_io checks Peng Fan
2026-11-13 15:31 ` [PATCH v2 05/10] regmap: factor out regmap_set_lock() Peng Fan
2026-11-13 15:31 ` [PATCH v2 06/10] regmap: factor out regmap_init_ranges() Peng Fan
2026-11-13 15:31 ` [PATCH v2 07/10] regmap: factor out format initialisation into helpers Peng Fan
2026-11-13 15:31 ` [PATCH v2 08/10] regmap: drop regmap_bus::free_on_exit Peng Fan
2026-11-13 15:31 ` [PATCH v2 09/10] regmap: use cleanup API in __regmap_init() Peng Fan
2026-11-13 15:31 ` [PATCH v2 10/10] regmap: kunit: add test for regmap_bus::init_limits Peng Fan

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®