From 137b833457864091610ca01d7443a67028a2b3ce Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 26 Mar 2013 21:26:19 +0000 Subject: [PATCH] regmap: cache: Use raw I/O to sync rbtrees if we can This will bring no meaningful benefit by itself, it is done as a separate commit to aid bisection if there are problems with the following commits adding support for coalescing adjacent writes. Signed-off-by: Mark Brown --- drivers/base/regmap/regcache-rbtree.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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; -- 2.30.2