Make sure that cache is initialised before calling any IO
using regmap, this makes sure that we won't access NULL or
invalid pointers in the cache which hasn't been initialised.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/base/regmap/regcache.c | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c
index 0a78ab0dc9fb..3101f19e411b 100644
--- a/drivers/base/regmap/regcache.c
+++ b/drivers/base/regmap/regcache.c
@@ -203,14 +203,6 @@ int regcache_init(struct regmap *map, const struct regmap_config *config)
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, count);
- if (ret < 0)
- return ret;
}
if (!map->max_register_is_set && map->num_reg_defaults_raw) {
@@ -228,6 +220,17 @@ int regcache_init(struct regmap *map, const struct regmap_config *config)
goto err_free;
}
+ if (count) {
+ /*
+ * 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, count);
+ if (ret < 0)
+ goto err_exit;
+ }
+
if (map->num_reg_defaults && map->cache_ops->populate) {
dev_dbg(map->dev, "Populating %s cache\n", map->cache_ops->name);
map->lock(map->lock_arg);
--
2.50.1