aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPratyush Yadav2020-09-24 10:04:15 +0530
committerTom Rini2020-09-30 11:55:22 -0400
commitd8babb9598ce237ffb1feccb576c66a21c52e5f7 (patch)
tree24983e341b4a5303ef72f3f533bd7e746a4f32b0
parent0e01a7c3f4b6a42f768a19f7fc1df92d3e3b5d37 (diff)
regmap: Allow devices to specify regmap range start and size in config
Some devices need to calculate the regmap base address at runtime. This makes it impossible to use device tree to get the regmap base. Instead, allow devices to specify it in the regmap config. This will create a regmap with a single range that corresponds to the start and size given by the driver. Signed-off-by: Pratyush Yadav <p.yadav@ti.com> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--drivers/core/regmap.c6
-rw-r--r--include/regmap.h6
2 files changed, 11 insertions, 1 deletions
diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c
index a9087df32b9..a3da0cf7c3f 100644
--- a/drivers/core/regmap.c
+++ b/drivers/core/regmap.c
@@ -283,7 +283,11 @@ struct regmap *devm_regmap_init(struct udevice *dev,
if (unlikely(!mapp))
return ERR_PTR(-ENOMEM);
- rc = regmap_init_mem(dev_ofnode(dev), mapp);
+ if (config && config->r_size != 0)
+ rc = regmap_init_mem_range(dev_ofnode(dev), config->r_start,
+ config->r_size, mapp);
+ else
+ rc = regmap_init_mem(dev_ofnode(dev), mapp);
if (rc)
return ERR_PTR(rc);
diff --git a/include/regmap.h b/include/regmap.h
index 7c8ad047599..7a6fcc7f53b 100644
--- a/include/regmap.h
+++ b/include/regmap.h
@@ -84,10 +84,16 @@ struct regmap_bus;
* REGMAP_SIZE_32 if set to 0.
* @reg_offset_shift Left shift the register offset by this value before
* performing read or write.
+ * @r_start: If specified, the regmap is created with one range
+ * which starts at this address, instead of finding the
+ * start from device tree.
+ * @r_size: Same as above for the range size
*/
struct regmap_config {
enum regmap_size_t width;
u32 reg_offset_shift;
+ ulong r_start;
+ ulong r_size;
};
/**