regmap: Factor out single value register syncing
authorMark Brown <broonie@kernel.org>
Thu, 30 Mar 2023 00:10:23 +0000 (01:10 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 3 Apr 2023 11:53:43 +0000 (12:53 +0100)
In order to support sparse caches that don't store data in raw format
factor out the parts of the raw block sync implementation that deal with
writing a single register via _regmap_write().

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20230325-regcache-maple-v3-1-23e271f93dc7@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/base/regmap/internal.h
drivers/base/regmap/regcache.c

index 10aca71..7b9ef43 100644 (file)
@@ -270,6 +270,7 @@ unsigned int regcache_get_val(struct regmap *map, const void *base,
 bool regcache_set_val(struct regmap *map, void *base, unsigned int idx,
                      unsigned int val);
 int regcache_lookup_reg(struct regmap *map, unsigned int reg);
+int regcache_sync_val(struct regmap *map, unsigned int reg, unsigned int val);
 
 int _regmap_raw_write(struct regmap *map, unsigned int reg,
                      const void *val, size_t val_len, bool noinc);
index 3f19f68..a5f11bc 100644 (file)
@@ -677,6 +677,30 @@ static bool regcache_reg_present(unsigned long *cache_present, unsigned int idx)
        return test_bit(idx, cache_present);
 }
 
+int regcache_sync_val(struct regmap *map, unsigned int reg, unsigned int val)
+{
+       int ret;
+
+       if (!regcache_reg_needs_sync(map, reg, val))
+               return 0;
+
+       map->cache_bypass = true;
+
+       ret = _regmap_write(map, reg, val);
+
+       map->cache_bypass = false;
+
+       if (ret != 0) {
+               dev_err(map->dev, "Unable to sync register %#x. %d\n",
+                       reg, ret);
+               return ret;
+       }
+       dev_dbg(map->dev, "Synced register %#x, value %#x\n",
+               reg, val);
+
+       return 0;
+}
+
 static int regcache_sync_block_single(struct regmap *map, void *block,
                                      unsigned long *cache_present,
                                      unsigned int block_base,
@@ -693,21 +717,9 @@ static int regcache_sync_block_single(struct regmap *map, void *block,
                        continue;
 
                val = regcache_get_val(map, block, i);
-               if (!regcache_reg_needs_sync(map, regtmp, val))
-                       continue;
-
-               map->cache_bypass = true;
-
-               ret = _regmap_write(map, regtmp, val);
-
-               map->cache_bypass = false;
-               if (ret != 0) {
-                       dev_err(map->dev, "Unable to sync register %#x. %d\n",
-                               regtmp, ret);
+               ret = regcache_sync_val(map, regtmp, val);
+               if (ret != 0)
                        return ret;
-               }
-               dev_dbg(map->dev, "Synced register %#x, value %#x\n",
-                       regtmp, val);
        }
 
        return 0;