diff options
| author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2026-02-10 17:09:09 +0100 |
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2026-02-22 23:54:25 +0000 |
| commit | c2bcf62ca75c541ec4297e6ff02a68ddc2e02029 (patch) | |
| tree | 1b4b15a2b5d2deb87b76f5a762736a4c7d713323 /drivers/base/regmap | |
| parent | 1fcf171178f021ef2005d47e281544624b93c5a5 (diff) | |
regcache: Split regcache_count_cacheable_registers() helper
The introduced helper allows to check for the non-cacheable configurations
earlier during initialisation.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://patch.msgid.link/20260210161058.53093-3-andriy.shevchenko@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/base/regmap')
| -rw-r--r-- | drivers/base/regmap/regcache.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c index d41cdb39c78f..73cfe8120669 100644 --- a/drivers/base/regmap/regcache.c +++ b/drivers/base/regmap/regcache.c @@ -42,13 +42,10 @@ void regcache_sort_defaults(struct reg_default *defaults, unsigned int ndefaults } EXPORT_SYMBOL_GPL(regcache_sort_defaults); -static int regcache_hw_init(struct regmap *map) +static int regcache_count_cacheable_registers(struct regmap *map) { - int i, j; - int ret; int count; - unsigned int reg, val; - void *tmp_buf; + int i; /* calculate the size of reg_defaults */ for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) @@ -57,10 +54,18 @@ static int regcache_hw_init(struct regmap *map) count++; /* all registers are unreadable or volatile, so just bypass */ - if (!count) { + if (!count) map->cache_bypass = true; - return 0; - } + + return count; +} + +static int regcache_hw_init(struct regmap *map, int count) +{ + int i, j; + int ret; + unsigned int reg, val; + void *tmp_buf; map->num_reg_defaults = count; map->reg_defaults = kmalloc_objs(struct reg_default, count); @@ -129,6 +134,7 @@ err_free: int regcache_init(struct regmap *map, const struct regmap_config *config) { + int count = 0; int ret; int i; void *tmp_buf; @@ -193,15 +199,17 @@ int regcache_init(struct regmap *map, const struct regmap_config *config) return -ENOMEM; map->reg_defaults = tmp_buf; } else if (map->num_reg_defaults_raw) { + count = regcache_count_cacheable_registers(map); + if (map->cache_bypass) + return 0; + /* Some devices such as PMICs don't have cache defaults, * we cope with this by reading back the HW registers and * crafting the cache defaults by hand. */ - ret = regcache_hw_init(map); + ret = regcache_hw_init(map, count); if (ret < 0) return ret; - if (map->cache_bypass) - return 0; } if (!map->max_register_is_set && map->num_reg_defaults_raw) { |
