@@ -203,15 +203,18 @@ static int regcache_maple_sync(struct regmap *map, unsigned int min,
203203
204204 mas_for_each (& mas , entry , max ) {
205205 for (r = max (mas .index , lmin ); r <= min (mas .last , lmax ); r ++ ) {
206+ mas_pause (& mas );
207+ rcu_read_unlock ();
206208 ret = regcache_sync_val (map , r , entry [r - mas .index ]);
207209 if (ret != 0 )
208210 goto out ;
211+ rcu_read_lock ();
209212 }
210213 }
211214
212- out :
213215 rcu_read_unlock ();
214216
217+ out :
215218 map -> cache_bypass = false;
216219
217220 return ret ;
@@ -239,11 +242,41 @@ static int regcache_maple_exit(struct regmap *map)
239242 return 0 ;
240243}
241244
245+ static int regcache_maple_insert_block (struct regmap * map , int first ,
246+ int last )
247+ {
248+ struct maple_tree * mt = map -> cache ;
249+ MA_STATE (mas , mt , first , last );
250+ unsigned long * entry ;
251+ int i , ret ;
252+
253+ entry = kcalloc (last - first + 1 , sizeof (unsigned long ), GFP_KERNEL );
254+ if (!entry )
255+ return - ENOMEM ;
256+
257+ for (i = 0 ; i < last - first + 1 ; i ++ )
258+ entry [i ] = map -> reg_defaults [first + i ].def ;
259+
260+ mas_lock (& mas );
261+
262+ mas_set_range (& mas , map -> reg_defaults [first ].reg ,
263+ map -> reg_defaults [last ].reg );
264+ ret = mas_store_gfp (& mas , entry , GFP_KERNEL );
265+
266+ mas_unlock (& mas );
267+
268+ if (ret )
269+ kfree (entry );
270+
271+ return ret ;
272+ }
273+
242274static int regcache_maple_init (struct regmap * map )
243275{
244276 struct maple_tree * mt ;
245277 int i ;
246278 int ret ;
279+ int range_start ;
247280
248281 mt = kmalloc (sizeof (* mt ), GFP_KERNEL );
249282 if (!mt )
@@ -252,14 +285,30 @@ static int regcache_maple_init(struct regmap *map)
252285
253286 mt_init (mt );
254287
255- for (i = 0 ; i < map -> num_reg_defaults ; i ++ ) {
256- ret = regcache_maple_write (map ,
257- map -> reg_defaults [i ].reg ,
258- map -> reg_defaults [i ].def );
259- if (ret )
260- goto err ;
288+ if (!map -> num_reg_defaults )
289+ return 0 ;
290+
291+ range_start = 0 ;
292+
293+ /* Scan for ranges of contiguous registers */
294+ for (i = 1 ; i < map -> num_reg_defaults ; i ++ ) {
295+ if (map -> reg_defaults [i ].reg !=
296+ map -> reg_defaults [i - 1 ].reg + 1 ) {
297+ ret = regcache_maple_insert_block (map , range_start ,
298+ i - 1 );
299+ if (ret != 0 )
300+ goto err ;
301+
302+ range_start = i ;
303+ }
261304 }
262305
306+ /* Add the last block */
307+ ret = regcache_maple_insert_block (map , range_start ,
308+ map -> num_reg_defaults - 1 );
309+ if (ret != 0 )
310+ goto err ;
311+
263312 return 0 ;
264313
265314err :
0 commit comments