diff options
Diffstat (limited to 'drivers/base/regmap/regmap.c')
-rw-r--r-- | drivers/base/regmap/regmap.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index f7cfff2b8714..5c4e76de38d2 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
@@ -64,6 +64,18 @@ bool regmap_precious(struct regmap *map, unsigned int reg) | |||
64 | return false; | 64 | return false; |
65 | } | 65 | } |
66 | 66 | ||
67 | static bool regmap_volatile_range(struct regmap *map, unsigned int reg, | ||
68 | unsigned int num) | ||
69 | { | ||
70 | unsigned int i; | ||
71 | |||
72 | for (i = 0; i < num; i++) | ||
73 | if (!regmap_volatile(map, reg + i)) | ||
74 | return false; | ||
75 | |||
76 | return true; | ||
77 | } | ||
78 | |||
67 | static void regmap_format_4_12_write(struct regmap *map, | 79 | static void regmap_format_4_12_write(struct regmap *map, |
68 | unsigned int reg, unsigned int val) | 80 | unsigned int reg, unsigned int val) |
69 | { | 81 | { |
@@ -483,15 +495,11 @@ EXPORT_SYMBOL_GPL(regmap_read); | |||
483 | int regmap_raw_read(struct regmap *map, unsigned int reg, void *val, | 495 | int regmap_raw_read(struct regmap *map, unsigned int reg, void *val, |
484 | size_t val_len) | 496 | size_t val_len) |
485 | { | 497 | { |
498 | size_t val_count = val_len / map->format.val_bytes; | ||
486 | int ret; | 499 | int ret; |
487 | int i; | ||
488 | bool vol = true; | ||
489 | |||
490 | for (i = 0; i < val_len / map->format.val_bytes; i++) | ||
491 | if (!regmap_volatile(map, reg + i)) | ||
492 | vol = false; | ||
493 | 500 | ||
494 | WARN_ON(!vol && map->cache_type != REGCACHE_NONE); | 501 | WARN_ON(!regmap_volatile_range(map, reg, val_count) && |
502 | map->cache_type != REGCACHE_NONE); | ||
495 | 503 | ||
496 | mutex_lock(&map->lock); | 504 | mutex_lock(&map->lock); |
497 | 505 | ||
@@ -519,16 +527,11 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val, | |||
519 | { | 527 | { |
520 | int ret, i; | 528 | int ret, i; |
521 | size_t val_bytes = map->format.val_bytes; | 529 | size_t val_bytes = map->format.val_bytes; |
522 | bool vol = true; | 530 | bool vol = regmap_volatile_range(map, reg, val_count); |
523 | 531 | ||
524 | if (!map->format.parse_val) | 532 | if (!map->format.parse_val) |
525 | return -EINVAL; | 533 | return -EINVAL; |
526 | 534 | ||
527 | /* Is this a block of volatile registers? */ | ||
528 | for (i = 0; i < val_count; i++) | ||
529 | if (!regmap_volatile(map, reg + i)) | ||
530 | vol = false; | ||
531 | |||
532 | if (vol || map->cache_type == REGCACHE_NONE) { | 535 | if (vol || map->cache_type == REGCACHE_NONE) { |
533 | ret = regmap_raw_read(map, reg, val, val_bytes * val_count); | 536 | ret = regmap_raw_read(map, reg, val, val_bytes * val_count); |
534 | if (ret != 0) | 537 | if (ret != 0) |