aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/regmap/regcache-rbtree.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2013-02-21 13:03:13 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-03-03 21:30:27 -0500
commit879082c9fe6e8fbddf787170eee605e4be138d0f (patch)
tree90d721437b67177dae4a2e84348002d74835710d /drivers/base/regmap/regcache-rbtree.c
parent66baf407571662f7e2a22dd0764cbe279559446c (diff)
regmap: cache: Pass the map rather than the word size when updating values
It's more idiomatic to pass the map structure around and this means we can use other bits of information from the map. 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.c51
1 files changed, 25 insertions, 26 deletions
diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c
index 3f21c6ab296f..461cff888bb1 100644
--- a/drivers/base/regmap/regcache-rbtree.c
+++ b/drivers/base/regmap/regcache-rbtree.c
@@ -47,22 +47,21 @@ static inline void regcache_rbtree_get_base_top_reg(
47 *top = rbnode->base_reg + ((rbnode->blklen - 1) * map->reg_stride); 47 *top = rbnode->base_reg + ((rbnode->blklen - 1) * map->reg_stride);
48} 48}
49 49
50static unsigned int regcache_rbtree_get_register( 50static unsigned int regcache_rbtree_get_register(struct regmap *map,
51 struct regcache_rbtree_node *rbnode, unsigned int idx, 51 struct regcache_rbtree_node *rbnode, unsigned int idx)
52 unsigned int word_size)
53{ 52{
54 return regcache_get_val(rbnode->block, idx, word_size); 53 return regcache_get_val(map, rbnode->block, idx);
55} 54}
56 55
57static void regcache_rbtree_set_register(struct regcache_rbtree_node *rbnode, 56static void regcache_rbtree_set_register(struct regmap *map,
58 unsigned int idx, unsigned int val, 57 struct regcache_rbtree_node *rbnode,
59 unsigned int word_size) 58 unsigned int idx, unsigned int val)
60{ 59{
61 regcache_set_val(rbnode->block, idx, val, word_size); 60 regcache_set_val(map, rbnode->block, idx, val);
62} 61}
63 62
64static struct regcache_rbtree_node *regcache_rbtree_lookup(struct regmap *map, 63static struct regcache_rbtree_node *regcache_rbtree_lookup(struct regmap *map,
65 unsigned int reg) 64 unsigned int reg)
66{ 65{
67 struct regcache_rbtree_ctx *rbtree_ctx = map->cache; 66 struct regcache_rbtree_ctx *rbtree_ctx = map->cache;
68 struct rb_node *node; 67 struct rb_node *node;
@@ -260,8 +259,7 @@ static int regcache_rbtree_read(struct regmap *map,
260 rbnode = regcache_rbtree_lookup(map, reg); 259 rbnode = regcache_rbtree_lookup(map, reg);
261 if (rbnode) { 260 if (rbnode) {
262 reg_tmp = (reg - rbnode->base_reg) / map->reg_stride; 261 reg_tmp = (reg - rbnode->base_reg) / map->reg_stride;
263 *value = regcache_rbtree_get_register(rbnode, reg_tmp, 262 *value = regcache_rbtree_get_register(map, rbnode, reg_tmp);
264 map->cache_word_size);
265 } else { 263 } else {
266 return -ENOENT; 264 return -ENOENT;
267 } 265 }
@@ -270,21 +268,23 @@ static int regcache_rbtree_read(struct regmap *map,
270} 268}
271 269
272 270
273static int regcache_rbtree_insert_to_block(struct regcache_rbtree_node *rbnode, 271static int regcache_rbtree_insert_to_block(struct regmap *map,
272 struct regcache_rbtree_node *rbnode,
274 unsigned int pos, unsigned int reg, 273 unsigned int pos, unsigned int reg,
275 unsigned int value, unsigned int word_size) 274 unsigned int value)
276{ 275{
277 u8 *blk; 276 u8 *blk;
278 277
279 blk = krealloc(rbnode->block, 278 blk = krealloc(rbnode->block,
280 (rbnode->blklen + 1) * word_size, GFP_KERNEL); 279 (rbnode->blklen + 1) * map->cache_word_size,
280 GFP_KERNEL);
281 if (!blk) 281 if (!blk)
282 return -ENOMEM; 282 return -ENOMEM;
283 283
284 /* insert the register value in the correct place in the rbnode block */ 284 /* insert the register value in the correct place in the rbnode block */
285 memmove(blk + (pos + 1) * word_size, 285 memmove(blk + (pos + 1) * map->cache_word_size,
286 blk + pos * word_size, 286 blk + pos * map->cache_word_size,
287 (rbnode->blklen - pos) * word_size); 287 (rbnode->blklen - pos) * map->cache_word_size);
288 288
289 /* update the rbnode block, its size and the base register */ 289 /* update the rbnode block, its size and the base register */
290 rbnode->block = blk; 290 rbnode->block = blk;
@@ -292,7 +292,7 @@ static int regcache_rbtree_insert_to_block(struct regcache_rbtree_node *rbnode,
292 if (!pos) 292 if (!pos)
293 rbnode->base_reg = reg; 293 rbnode->base_reg = reg;
294 294
295 regcache_rbtree_set_register(rbnode, pos, value, word_size); 295 regcache_rbtree_set_register(map, rbnode, pos, value);
296 return 0; 296 return 0;
297} 297}
298 298
@@ -314,8 +314,7 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
314 rbnode = regcache_rbtree_lookup(map, reg); 314 rbnode = regcache_rbtree_lookup(map, reg);
315 if (rbnode) { 315 if (rbnode) {
316 reg_tmp = (reg - rbnode->base_reg) / map->reg_stride; 316 reg_tmp = (reg - rbnode->base_reg) / map->reg_stride;
317 regcache_rbtree_set_register(rbnode, reg_tmp, value, 317 regcache_rbtree_set_register(map, rbnode, reg_tmp, value);
318 map->cache_word_size);
319 } else { 318 } else {
320 /* look for an adjacent register to the one we are about to add */ 319 /* look for an adjacent register to the one we are about to add */
321 for (node = rb_first(&rbtree_ctx->root); node; 320 for (node = rb_first(&rbtree_ctx->root); node;
@@ -332,9 +331,10 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
332 pos = i + 1; 331 pos = i + 1;
333 else 332 else
334 pos = i; 333 pos = i;
335 ret = regcache_rbtree_insert_to_block(rbnode_tmp, pos, 334 ret = regcache_rbtree_insert_to_block(map,
336 reg, value, 335 rbnode_tmp,
337 map->cache_word_size); 336 pos, reg,
337 value);
338 if (ret) 338 if (ret)
339 return ret; 339 return ret;
340 rbtree_ctx->cached_rbnode = rbnode_tmp; 340 rbtree_ctx->cached_rbnode = rbnode_tmp;
@@ -357,7 +357,7 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
357 kfree(rbnode); 357 kfree(rbnode);
358 return -ENOMEM; 358 return -ENOMEM;
359 } 359 }
360 regcache_rbtree_set_register(rbnode, 0, value, map->cache_word_size); 360 regcache_rbtree_set_register(map, rbnode, 0, value);
361 regcache_rbtree_insert(map, &rbtree_ctx->root, rbnode); 361 regcache_rbtree_insert(map, &rbtree_ctx->root, rbnode);
362 rbtree_ctx->cached_rbnode = rbnode; 362 rbtree_ctx->cached_rbnode = rbnode;
363 } 363 }
@@ -399,8 +399,7 @@ static int regcache_rbtree_sync(struct regmap *map, unsigned int min,
399 399
400 for (i = base; i < end; i++) { 400 for (i = base; i < end; i++) {
401 regtmp = rbnode->base_reg + (i * map->reg_stride); 401 regtmp = rbnode->base_reg + (i * map->reg_stride);
402 val = regcache_rbtree_get_register(rbnode, i, 402 val = regcache_rbtree_get_register(map, rbnode, i);
403 map->cache_word_size);
404 403
405 /* Is this the hardware default? If so skip. */ 404 /* Is this the hardware default? If so skip. */
406 ret = regcache_lookup_reg(map, regtmp); 405 ret = regcache_lookup_reg(map, regtmp);