]> git.karo-electronics.de Git - linux-beck.git/commitdiff
regmap: Use async I/O during cache sync
authorMark Brown <broonie@linaro.org>
Thu, 10 Oct 2013 20:06:32 +0000 (21:06 +0100)
committerMark Brown <broonie@linaro.org>
Thu, 10 Oct 2013 20:15:23 +0000 (21:15 +0100)
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>
drivers/base/regmap/regcache.c

index a36112af494ce34464d989e8037fa96e1a2a2c98..d4dd77134814bac1a8ba2bc91a817c1cc2002454 100644 (file)
@@ -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);