Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

regmap: fix writes to non incrementing registers

When checking if a register block is writable we must ensure that the
block does not start with or contain a non incrementing register.

Fixes: 8b9f9d4dc511 ("regmap: verify if register is writeable before writing operations")
Signed-off-by: Ben Whitten <ben.whitten@gmail.com>
Link: https://lore.kernel.org/r/20200118205625.14532-1-ben.whitten@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Ben Whitten and committed by
Mark Brown
2e31aab0 50816a4c

+12 -5
+12 -5
drivers/base/regmap/regmap.c
··· 1488 1488 1489 1489 WARN_ON(!map->bus); 1490 1490 1491 - /* Check for unwritable registers before we start */ 1492 - for (i = 0; i < val_len / map->format.val_bytes; i++) 1493 - if (!regmap_writeable(map, 1494 - reg + regmap_get_offset(map, i))) 1495 - return -EINVAL; 1491 + /* Check for unwritable or noinc registers in range 1492 + * before we start 1493 + */ 1494 + if (!regmap_writeable_noinc(map, reg)) { 1495 + for (i = 0; i < val_len / map->format.val_bytes; i++) { 1496 + unsigned int element = 1497 + reg + regmap_get_offset(map, i); 1498 + if (!regmap_writeable(map, element) || 1499 + regmap_writeable_noinc(map, element)) 1500 + return -EINVAL; 1501 + } 1502 + } 1496 1503 1497 1504 if (!map->cache_bypass && map->format.parse_val) { 1498 1505 unsigned int ival;