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

Commit cfdeb8c3 authored by Mark Brown's avatar Mark Brown
Browse files

regmap: cache: Split raw and non-raw syncs



For code clarity after implementing block writes split out the raw and
non-raw I/O sync implementations.

Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Reviewed-by: default avatarDimitris Papastamos <dp@opensource.wolfsonmicro.com>
parent f8bd822c
Loading
Loading
Loading
Loading
+53 −11
Original line number Diff line number Diff line
@@ -545,7 +545,41 @@ int regcache_lookup_reg(struct regmap *map, unsigned int reg)
		return -ENOENT;
}

int regcache_sync_block(struct regmap *map, void *block,
static int regcache_sync_block_single(struct regmap *map, void *block,
				      unsigned int block_base,
				      unsigned int start, unsigned int end)
{
	unsigned int i, regtmp, val;
	int ret;

	for (i = start; i < end; i++) {
		regtmp = block_base + (i * map->reg_stride);

		if (!regcache_reg_present(map, regtmp))
			continue;

		val = regcache_get_val(map, block, i);

		/* Is this the hardware default?  If so skip. */
		ret = regcache_lookup_reg(map, regtmp);
		if (ret >= 0 && val == map->reg_defaults[ret].def)
			continue;

		map->cache_bypass = 1;

		ret = _regmap_write(map, regtmp, val);

		map->cache_bypass = 0;
		if (ret != 0)
			return ret;
		dev_dbg(map->dev, "Synced register %#x, value %#x\n",
			regtmp, val);
	}

	return 0;
}

int regcache_sync_block_raw(struct regmap *map, void *block,
			    unsigned int block_base, unsigned int start,
			    unsigned int end)
{
@@ -568,14 +602,10 @@ int regcache_sync_block(struct regmap *map, void *block,

		map->cache_bypass = 1;

		if (regmap_can_raw_write(map)) {
		addr = regcache_get_val_addr(map, block, i);
		ret = _regmap_raw_write(map, regtmp, addr,
					map->format.val_bytes,
					false);
		} else {
			ret = _regmap_write(map, regtmp, val);
		}

		map->cache_bypass = 0;
		if (ret != 0)
@@ -586,3 +616,15 @@ int regcache_sync_block(struct regmap *map, void *block,

	return 0;
}

int regcache_sync_block(struct regmap *map, void *block,
			unsigned int block_base, unsigned int start,
			unsigned int end)
{
	if (regmap_can_raw_write(map))
		return regcache_sync_block_raw(map, block, block_base,
					       start, end);
	else
		return regcache_sync_block_single(map, block, block_base,
						  start, end);
}