diff options
-rw-r--r-- | drivers/base/regmap/regcache-rbtree.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c index 792a760c8ab1..382a6deb3ca8 100644 --- a/drivers/base/regmap/regcache-rbtree.c +++ b/drivers/base/regmap/regcache-rbtree.c @@ -55,6 +55,12 @@ static unsigned int regcache_rbtree_get_register(struct regmap *map, return regcache_get_val(map, rbnode->block, idx); } +static const void *regcache_rbtree_get_reg_addr(struct regmap *map, + struct regcache_rbtree_node *rbnode, unsigned int idx) +{ + return regcache_get_val_addr(map, rbnode->block, idx); +} + static void regcache_rbtree_set_register(struct regmap *map, struct regcache_rbtree_node *rbnode, unsigned int idx, unsigned int val) @@ -442,6 +448,7 @@ static int regcache_rbtree_sync(struct regmap *map, unsigned int min, struct regcache_rbtree_node *rbnode; unsigned int regtmp; unsigned int val; + const void *addr; int ret; int i, base, end; @@ -480,7 +487,17 @@ static int regcache_rbtree_sync(struct regmap *map, unsigned int min, continue; map->cache_bypass = 1; - ret = _regmap_write(map, regtmp, val); + + if (regmap_can_raw_write(map)) { + addr = regcache_rbtree_get_reg_addr(map, + rbnode, i); + ret = _regmap_raw_write(map, regtmp, addr, + map->format.val_bytes, + false); + } else { + ret = _regmap_write(map, regtmp, val); + } + map->cache_bypass = 0; if (ret) return ret; |