[PATCH master 1/7] regmap: fix calculation of regmap size when reg_stride != 1
Ahmad Fatoum
a.fatoum at pengutronix.de
Tue Jan 2 09:00:54 PST 2024
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 at pengutronix.de>
---
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
More information about the barebox
mailing list