aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/regmap/regmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base/regmap/regmap.c')
-rw-r--r--drivers/base/regmap/regmap.c29
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
67static 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
67static void regmap_format_4_12_write(struct regmap *map, 79static 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);
483int regmap_raw_read(struct regmap *map, unsigned int reg, void *val, 495int 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)