Merge remote-tracking branch 'regmap/fix/cache' into regmap-linus
authorMark Brown <broonie@kernel.org>
Sat, 3 Sep 2016 11:10:08 +0000 (12:10 +0100)
committerMark Brown <broonie@kernel.org>
Sat, 3 Sep 2016 11:10:08 +0000 (12:10 +0100)
drivers/base/regmap/regcache.c
drivers/base/regmap/regmap.c

index df7ff72908216f5d7a97f03af3f06ae4fd5adefd..4e582561e1e7a0cdffeaf8b3901d3a56d66a37ad 100644 (file)
@@ -38,10 +38,11 @@ static int regcache_hw_init(struct regmap *map)
 
        /* calculate the size of reg_defaults */
        for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++)
-               if (!regmap_volatile(map, i * map->reg_stride))
+               if (regmap_readable(map, i * map->reg_stride) &&
+                   !regmap_volatile(map, i * map->reg_stride))
                        count++;
 
-       /* all registers are volatile, so just bypass */
+       /* all registers are unreadable or volatile, so just bypass */
        if (!count) {
                map->cache_bypass = true;
                return 0;
index 51fa7d66a393bf5bee6818c1432211dfd76582ce..25d26bb18970694d808a3d679e613a5487fa8236 100644 (file)
@@ -1474,6 +1474,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
                ret = map->bus->write(map->bus_context, buf, len);
 
                kfree(buf);
+       } else if (ret != 0 && !map->cache_bypass && map->format.parse_val) {
+               regcache_drop_region(map, reg, reg + 1);
        }
 
        trace_regmap_hw_write_done(map, reg, val_len / map->format.val_bytes);
This page took 0.027195 seconds and 5 git commands to generate.