Loading drivers/base/regmap/regcache-rbtree.c +28 −10 Original line number Diff line number Diff line Loading @@ -404,6 +404,7 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, unsigned int new_base_reg, new_top_reg; unsigned int min, max; unsigned int max_dist; unsigned int dist, best_dist = UINT_MAX; max_dist = map->reg_stride * sizeof(*rbnode_tmp) / map->cache_word_size; Loading @@ -423,24 +424,41 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, &base_reg, &top_reg); if (base_reg <= max && top_reg >= min) { if (reg < base_reg) dist = base_reg - reg; else if (reg > top_reg) dist = reg - top_reg; else dist = 0; if (dist < best_dist) { rbnode = rbnode_tmp; best_dist = dist; new_base_reg = min(reg, base_reg); new_top_reg = max(reg, top_reg); } else { if (max < base_reg) } } /* * Keep looking, we want to choose the closest block, * otherwise we might end up creating overlapping * blocks, which breaks the rbtree. */ if (reg < base_reg) node = node->rb_left; else else if (reg > top_reg) node = node->rb_right; continue; else break; } ret = regcache_rbtree_insert_to_block(map, rbnode_tmp, if (rbnode) { ret = regcache_rbtree_insert_to_block(map, rbnode, new_base_reg, new_top_reg, reg, value); if (ret) return ret; rbtree_ctx->cached_rbnode = rbnode_tmp; rbtree_ctx->cached_rbnode = rbnode; return 0; } Loading Loading
drivers/base/regmap/regcache-rbtree.c +28 −10 Original line number Diff line number Diff line Loading @@ -404,6 +404,7 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, unsigned int new_base_reg, new_top_reg; unsigned int min, max; unsigned int max_dist; unsigned int dist, best_dist = UINT_MAX; max_dist = map->reg_stride * sizeof(*rbnode_tmp) / map->cache_word_size; Loading @@ -423,24 +424,41 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, &base_reg, &top_reg); if (base_reg <= max && top_reg >= min) { if (reg < base_reg) dist = base_reg - reg; else if (reg > top_reg) dist = reg - top_reg; else dist = 0; if (dist < best_dist) { rbnode = rbnode_tmp; best_dist = dist; new_base_reg = min(reg, base_reg); new_top_reg = max(reg, top_reg); } else { if (max < base_reg) } } /* * Keep looking, we want to choose the closest block, * otherwise we might end up creating overlapping * blocks, which breaks the rbtree. */ if (reg < base_reg) node = node->rb_left; else else if (reg > top_reg) node = node->rb_right; continue; else break; } ret = regcache_rbtree_insert_to_block(map, rbnode_tmp, if (rbnode) { ret = regcache_rbtree_insert_to_block(map, rbnode, new_base_reg, new_top_reg, reg, value); if (ret) return ret; rbtree_ctx->cached_rbnode = rbnode_tmp; rbtree_ctx->cached_rbnode = rbnode; return 0; } Loading