|
@@ -247,6 +247,7 @@ struct regmap *regmap_init(struct device *dev,
|
|
|
map->reg_stride = config->reg_stride;
|
|
|
else
|
|
|
map->reg_stride = 1;
|
|
|
+ map->use_single_rw = config->use_single_rw;
|
|
|
map->dev = dev;
|
|
|
map->bus = bus;
|
|
|
map->bus_context = bus_context;
|
|
@@ -686,7 +687,22 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
|
|
|
for (i = 0; i < val_count * val_bytes; i += val_bytes)
|
|
|
map->format.parse_val(wval + i);
|
|
|
}
|
|
|
- ret = _regmap_raw_write(map, reg, wval, val_bytes * val_count);
|
|
|
+ /*
|
|
|
+ * Some devices does not support bulk write, for
|
|
|
+ * them we have a series of single write operations.
|
|
|
+ */
|
|
|
+ if (map->use_single_rw) {
|
|
|
+ for (i = 0; i < val_count; i++) {
|
|
|
+ ret = regmap_raw_write(map,
|
|
|
+ reg + (i * map->reg_stride),
|
|
|
+ val + (i * val_bytes),
|
|
|
+ val_bytes);
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ ret = _regmap_raw_write(map, reg, wval, val_bytes * val_count);
|
|
|
+ }
|
|
|
|
|
|
if (val_bytes != 1)
|
|
|
kfree(wval);
|
|
@@ -855,9 +871,25 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
|
|
|
return -EINVAL;
|
|
|
|
|
|
if (vol || map->cache_type == REGCACHE_NONE) {
|
|
|
- ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
|
|
|
- if (ret != 0)
|
|
|
- return ret;
|
|
|
+ /*
|
|
|
+ * Some devices does not support bulk read, for
|
|
|
+ * them we have a series of single read operations.
|
|
|
+ */
|
|
|
+ if (map->use_single_rw) {
|
|
|
+ for (i = 0; i < val_count; i++) {
|
|
|
+ ret = regmap_raw_read(map,
|
|
|
+ reg + (i * map->reg_stride),
|
|
|
+ val + (i * val_bytes),
|
|
|
+ val_bytes);
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ 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);
|