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

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

regmap: Use async I/O during cache sync



Try to speed up I/O a little by not synchronising until we are finished
scheduling writes. A brief survey of existing users suggests we have none
that would currently benefit from an async cache sync.

Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 1a25f261
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -307,6 +307,8 @@ int regcache_sync(struct regmap *map)
	if (!map->cache_dirty)
		goto out;

	map->async = true;

	/* Apply any patch first */
	map->cache_bypass = 1;
	for (i = 0; i < map->patch_regs; i++) {
@@ -332,11 +334,15 @@ int regcache_sync(struct regmap *map)
		map->cache_dirty = false;

out:
	trace_regcache_sync(map->dev, name, "stop");
	/* Restore the bypass state */
	map->async = false;
	map->cache_bypass = bypass;
	map->unlock(map->lock_arg);

	regmap_async_complete(map);

	trace_regcache_sync(map->dev, name, "stop");

	return ret;
}
EXPORT_SYMBOL_GPL(regcache_sync);
@@ -375,17 +381,23 @@ int regcache_sync_region(struct regmap *map, unsigned int min,
	if (!map->cache_dirty)
		goto out;

	map->async = true;

	if (map->cache_ops->sync)
		ret = map->cache_ops->sync(map, min, max);
	else
		ret = regcache_default_sync(map, min, max);

out:
	trace_regcache_sync(map->dev, name, "stop region");
	/* Restore the bypass state */
	map->cache_bypass = bypass;
	map->async = false;
	map->unlock(map->lock_arg);

	regmap_async_complete(map);

	trace_regcache_sync(map->dev, name, "stop region");

	return ret;
}
EXPORT_SYMBOL_GPL(regcache_sync_region);