From 3405addd220a0cf2e3a8ffb9051afe766e5f52e8 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Tue, 27 Sep 2011 20:15:38 +0200 Subject: regmap: rbtree-cache: Move cached rbnode handling into lookup function Move the handling of the cached rbnode into regcache_rbtree_lookup. This allows us to remove of some duplicated code sections in regcache_rbtree_read and regcache_rbtree_write. Signed-off-by: Lars-Peter Clausen Acked-by: Dimitris Papastamos Signed-off-by: Mark Brown --- drivers/base/regmap/regcache-rbtree.c | 61 +++++++++++------------------------ 1 file changed, 18 insertions(+), 43 deletions(-) (limited to 'drivers/base') diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c index 52669dec73b..de32ced1917 100644 --- a/drivers/base/regmap/regcache-rbtree.c +++ b/drivers/base/regmap/regcache-rbtree.c @@ -56,23 +56,33 @@ static void regcache_rbtree_set_register(struct regcache_rbtree_node *rbnode, regcache_set_val(rbnode->block, idx, val, word_size); } -static struct regcache_rbtree_node *regcache_rbtree_lookup( - struct rb_root *root, unsigned int reg) +static struct regcache_rbtree_node *regcache_rbtree_lookup(struct regmap *map, + unsigned int reg) { + struct regcache_rbtree_ctx *rbtree_ctx = map->cache; struct rb_node *node; struct regcache_rbtree_node *rbnode; unsigned int base_reg, top_reg; - node = root->rb_node; + rbnode = rbtree_ctx->cached_rbnode; + if (rbnode) { + regcache_rbtree_get_base_top_reg(rbnode, &base_reg, &top_reg); + if (reg >= base_reg && reg <= top_reg) + return rbnode; + } + + node = rbtree_ctx->root.rb_node; while (node) { rbnode = container_of(node, struct regcache_rbtree_node, node); regcache_rbtree_get_base_top_reg(rbnode, &base_reg, &top_reg); - if (reg >= base_reg && reg <= top_reg) + if (reg >= base_reg && reg <= top_reg) { + rbtree_ctx->cached_rbnode = rbnode; return rbnode; - else if (reg > top_reg) + } else if (reg > top_reg) { node = node->rb_right; - else if (reg < base_reg) + } else if (reg < base_reg) { node = node->rb_left; + } } return NULL; @@ -174,32 +184,14 @@ static int regcache_rbtree_exit(struct regmap *map) static int regcache_rbtree_read(struct regmap *map, unsigned int reg, unsigned int *value) { - struct regcache_rbtree_ctx *rbtree_ctx; struct regcache_rbtree_node *rbnode; - unsigned int base_reg, top_reg; unsigned int reg_tmp; - rbtree_ctx = map->cache; - /* look up the required register in the cached rbnode */ - rbnode = rbtree_ctx->cached_rbnode; - if (rbnode) { - regcache_rbtree_get_base_top_reg(rbnode, &base_reg, &top_reg); - if (reg >= base_reg && reg <= top_reg) { - reg_tmp = reg - base_reg; - *value = regcache_rbtree_get_register(rbnode, reg_tmp, - map->cache_word_size); - return 0; - } - } - /* if we can't locate it in the cached rbnode we'll have - * to traverse the rbtree looking for it. - */ - rbnode = regcache_rbtree_lookup(&rbtree_ctx->root, reg); + rbnode = regcache_rbtree_lookup(map, reg); if (rbnode) { reg_tmp = reg - rbnode->base_reg; *value = regcache_rbtree_get_register(rbnode, reg_tmp, map->cache_word_size); - rbtree_ctx->cached_rbnode = rbnode; } else { /* uninitialized registers default to 0 */ *value = 0; @@ -243,31 +235,15 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, struct rb_node *node; unsigned int val; unsigned int reg_tmp; - unsigned int base_reg, top_reg; unsigned int pos; int i; int ret; rbtree_ctx = map->cache; - /* look up the required register in the cached rbnode */ - rbnode = rbtree_ctx->cached_rbnode; - if (rbnode) { - regcache_rbtree_get_base_top_reg(rbnode, &base_reg, &top_reg); - if (reg >= base_reg && reg <= top_reg) { - reg_tmp = reg - base_reg; - val = regcache_rbtree_get_register(rbnode, reg_tmp, - map->cache_word_size); - if (val == value) - return 0; - regcache_rbtree_set_register(rbnode, reg_tmp, value, - map->cache_word_size); - return 0; - } - } /* if we can't locate it in the cached rbnode we'll have * to traverse the rbtree looking for it. */ - rbnode = regcache_rbtree_lookup(&rbtree_ctx->root, reg); + rbnode = regcache_rbtree_lookup(map, reg); if (rbnode) { reg_tmp = reg - rbnode->base_reg; val = regcache_rbtree_get_register(rbnode, reg_tmp, @@ -276,7 +252,6 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, return 0; regcache_rbtree_set_register(rbnode, reg_tmp, value, map->cache_word_size); - rbtree_ctx->cached_rbnode = rbnode; } else { /* bail out early, no need to create the rbnode yet */ if (!value) -- cgit v1.2.3-70-g09d2