Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 9ae27a8d authored by Charles Keepax's avatar Charles Keepax Committed by Mark Brown
Browse files

regmap: Don't use format_val in regmap_bulk_read



A bulk read can be implemented either through regmap_raw_read, or
by reading each register individually using regmap_read.  Both
regmap_read and regmap_bulk_read should return values in native
endian. In the individual case the current implementation calls
format_val to put the data into the output array, which can cause
endian issues. The regmap_read will have already converted the data
into native endian, if the hosts endian differs from the device then
format_val will switch the endian back again.

Rather than using format_val simply use the code that is called if
there is no format_val function. This code supports all cases except
24-bit but there don't appear to be any users of regmap_bulk_read for
24-bit. Additionally, it would have to be a big endian host for the
old code to actually function correctly anyway.

Fixes: 15b8d2c4 ("regmap: Fix regmap_bulk_read in BE mode")
Reported-by: default avatarDavid Rhodes <david.rhodes@cirrus.com>
Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 7928b2cb
Loading
Loading
Loading
Loading
+23 −32
Original line number Diff line number Diff line
@@ -2709,22 +2709,6 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
		for (i = 0; i < val_count * val_bytes; i += val_bytes)
			map->format.parse_inplace(val + i);
	} else {
		for (i = 0; i < val_count; i++) {
			unsigned int ival;
			ret = regmap_read(map, reg + regmap_get_offset(map, i),
					  &ival);
			if (ret != 0)
				return ret;

			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.
				 */
#ifdef CONFIG_64BIT
		u64 *u64 = val;
#endif
@@ -2732,6 +2716,14 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
		u16 *u16 = val;
		u8 *u8 = val;

		for (i = 0; i < val_count; i++) {
			unsigned int ival;

			ret = regmap_read(map, reg + regmap_get_offset(map, i),
					  &ival);
			if (ret != 0)
				return ret;

			switch (map->format.val_bytes) {
#ifdef CONFIG_64BIT
			case 8:
@@ -2752,7 +2744,6 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
			}
		}
	}
	}

	return 0;
}