diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-05-08 08:55:24 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-05-12 10:46:47 -0400 |
commit | 0186645d2549f94c3a8067c97cad261c678d6718 (patch) | |
tree | c11d077008c9edfaa6d212a780e0e6e33178b41f /drivers/base | |
parent | 154881e59b8dbf84121e3e78c4e613e840752aa9 (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.c | 41 |
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 | ||
307 | static struct regcache_rbtree_node * | ||
308 | regcache_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 | |||
307 | static int regcache_rbtree_write(struct regmap *map, unsigned int reg, | 328 | static 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 | } |