aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 }