regmap: Bypassing cache when initializing cache
Laxman Dewangan [Fri, 17 Feb 2012 13:27:26 +0000 (18:27 +0530)]
During regcache_init, if client has not passed the
default data of cached register then it is directly
read from the hw to initialize cache. This hw register
read happens before cache ops are initialized and hence
avoiding register read to check for the data available
on cache or not by enabling flag of cache_bypass.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
(cherry picked from commit df00c79f78d8b0ad788daf689ea461ace9d0811f)

Change-Id: I4398162bd6b12689c795afe5ee02397e975e456c
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/87593

Rebase-Id: R33702f824bca2c8796f9bd3647cd25a5635628c6

drivers/base/regmap/regcache.c

index a10e81c..853dfff 100644 (file)
@@ -35,12 +35,17 @@ static int regcache_hw_init(struct regmap *map)
                return -EINVAL;
 
        if (!map->reg_defaults_raw) {
+               u32 cache_bypass = map->cache_bypass;
                dev_warn(map->dev, "No cache defaults, reading back from HW\n");
+
+               /* Bypass the cache access till data read from HW*/
+               map->cache_bypass = 1;
                tmp_buf = kmalloc(map->cache_size_raw, GFP_KERNEL);
                if (!tmp_buf)
                        return -EINVAL;
                ret = regmap_bulk_read(map, 0, tmp_buf,
                                       map->num_reg_defaults_raw);
+               map->cache_bypass = cache_bypass;
                if (ret < 0) {
                        kfree(tmp_buf);
                        return ret;