Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 954757d7 authored by Dimitris Papastamos's avatar Dimitris Papastamos Committed by Mark Brown
Browse files

regmap: Implement generic syncing functionality



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: default avatarDimitris Papastamos <dp@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent dfdc4448
Loading
Loading
Loading
Loading
+26 −7
Original line number Diff line number Diff line
@@ -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);

	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");
	if (map->cache_ops->sync) {
		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);