regmap: Allow left shifting register offset before access

Drivers can configure it to adjust the final read/write location.

Signed-off-by: Pratyush Yadav <p.yadav@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Pratyush Yadav 2020-09-24 10:04:13 +05:30 committed by Tom Rini
parent 78aaedba9f
commit 7aa5ddffe7
2 changed files with 11 additions and 1 deletions

View File

@ -261,8 +261,10 @@ struct regmap *devm_regmap_init(struct udevice *dev,
return ERR_PTR(rc);
map = *mapp;
if (config)
if (config) {
map->width = config->width;
map->reg_offset_shift = config->reg_offset_shift;
}
devres_add(dev, mapp);
return *mapp;
@ -349,6 +351,7 @@ int regmap_raw_read_range(struct regmap *map, uint range_num, uint offset,
}
range = &map->ranges[range_num];
offset <<= map->reg_offset_shift;
if (offset + val_len > range->size) {
debug("%s: offset/size combination invalid\n", __func__);
return -ERANGE;
@ -458,6 +461,7 @@ int regmap_raw_write_range(struct regmap *map, uint range_num, uint offset,
}
range = &map->ranges[range_num];
offset <<= map->reg_offset_shift;
if (offset + val_len > range->size) {
debug("%s: offset/size combination invalid\n", __func__);
return -ERANGE;

View File

@ -82,9 +82,12 @@ struct regmap_bus;
*
* @width: Width of the read/write operations. Defaults to
* REGMAP_SIZE_32 if set to 0.
* @reg_offset_shift Left shift the register offset by this value before
* performing read or write.
*/
struct regmap_config {
enum regmap_size_t width;
u32 reg_offset_shift;
};
/**
@ -92,12 +95,15 @@ struct regmap_config {
*
* @width: Width of the read/write operations. Defaults to
* REGMAP_SIZE_32 if set to 0.
* @reg_offset_shift Left shift the register offset by this value before
* performing read or write.
* @range_count: Number of ranges available within the map
* @ranges: Array of ranges
*/
struct regmap {
enum regmap_endianness_t endianness;
enum regmap_size_t width;
u32 reg_offset_shift;
int range_count;
struct regmap_range ranges[0];
};