Skip to content

Commit 7a795ac

Browse files
rfvirgilbroonie
authored andcommitted
regmap: rbtree: Fix wrong register marked as in-cache when creating new node
When regcache_rbtree_write() creates a new rbtree_node it was passing the wrong bit number to regcache_rbtree_set_register(). The bit number is the offset __in number of registers__, but in the case of creating a new block regcache_rbtree_write() was not dividing by the address stride to get the number of registers. Fix this by dividing by map->reg_stride. Compare with regcache_rbtree_read() where the bit is checked. This bug meant that the wrong register was marked as present. The register that was written to the cache could not be read from the cache because it was not marked as cached. But a nearby register could be marked as having a cached value even if it was never written to the cache. Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> Fixes: 3f4ff56 ("regmap: rbtree: Make cache_present bitmap per node") Link: https://lore.kernel.org/r/20230922153711.28103-1-rf@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 0bb80ec commit 7a795ac

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

drivers/base/regmap/regcache-rbtree.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,8 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
453453
if (!rbnode)
454454
return -ENOMEM;
455455
regcache_rbtree_set_register(map, rbnode,
456-
reg - rbnode->base_reg, value);
456+
(reg - rbnode->base_reg) / map->reg_stride,
457+
value);
457458
regcache_rbtree_insert(map, &rbtree_ctx->root, rbnode);
458459
rbtree_ctx->cached_rbnode = rbnode;
459460
}

0 commit comments

Comments
 (0)