@@ -39,11 +39,12 @@ struct regcache_rbtree_ctx {
3939};
4040
4141static inline void regcache_rbtree_get_base_top_reg (
42+ struct regmap * map ,
4243 struct regcache_rbtree_node * rbnode ,
4344 unsigned int * base , unsigned int * top )
4445{
4546 * base = rbnode -> base_reg ;
46- * top = rbnode -> base_reg + rbnode -> blklen - 1 ;
47+ * top = rbnode -> base_reg + (( rbnode -> blklen - 1 ) * map -> reg_stride ) ;
4748}
4849
4950static unsigned int regcache_rbtree_get_register (
@@ -70,15 +71,17 @@ static struct regcache_rbtree_node *regcache_rbtree_lookup(struct regmap *map,
7071
7172 rbnode = rbtree_ctx -> cached_rbnode ;
7273 if (rbnode ) {
73- regcache_rbtree_get_base_top_reg (rbnode , & base_reg , & top_reg );
74+ regcache_rbtree_get_base_top_reg (map , rbnode , & base_reg ,
75+ & top_reg );
7476 if (reg >= base_reg && reg <= top_reg )
7577 return rbnode ;
7678 }
7779
7880 node = rbtree_ctx -> root .rb_node ;
7981 while (node ) {
8082 rbnode = container_of (node , struct regcache_rbtree_node , node );
81- regcache_rbtree_get_base_top_reg (rbnode , & base_reg , & top_reg );
83+ regcache_rbtree_get_base_top_reg (map , rbnode , & base_reg ,
84+ & top_reg );
8285 if (reg >= base_reg && reg <= top_reg ) {
8386 rbtree_ctx -> cached_rbnode = rbnode ;
8487 return rbnode ;
@@ -92,7 +95,7 @@ static struct regcache_rbtree_node *regcache_rbtree_lookup(struct regmap *map,
9295 return NULL ;
9396}
9497
95- static int regcache_rbtree_insert (struct rb_root * root ,
98+ static int regcache_rbtree_insert (struct regmap * map , struct rb_root * root ,
9699 struct regcache_rbtree_node * rbnode )
97100{
98101 struct rb_node * * new , * parent ;
@@ -106,7 +109,7 @@ static int regcache_rbtree_insert(struct rb_root *root,
106109 rbnode_tmp = container_of (* new , struct regcache_rbtree_node ,
107110 node );
108111 /* base and top registers of the current rbnode */
109- regcache_rbtree_get_base_top_reg (rbnode_tmp , & base_reg_tmp ,
112+ regcache_rbtree_get_base_top_reg (map , rbnode_tmp , & base_reg_tmp ,
110113 & top_reg_tmp );
111114 /* base register of the rbnode to be added */
112115 base_reg = rbnode -> base_reg ;
@@ -138,19 +141,20 @@ static int rbtree_show(struct seq_file *s, void *ignored)
138141 unsigned int base , top ;
139142 int nodes = 0 ;
140143 int registers = 0 ;
141- int average ;
144+ int this_registers , average ;
142145
143146 map -> lock (map );
144147
145148 for (node = rb_first (& rbtree_ctx -> root ); node != NULL ;
146149 node = rb_next (node )) {
147150 n = container_of (node , struct regcache_rbtree_node , node );
148151
149- regcache_rbtree_get_base_top_reg (n , & base , & top );
150- seq_printf (s , "%x-%x (%d)\n" , base , top , top - base + 1 );
152+ regcache_rbtree_get_base_top_reg (map , n , & base , & top );
153+ this_registers = ((top - base ) / map -> reg_stride ) + 1 ;
154+ seq_printf (s , "%x-%x (%d)\n" , base , top , this_registers );
151155
152156 nodes ++ ;
153- registers += top - base + 1 ;
157+ registers += this_registers ;
154158 }
155159
156160 if (nodes )
@@ -255,7 +259,7 @@ static int regcache_rbtree_read(struct regmap *map,
255259
256260 rbnode = regcache_rbtree_lookup (map , reg );
257261 if (rbnode ) {
258- reg_tmp = reg - rbnode -> base_reg ;
262+ reg_tmp = ( reg - rbnode -> base_reg ) / map -> reg_stride ;
259263 * value = regcache_rbtree_get_register (rbnode , reg_tmp ,
260264 map -> cache_word_size );
261265 } else {
@@ -310,7 +314,7 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
310314 */
311315 rbnode = regcache_rbtree_lookup (map , reg );
312316 if (rbnode ) {
313- reg_tmp = reg - rbnode -> base_reg ;
317+ reg_tmp = ( reg - rbnode -> base_reg ) / map -> reg_stride ;
314318 val = regcache_rbtree_get_register (rbnode , reg_tmp ,
315319 map -> cache_word_size );
316320 if (val == value )
@@ -321,13 +325,15 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
321325 /* look for an adjacent register to the one we are about to add */
322326 for (node = rb_first (& rbtree_ctx -> root ); node ;
323327 node = rb_next (node )) {
324- rbnode_tmp = rb_entry (node , struct regcache_rbtree_node , node );
328+ rbnode_tmp = rb_entry (node , struct regcache_rbtree_node ,
329+ node );
325330 for (i = 0 ; i < rbnode_tmp -> blklen ; i ++ ) {
326- reg_tmp = rbnode_tmp -> base_reg + i ;
327- if (abs (reg_tmp - reg ) != 1 )
331+ reg_tmp = rbnode_tmp -> base_reg +
332+ (i * map -> reg_stride );
333+ if (abs (reg_tmp - reg ) != map -> reg_stride )
328334 continue ;
329335 /* decide where in the block to place our register */
330- if (reg_tmp + 1 == reg )
336+ if (reg_tmp + map -> reg_stride == reg )
331337 pos = i + 1 ;
332338 else
333339 pos = i ;
@@ -357,7 +363,7 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
357363 return - ENOMEM ;
358364 }
359365 regcache_rbtree_set_register (rbnode , 0 , value , map -> cache_word_size );
360- regcache_rbtree_insert (& rbtree_ctx -> root , rbnode );
366+ regcache_rbtree_insert (map , & rbtree_ctx -> root , rbnode );
361367 rbtree_ctx -> cached_rbnode = rbnode ;
362368 }
363369
@@ -397,7 +403,7 @@ static int regcache_rbtree_sync(struct regmap *map, unsigned int min,
397403 end = rbnode -> blklen ;
398404
399405 for (i = base ; i < end ; i ++ ) {
400- regtmp = rbnode -> base_reg + i ;
406+ regtmp = rbnode -> base_reg + ( i * map -> reg_stride ) ;
401407 val = regcache_rbtree_get_register (rbnode , i ,
402408 map -> cache_word_size );
403409
0 commit comments