| From: Mark Brown <broonie@kernel.org> |
| Date: Fri, 28 Aug 2015 20:04:53 +0100 |
| Subject: regmap: Support bulk reads for devices without raw formatting |
| |
| commit d5b98eb12420ce856caaf57dc5256eedc56a3747 upstream. |
| |
| When doing a bulk read from a device which lacks raw I/O support we fall |
| back to doing register at a time reads but we still use the raw |
| formatters in order to render the data into the word size used by the |
| device (since bulk reads still operate on the device word size rather |
| than unsigned ints). This means that devices without raw formatting |
| such as those that provide reg_read() are not supported. Provide |
| handling for them by copying the values read into native endian values |
| of the appropriate size. |
| |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/base/regmap/regmap.c | 29 ++++++++++++++++++++++++++++- |
| 1 file changed, 28 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/base/regmap/regmap.c |
| +++ b/drivers/base/regmap/regmap.c |
| @@ -2246,7 +2246,34 @@ int regmap_bulk_read(struct regmap *map, |
| &ival); |
| if (ret != 0) |
| return ret; |
| - map->format.format_val(val + (i * val_bytes), ival, 0); |
| + |
| + if (map->format.format_val) { |
| + map->format.format_val(val + (i * val_bytes), ival, 0); |
| + } else { |
| + /* Devices providing read and write |
| + * operations can use the bulk I/O |
| + * functions if they define a val_bytes, |
| + * we assume that the values are native |
| + * endian. |
| + */ |
| + u32 *u32 = val; |
| + u16 *u16 = val; |
| + u8 *u8 = val; |
| + |
| + switch (map->format.val_bytes) { |
| + case 4: |
| + u32[i] = ival; |
| + break; |
| + case 2: |
| + u16[i] = ival; |
| + break; |
| + case 1: |
| + u8[i] = ival; |
| + break; |
| + default: |
| + return -EINVAL; |
| + } |
| + } |
| } |
| } |
| |