struct regmap::max_register is in units of struct regmap::reg_stride. To get the total number or registers, we need to divide by reg_stride before adding one, but we ended up adding one before division. regmap_size_bytes() is currently only used for sizing the cdev and rendered the last element of the cdev inaccessible. Fixes: 7a53e162de2a ("Add initial regmap support") Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/base/regmap/regmap.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 4d896c677b28..7ad527954c43 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -412,10 +412,34 @@ static struct cdev_operations regmap_fops = { .write = regmap_cdev_write, }; +/* + * regmap_count_registers - returns the total number of registers + * + * @map: The map + * + * Returns the total number of registers in a regmap + */ +static size_t regmap_count_registers(struct regmap *map) +{ + /* + * max_register is in units of reg_stride, so we need to divide + * by the register stride before adding one to arrive at the + * total number of registers. + */ + return (map->max_register / map->reg_stride) + 1; +} + +/* + * regmap_size_bytes - computes the size of the regmap in bytes + * + * @map: The map + * + * Returns the number of bytes needed to hold all values in the + * regmap. + */ size_t regmap_size_bytes(struct regmap *map) { - return regmap_round_val_bytes(map) * (map->max_register + 1) / - map->reg_stride; + return regmap_round_val_bytes(map) * regmap_count_registers(map); } /* -- 2.39.2