@@ -168,6 +168,17 @@ bool regmap_precious(struct regmap *map, unsigned int reg)
168
168
return false;
169
169
}
170
170
171
+ bool regmap_readable_noinc (struct regmap * map , unsigned int reg )
172
+ {
173
+ if (map -> readable_noinc_reg )
174
+ return map -> readable_noinc_reg (map -> dev , reg );
175
+
176
+ if (map -> rd_noinc_table )
177
+ return regmap_check_range_table (map , reg , map -> rd_noinc_table );
178
+
179
+ return true;
180
+ }
181
+
171
182
static bool regmap_volatile_range (struct regmap * map , unsigned int reg ,
172
183
size_t num )
173
184
{
@@ -766,10 +777,12 @@ struct regmap *__regmap_init(struct device *dev,
766
777
map -> rd_table = config -> rd_table ;
767
778
map -> volatile_table = config -> volatile_table ;
768
779
map -> precious_table = config -> precious_table ;
780
+ map -> rd_noinc_table = config -> rd_noinc_table ;
769
781
map -> writeable_reg = config -> writeable_reg ;
770
782
map -> readable_reg = config -> readable_reg ;
771
783
map -> volatile_reg = config -> volatile_reg ;
772
784
map -> precious_reg = config -> precious_reg ;
785
+ map -> readable_noinc_reg = config -> readable_noinc_reg ;
773
786
map -> cache_type = config -> cache_type ;
774
787
775
788
spin_lock_init (& map -> async_lock );
@@ -1285,6 +1298,7 @@ int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config)
1285
1298
map -> readable_reg = config -> readable_reg ;
1286
1299
map -> volatile_reg = config -> volatile_reg ;
1287
1300
map -> precious_reg = config -> precious_reg ;
1301
+ map -> readable_noinc_reg = config -> readable_noinc_reg ;
1288
1302
map -> cache_type = config -> cache_type ;
1289
1303
1290
1304
regmap_debugfs_init (map , config -> name );
@@ -2564,7 +2578,70 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
2564
2578
EXPORT_SYMBOL_GPL (regmap_raw_read );
2565
2579
2566
2580
/**
2567
- * regmap_field_read() - Read a value to a single register field
2581
+ * regmap_noinc_read(): Read data from a register without incrementing the
2582
+ * register number
2583
+ *
2584
+ * @map: Register map to read from
2585
+ * @reg: Register to read from
2586
+ * @val: Pointer to data buffer
2587
+ * @val_len: Length of output buffer in bytes.
2588
+ *
2589
+ * The regmap API usually assumes that bulk bus read operations will read a
2590
+ * range of registers. Some devices have certain registers for which a read
2591
+ * operation read will read from an internal FIFO.
2592
+ *
2593
+ * The target register must be volatile but registers after it can be
2594
+ * completely unrelated cacheable registers.
2595
+ *
2596
+ * This will attempt multiple reads as required to read val_len bytes.
2597
+ *
2598
+ * A value of zero will be returned on success, a negative errno will be
2599
+ * returned in error cases.
2600
+ */
2601
+ int regmap_noinc_read (struct regmap * map , unsigned int reg ,
2602
+ void * val , size_t val_len )
2603
+ {
2604
+ size_t read_len ;
2605
+ int ret ;
2606
+
2607
+ if (!map -> bus )
2608
+ return - EINVAL ;
2609
+ if (!map -> bus -> read )
2610
+ return - ENOTSUPP ;
2611
+ if (val_len % map -> format .val_bytes )
2612
+ return - EINVAL ;
2613
+ if (!IS_ALIGNED (reg , map -> reg_stride ))
2614
+ return - EINVAL ;
2615
+ if (val_len == 0 )
2616
+ return - EINVAL ;
2617
+
2618
+ map -> lock (map -> lock_arg );
2619
+
2620
+ if (!regmap_volatile (map , reg ) || !regmap_readable_noinc (map , reg )) {
2621
+ ret = - EINVAL ;
2622
+ goto out_unlock ;
2623
+ }
2624
+
2625
+ while (val_len ) {
2626
+ if (map -> max_raw_read && map -> max_raw_read < val_len )
2627
+ read_len = map -> max_raw_read ;
2628
+ else
2629
+ read_len = val_len ;
2630
+ ret = _regmap_raw_read (map , reg , val , read_len );
2631
+ if (ret )
2632
+ goto out_unlock ;
2633
+ val = ((u8 * )val ) + read_len ;
2634
+ val_len -= read_len ;
2635
+ }
2636
+
2637
+ out_unlock :
2638
+ map -> unlock (map -> lock_arg );
2639
+ return ret ;
2640
+ }
2641
+ EXPORT_SYMBOL_GPL (regmap_noinc_read );
2642
+
2643
+ /**
2644
+ * regmap_field_read(): Read a value to a single register field
2568
2645
*
2569
2646
* @field: Register field to read from
2570
2647
* @val: Pointer to store read value
0 commit comments