@@ -93,6 +93,29 @@ bool regmap_writeable(struct regmap *map, unsigned int reg)
9393 return true;
9494}
9595
96+ bool regmap_cached (struct regmap * map , unsigned int reg )
97+ {
98+ int ret ;
99+ unsigned int val ;
100+
101+ if (map -> cache == REGCACHE_NONE )
102+ return false;
103+
104+ if (!map -> cache_ops )
105+ return false;
106+
107+ if (map -> max_register && reg > map -> max_register )
108+ return false;
109+
110+ map -> lock (map -> lock_arg );
111+ ret = regcache_read (map , reg , & val );
112+ map -> unlock (map -> lock_arg );
113+ if (ret )
114+ return false;
115+
116+ return true;
117+ }
118+
96119bool regmap_readable (struct regmap * map , unsigned int reg )
97120{
98121 if (!map -> reg_read )
@@ -749,6 +772,9 @@ struct regmap *__regmap_init(struct device *dev,
749772 case REGMAP_ENDIAN_BIG :
750773 map -> format .format_reg = regmap_format_16_be ;
751774 break ;
775+ case REGMAP_ENDIAN_LITTLE :
776+ map -> format .format_reg = regmap_format_16_le ;
777+ break ;
752778 case REGMAP_ENDIAN_NATIVE :
753779 map -> format .format_reg = regmap_format_16_native ;
754780 break ;
@@ -768,6 +794,9 @@ struct regmap *__regmap_init(struct device *dev,
768794 case REGMAP_ENDIAN_BIG :
769795 map -> format .format_reg = regmap_format_32_be ;
770796 break ;
797+ case REGMAP_ENDIAN_LITTLE :
798+ map -> format .format_reg = regmap_format_32_le ;
799+ break ;
771800 case REGMAP_ENDIAN_NATIVE :
772801 map -> format .format_reg = regmap_format_32_native ;
773802 break ;
@@ -782,6 +811,9 @@ struct regmap *__regmap_init(struct device *dev,
782811 case REGMAP_ENDIAN_BIG :
783812 map -> format .format_reg = regmap_format_64_be ;
784813 break ;
814+ case REGMAP_ENDIAN_LITTLE :
815+ map -> format .format_reg = regmap_format_64_le ;
816+ break ;
785817 case REGMAP_ENDIAN_NATIVE :
786818 map -> format .format_reg = regmap_format_64_native ;
787819 break ;
@@ -1296,12 +1328,26 @@ static int _regmap_select_page(struct regmap *map, unsigned int *reg,
12961328 return 0 ;
12971329}
12981330
1331+ static void regmap_set_work_buf_flag_mask (struct regmap * map , int max_bytes ,
1332+ unsigned long mask )
1333+ {
1334+ u8 * buf ;
1335+ int i ;
1336+
1337+ if (!mask || !map -> work_buf )
1338+ return ;
1339+
1340+ buf = map -> work_buf ;
1341+
1342+ for (i = 0 ; i < max_bytes ; i ++ )
1343+ buf [i ] |= (mask >> (8 * i )) & 0xff ;
1344+ }
1345+
12991346int _regmap_raw_write (struct regmap * map , unsigned int reg ,
13001347 const void * val , size_t val_len )
13011348{
13021349 struct regmap_range_node * range ;
13031350 unsigned long flags ;
1304- u8 * u8 = map -> work_buf ;
13051351 void * work_val = map -> work_buf + map -> format .reg_bytes +
13061352 map -> format .pad_bytes ;
13071353 void * buf ;
@@ -1370,8 +1416,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
13701416 }
13711417
13721418 map -> format .format_reg (map -> work_buf , reg , map -> reg_shift );
1373-
1374- u8 [ 0 ] |= map -> write_flag_mask ;
1419+ regmap_set_work_buf_flag_mask ( map , map -> format . reg_bytes ,
1420+ map -> write_flag_mask ) ;
13751421
13761422 /*
13771423 * Essentially all I/O mechanisms will be faster with a single
@@ -2251,7 +2297,6 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
22512297 unsigned int val_len )
22522298{
22532299 struct regmap_range_node * range ;
2254- u8 * u8 = map -> work_buf ;
22552300 int ret ;
22562301
22572302 WARN_ON (!map -> bus );
@@ -2268,15 +2313,8 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
22682313 }
22692314
22702315 map -> format .format_reg (map -> work_buf , reg , map -> reg_shift );
2271-
2272- /*
2273- * Some buses or devices flag reads by setting the high bits in the
2274- * register address; since it's always the high bits for all
2275- * current formats we can do this here rather than in
2276- * formatting. This may break if we get interesting formats.
2277- */
2278- u8 [0 ] |= map -> read_flag_mask ;
2279-
2316+ regmap_set_work_buf_flag_mask (map , map -> format .reg_bytes ,
2317+ map -> read_flag_mask );
22802318 trace_regmap_hw_read_start (map , reg , val_len / map -> format .val_bytes );
22812319
22822320 ret = map -> bus -> read (map -> bus_context , map -> work_buf ,
0 commit comments