regmap: Implement generic syncing functionality
authorDimitris Papastamos <dp@opensource.wolfsonmicro.com>
Tue, 27 Sep 2011 10:25:06 +0000 (11:25 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 27 Sep 2011 19:06:38 +0000 (20:06 +0100)
In the absence of a sync callback, do it manually.  This of course
can't take advantange of the specific optimizations of each
cache type but it will do well enough in most cases.

Signed-off-by: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
drivers/base/regmap/regcache.c

index e2b172b93dba172f15e225c945021916b7183bfb..6b9efd938dcacc95846101582d2d0d0cf0052d2d 100644 (file)
@@ -223,20 +223,39 @@ EXPORT_SYMBOL_GPL(regcache_write);
  */
 int regcache_sync(struct regmap *map)
 {
-       int ret;
+       int ret = 0;
+       unsigned int val;
+       unsigned int i;
        const char *name;
 
        BUG_ON(!map->cache_ops);
 
+       dev_dbg(map->dev, "Syncing %s cache\n",
+               map->cache_ops->name);
+       name = map->cache_ops->name;
+       trace_regcache_sync(map->dev, name, "start");
        if (map->cache_ops->sync) {
-               dev_dbg(map->dev, "Syncing %s cache\n",
-                       map->cache_ops->name);
-               name = map->cache_ops->name;
-               trace_regcache_sync(map->dev, name, "start");
                ret = map->cache_ops->sync(map);
-               trace_regcache_sync(map->dev, name, "stop");
+       } else {
+               for (i = 0; i < map->num_reg_defaults; i++) {
+                       ret = regcache_read(map, i, &val);
+                       if (ret < 0)
+                               goto out;
+                       regcache_cache_bypass(map, true);
+                       ret = regcache_write(map, i, val);
+                       regcache_cache_bypass(map, false);
+                       if (ret < 0)
+                               goto out;
+                       dev_dbg(map->dev, "Synced register %#x, value %#x\n",
+                               map->reg_defaults[i].reg,
+                               map->reg_defaults[i].def);
+               }
+
        }
-       return 0;
+out:
+       trace_regcache_sync(map->dev, name, "stop");
+
+       return ret;
 }
 EXPORT_SYMBOL_GPL(regcache_sync);