Skip to content

Commit

Permalink
regmap: Support some block operations on cached devices
Browse files Browse the repository at this point in the history
Support raw reads if all the registers being read are volatile, the cache
will have no impact for tem.

Support bulk reads either directly (if all the registers are volatile) or
by falling back to iterating over single register reads otherwise.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Mark Brown committed Oct 13, 2011
1 parent 8528bdd commit de2d808
Showing 1 changed file with 26 additions and 8 deletions.
34 changes: 26 additions & 8 deletions drivers/base/regmap/regmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -482,8 +482,14 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
size_t val_len)
{
int ret;
int i;
bool vol = true;

WARN_ON(map->cache_type != REGCACHE_NONE);
for (i = 0; i < val_len / map->format.val_bytes; i++)
if (!regmap_volatile(map, reg + i))
vol = false;

WARN_ON(!vol && map->cache_type != REGCACHE_NONE);

mutex_lock(&map->lock);

Expand Down Expand Up @@ -511,18 +517,30 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
{
int ret, i;
size_t val_bytes = map->format.val_bytes;

WARN_ON(map->cache_type != REGCACHE_NONE);
bool vol = true;

if (!map->format.parse_val)
return -EINVAL;

ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
if (ret != 0)
return ret;
/* Is this a block of volatile registers? */
for (i = 0; i < val_count; i++)
if (!regmap_volatile(map, reg + i))
vol = false;

for (i = 0; i < val_count * val_bytes; i += val_bytes)
map->format.parse_val(val + i);
if (vol || map->cache_type == REGCACHE_NONE) {
ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
if (ret != 0)
return ret;

for (i = 0; i < val_count * val_bytes; i += val_bytes)
map->format.parse_val(val + i);
} else {
for (i = 0; i < val_count; i++) {
ret = regmap_read(map, reg + i, val + (i * val_bytes));
if (ret != 0)
return ret;
}
}

return 0;
}
Expand Down

0 comments on commit de2d808

Please sign in to comment.