aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2013-05-08 08:55:24 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-05-12 10:46:47 -0400
commit0186645d2549f94c3a8067c97cad261c678d6718 (patch)
treec11d077008c9edfaa6d212a780e0e6e33178b41f /drivers/base
parent154881e59b8dbf84121e3e78c4e613e840752aa9 (diff)
regmap: rbtree: Factor out node allocation
In preparation for being slightly smarter about how we allocate memory factor out the node allocation. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/regmap/regcache-rbtree.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c
index aa0875f6f1b7..3a000145ac6e 100644
--- a/drivers/base/regmap/regcache-rbtree.c
+++ b/drivers/base/regmap/regcache-rbtree.c
@@ -304,6 +304,27 @@ static int regcache_rbtree_insert_to_block(struct regmap *map,
304 return 0; 304 return 0;
305} 305}
306 306
307static struct regcache_rbtree_node *
308regcache_rbtree_node_alloc(struct regmap *map, unsigned int reg)
309{
310 struct regcache_rbtree_node *rbnode;
311
312 rbnode = kzalloc(sizeof(*rbnode), GFP_KERNEL);
313 if (!rbnode)
314 return NULL;
315
316 rbnode->blklen = sizeof(*rbnode);
317 rbnode->base_reg = reg;
318 rbnode->block = kmalloc(rbnode->blklen * map->cache_word_size,
319 GFP_KERNEL);
320 if (!rbnode->block) {
321 kfree(rbnode);
322 return NULL;
323 }
324
325 return rbnode;
326}
327
307static int regcache_rbtree_write(struct regmap *map, unsigned int reg, 328static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
308 unsigned int value) 329 unsigned int value)
309{ 330{
@@ -354,23 +375,15 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
354 return 0; 375 return 0;
355 } 376 }
356 } 377 }
357 /* we did not manage to find a place to insert it in an existing 378
358 * block so create a new rbnode with a single register in its block. 379 /* We did not manage to find a place to insert it in
359 * This block will get populated further if any other adjacent 380 * an existing block so create a new rbnode.
360 * registers get modified in the future.
361 */ 381 */
362 rbnode = kzalloc(sizeof *rbnode, GFP_KERNEL); 382 rbnode = regcache_rbtree_node_alloc(map, reg);
363 if (!rbnode) 383 if (!rbnode)
364 return -ENOMEM; 384 return -ENOMEM;
365 rbnode->blklen = sizeof(*rbnode); 385 regcache_rbtree_set_register(map, rbnode,
366 rbnode->base_reg = reg; 386 reg - rbnode->base_reg, value);
367 rbnode->block = kmalloc(rbnode->blklen * map->cache_word_size,
368 GFP_KERNEL);
369 if (!rbnode->block) {
370 kfree(rbnode);
371 return -ENOMEM;
372 }
373 regcache_rbtree_set_register(map, rbnode, 0, value);
374 regcache_rbtree_insert(map, &rbtree_ctx->root, rbnode); 387 regcache_rbtree_insert(map, &rbtree_ctx->root, rbnode);
375 rbtree_ctx->cached_rbnode = rbnode; 388 rbtree_ctx->cached_rbnode = rbnode;
376 } 389 }