diff options
author | Lars-Peter Clausen <lars@metafoo.de> | 2011-09-27 14:15:38 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-09-28 08:18:22 -0400 |
commit | 3405addd220a0cf2e3a8ffb9051afe766e5f52e8 (patch) | |
tree | ef19c5e5b155424fc50f131038eeb2abf27c7d24 /drivers/base/regmap/regcache-rbtree.c | |
parent | c5713004b304e89c8c5117d8f226d5a1603571dc (diff) |
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 <lars@metafoo.de>
Acked-by: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/base/regmap/regcache-rbtree.c')
-rw-r--r-- | drivers/base/regmap/regcache-rbtree.c | 61 |
1 files changed, 18 insertions, 43 deletions
diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c index 52669dec73b3..de32ced1917a 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, | |||
56 | regcache_set_val(rbnode->block, idx, val, word_size); | 56 | regcache_set_val(rbnode->block, idx, val, word_size); |
57 | } | 57 | } |
58 | 58 | ||
59 | static struct regcache_rbtree_node *regcache_rbtree_lookup( | 59 | static struct regcache_rbtree_node *regcache_rbtree_lookup(struct regmap *map, |
60 | struct rb_root *root, unsigned int reg) | 60 | unsigned int reg) |
61 | { | 61 | { |
62 | struct regcache_rbtree_ctx *rbtree_ctx = map->cache; | ||
62 | struct rb_node *node; | 63 | struct rb_node *node; |
63 | struct regcache_rbtree_node *rbnode; | 64 | struct regcache_rbtree_node *rbnode; |
64 | unsigned int base_reg, top_reg; | 65 | unsigned int base_reg, top_reg; |
65 | 66 | ||
66 | node = root->rb_node; | 67 | rbnode = rbtree_ctx->cached_rbnode; |
68 | if (rbnode) { | ||
69 | regcache_rbtree_get_base_top_reg(rbnode, &base_reg, &top_reg); | ||
70 | if (reg >= base_reg && reg <= top_reg) | ||
71 | return rbnode; | ||
72 | } | ||
73 | |||
74 | node = rbtree_ctx->root.rb_node; | ||
67 | while (node) { | 75 | while (node) { |
68 | rbnode = container_of(node, struct regcache_rbtree_node, node); | 76 | rbnode = container_of(node, struct regcache_rbtree_node, node); |
69 | regcache_rbtree_get_base_top_reg(rbnode, &base_reg, &top_reg); | 77 | regcache_rbtree_get_base_top_reg(rbnode, &base_reg, &top_reg); |
70 | if (reg >= base_reg && reg <= top_reg) | 78 | if (reg >= base_reg && reg <= top_reg) { |
79 | rbtree_ctx->cached_rbnode = rbnode; | ||
71 | return rbnode; | 80 | return rbnode; |
72 | else if (reg > top_reg) | 81 | } else if (reg > top_reg) { |
73 | node = node->rb_right; | 82 | node = node->rb_right; |
74 | else if (reg < base_reg) | 83 | } else if (reg < base_reg) { |
75 | node = node->rb_left; | 84 | node = node->rb_left; |
85 | } | ||
76 | } | 86 | } |
77 | 87 | ||
78 | return NULL; | 88 | return NULL; |
@@ -174,32 +184,14 @@ static int regcache_rbtree_exit(struct regmap *map) | |||
174 | static int regcache_rbtree_read(struct regmap *map, | 184 | static int regcache_rbtree_read(struct regmap *map, |
175 | unsigned int reg, unsigned int *value) | 185 | unsigned int reg, unsigned int *value) |
176 | { | 186 | { |
177 | struct regcache_rbtree_ctx *rbtree_ctx; | ||
178 | struct regcache_rbtree_node *rbnode; | 187 | struct regcache_rbtree_node *rbnode; |
179 | unsigned int base_reg, top_reg; | ||
180 | unsigned int reg_tmp; | 188 | unsigned int reg_tmp; |
181 | 189 | ||
182 | rbtree_ctx = map->cache; | 190 | rbnode = regcache_rbtree_lookup(map, reg); |
183 | /* look up the required register in the cached rbnode */ | ||
184 | rbnode = rbtree_ctx->cached_rbnode; | ||
185 | if (rbnode) { | ||
186 | regcache_rbtree_get_base_top_reg(rbnode, &base_reg, &top_reg); | ||
187 | if (reg >= base_reg && reg <= top_reg) { | ||
188 | reg_tmp = reg - base_reg; | ||
189 | *value = regcache_rbtree_get_register(rbnode, reg_tmp, | ||
190 | map->cache_word_size); | ||
191 | return 0; | ||
192 | } | ||
193 | } | ||
194 | /* if we can't locate it in the cached rbnode we'll have | ||
195 | * to traverse the rbtree looking for it. | ||
196 | */ | ||
197 | rbnode = regcache_rbtree_lookup(&rbtree_ctx->root, reg); | ||
198 | if (rbnode) { | 191 | if (rbnode) { |
199 | reg_tmp = reg - rbnode->base_reg; | 192 | reg_tmp = reg - rbnode->base_reg; |
200 | *value = regcache_rbtree_get_register(rbnode, reg_tmp, | 193 | *value = regcache_rbtree_get_register(rbnode, reg_tmp, |
201 | map->cache_word_size); | 194 | map->cache_word_size); |
202 | rbtree_ctx->cached_rbnode = rbnode; | ||
203 | } else { | 195 | } else { |
204 | /* uninitialized registers default to 0 */ | 196 | /* uninitialized registers default to 0 */ |
205 | *value = 0; | 197 | *value = 0; |
@@ -243,31 +235,15 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, | |||
243 | struct rb_node *node; | 235 | struct rb_node *node; |
244 | unsigned int val; | 236 | unsigned int val; |
245 | unsigned int reg_tmp; | 237 | unsigned int reg_tmp; |
246 | unsigned int base_reg, top_reg; | ||
247 | unsigned int pos; | 238 | unsigned int pos; |
248 | int i; | 239 | int i; |
249 | int ret; | 240 | int ret; |
250 | 241 | ||
251 | rbtree_ctx = map->cache; | 242 | rbtree_ctx = map->cache; |
252 | /* look up the required register in the cached rbnode */ | ||
253 | rbnode = rbtree_ctx->cached_rbnode; | ||
254 | if (rbnode) { | ||
255 | regcache_rbtree_get_base_top_reg(rbnode, &base_reg, &top_reg); | ||
256 | if (reg >= base_reg && reg <= top_reg) { | ||
257 | reg_tmp = reg - base_reg; | ||
258 | val = regcache_rbtree_get_register(rbnode, reg_tmp, | ||
259 | map->cache_word_size); | ||
260 | if (val == value) | ||
261 | return 0; | ||
262 | regcache_rbtree_set_register(rbnode, reg_tmp, value, | ||
263 | map->cache_word_size); | ||
264 | return 0; | ||
265 | } | ||
266 | } | ||
267 | /* if we can't locate it in the cached rbnode we'll have | 243 | /* if we can't locate it in the cached rbnode we'll have |
268 | * to traverse the rbtree looking for it. | 244 | * to traverse the rbtree looking for it. |
269 | */ | 245 | */ |
270 | rbnode = regcache_rbtree_lookup(&rbtree_ctx->root, reg); | 246 | rbnode = regcache_rbtree_lookup(map, reg); |
271 | if (rbnode) { | 247 | if (rbnode) { |
272 | reg_tmp = reg - rbnode->base_reg; | 248 | reg_tmp = reg - rbnode->base_reg; |
273 | val = regcache_rbtree_get_register(rbnode, reg_tmp, | 249 | val = regcache_rbtree_get_register(rbnode, reg_tmp, |
@@ -276,7 +252,6 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, | |||
276 | return 0; | 252 | return 0; |
277 | regcache_rbtree_set_register(rbnode, reg_tmp, value, | 253 | regcache_rbtree_set_register(rbnode, reg_tmp, value, |
278 | map->cache_word_size); | 254 | map->cache_word_size); |
279 | rbtree_ctx->cached_rbnode = rbnode; | ||
280 | } else { | 255 | } else { |
281 | /* bail out early, no need to create the rbnode yet */ | 256 | /* bail out early, no need to create the rbnode yet */ |
282 | if (!value) | 257 | if (!value) |