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: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
1a25f26138
commit
affbe886e7
|
@ -307,6 +307,8 @@ int regcache_sync(struct regmap *map)
|
||||||
if (!map->cache_dirty)
|
if (!map->cache_dirty)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
map->async = true;
|
||||||
|
|
||||||
/* Apply any patch first */
|
/* Apply any patch first */
|
||||||
map->cache_bypass = 1;
|
map->cache_bypass = 1;
|
||||||
for (i = 0; i < map->patch_regs; i++) {
|
for (i = 0; i < map->patch_regs; i++) {
|
||||||
|
@ -332,11 +334,15 @@ int regcache_sync(struct regmap *map)
|
||||||
map->cache_dirty = false;
|
map->cache_dirty = false;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
trace_regcache_sync(map->dev, name, "stop");
|
|
||||||
/* Restore the bypass state */
|
/* Restore the bypass state */
|
||||||
|
map->async = false;
|
||||||
map->cache_bypass = bypass;
|
map->cache_bypass = bypass;
|
||||||
map->unlock(map->lock_arg);
|
map->unlock(map->lock_arg);
|
||||||
|
|
||||||
|
regmap_async_complete(map);
|
||||||
|
|
||||||
|
trace_regcache_sync(map->dev, name, "stop");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(regcache_sync);
|
EXPORT_SYMBOL_GPL(regcache_sync);
|
||||||
|
@ -375,17 +381,23 @@ int regcache_sync_region(struct regmap *map, unsigned int min,
|
||||||
if (!map->cache_dirty)
|
if (!map->cache_dirty)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
map->async = true;
|
||||||
|
|
||||||
if (map->cache_ops->sync)
|
if (map->cache_ops->sync)
|
||||||
ret = map->cache_ops->sync(map, min, max);
|
ret = map->cache_ops->sync(map, min, max);
|
||||||
else
|
else
|
||||||
ret = regcache_default_sync(map, min, max);
|
ret = regcache_default_sync(map, min, max);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
trace_regcache_sync(map->dev, name, "stop region");
|
|
||||||
/* Restore the bypass state */
|
/* Restore the bypass state */
|
||||||
map->cache_bypass = bypass;
|
map->cache_bypass = bypass;
|
||||||
|
map->async = false;
|
||||||
map->unlock(map->lock_arg);
|
map->unlock(map->lock_arg);
|
||||||
|
|
||||||
|
regmap_async_complete(map);
|
||||||
|
|
||||||
|
trace_regcache_sync(map->dev, name, "stop region");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(regcache_sync_region);
|
EXPORT_SYMBOL_GPL(regcache_sync_region);
|
||||||
|
|
Loading…
Reference in a new issue