[PATCH 1/2] regmap: Allow a base register to be specified for the RAM regmap
From: Mark Brown
Date: Sun Aug 16 2026 - 18:13:43 EST
To allow testing of register maps with very large register values add
support for specifying base address to the RAM regmap.
Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
---
drivers/base/regmap/internal.h | 1 +
drivers/base/regmap/regmap-ram.c | 26 ++++++++++++++++++++------
2 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h
index 55273a6178f8..8176d91aacd1 100644
--- a/drivers/base/regmap/internal.h
+++ b/drivers/base/regmap/internal.h
@@ -322,6 +322,7 @@ static inline unsigned int regcache_get_index_by_order(const struct regmap *map,
}
struct regmap_ram_data {
+ unsigned int base_reg;
unsigned int *vals; /* Allocatd by caller */
bool *read;
bool *written;
diff --git a/drivers/base/regmap/regmap-ram.c b/drivers/base/regmap/regmap-ram.c
index c7356b0d8c83..a666bfb4d667 100644
--- a/drivers/base/regmap/regmap-ram.c
+++ b/drivers/base/regmap/regmap-ram.c
@@ -20,8 +20,11 @@ static int regmap_ram_write(void *context, unsigned int reg, unsigned int val)
{
struct regmap_ram_data *data = context;
- data->vals[reg] = val;
- data->written[reg] = true;
+ if (reg < data->base_reg)
+ return -EINVAL;
+
+ data->vals[reg - data->base_reg] = val;
+ data->written[reg - data->base_reg] = true;
return 0;
}
@@ -30,8 +33,11 @@ static int regmap_ram_read(void *context, unsigned int reg, unsigned int *val)
{
struct regmap_ram_data *data = context;
- *val = data->vals[reg];
- data->read[reg] = true;
+ if (reg < data->base_reg)
+ return -EINVAL;
+
+ *val = data->vals[reg - data->base_reg];
+ data->read[reg - data->base_reg] = true;
return 0;
}
@@ -60,17 +66,25 @@ struct regmap *__regmap_init_ram(struct device *dev,
const char *lock_name)
{
struct regmap *map;
+ unsigned int num_regs;
if (!config->max_register) {
pr_crit("No max_register specified for RAM regmap\n");
return ERR_PTR(-EINVAL);
}
- data->read = kzalloc_objs(bool, config->max_register + 1);
+ if (data->base_reg > config->max_register) {
+ pr_crit("base_reg above max_register for RAM regmap\n");
+ return ERR_PTR(-EINVAL);
+ }
+
+ num_regs = config->max_register - data->base_reg + 1;
+
+ data->read = kzalloc_objs(bool, num_regs);
if (!data->read)
return ERR_PTR(-ENOMEM);
- data->written = kzalloc_objs(bool, config->max_register + 1);
+ data->written = kzalloc_objs(bool, num_regs);
if (!data->written) {
kfree(data->read);
return ERR_PTR(-ENOMEM);
--
2.47.3