[U-Boot] [PATCH v2 2/5] regmap: Support reading from specific range
Mario Six
mario.six at gdsys.cc
Fri May 4 07:19:58 UTC 2018
Hi Simon,
On Thu, May 3, 2018 at 4:33 AM, Simon Glass <sjg at chromium.org> wrote:
> Hi Mario,
>
> On 27 April 2018 at 06:52, Mario Six <mario.six at gdsys.cc> wrote:
>>
>> It is useful to be able to treat the different ranges of a regmap
>> separately to be able to use distinct offset for them, but this is
>> currently not implemented in the regmap API.
>>
>> To preserve backwards compatibility, add regmap_read_ext and
>> regmap_write_ext functions that take an additional parameter 'range_num'
>> that identifies the range to operate on.
>>
>> Signed-off-by: Mario Six <mario.six at gdsys.cc>
>> ---
>>
>> v1 -> v2:
>> New in v2
>>
>> ---
>> drivers/core/regmap.c | 69 +++++++++++++++++++++++++++++++++++++++------------
>> include/regmap.h | 2 ++
>> 2 files changed, 55 insertions(+), 16 deletions(-)
>>
>
> Reviewed-by: Simon Glass <sjg at chromium.org>
>
>
>> diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c
>> index c2cdff3979..80718b3820 100644
>> --- a/drivers/core/regmap.c
>> +++ b/drivers/core/regmap.c
>> @@ -130,47 +130,84 @@ int regmap_uninit(struct regmap *map)
>> return 0;
>> }
>>
>> -int regmap_read(struct regmap *map, ulong offset, ulong *valp,
>> - enum regmap_size_t size)
>> +int regmap_read_ext(struct regmap *map, uint range_num, ulong offset,
>> + ulong *valp, enum regmap_size_t size)
>
> How about regmap_read_range() ?
>
Yes, sounds more descriptive. Will change for v3.
>> {
>> + struct regmap_range *range;
>> void *ptr;
>>
>> + if (range_num >= map->range_count)
>> + return 0;
>> + range = &map->range[range_num];
>> +
>> + ptr = map_physmem(range->start + offset, size, MAP_NOCACHE);
>> +
>> + if (offset + size > range->size) {
>> + debug("%s: offset/size combination invalid\n", __func__);
>> + return -EINVAL;
>> + }
>> +
>> switch (size) {
>> case REGMAP_SIZE_8:
>> - ptr = map_physmem(map->base + offset, 1, MAP_NOCACHE);
>> - *valp = readb(ptr);
>> + *((u8 *)valp) = readb((u8 *)ptr);
>> break;
>> case REGMAP_SIZE_16:
>> - ptr = map_physmem(map->base + offset, 2, MAP_NOCACHE);
>> - *valp = le16_to_cpu(readw(ptr));
>> + *((u16 *)valp) = readw((u16 *)ptr);
>> break;
>> case REGMAP_SIZE_32:
>> - ptr = map_physmem(map->base + offset, 4, MAP_NOCACHE);
>> - *valp = le32_to_cpu(readl(ptr));
>> + *((u32 *)valp) = readl((u32 *)ptr);
>> break;
>> + default:
>> + debug("%s: size %d not supported\n", __func__, size);
>> + return -ENOTSUPP;
>> }
>> +
>> return 0;
>> }
>>
>> -int regmap_write(struct regmap *map, ulong offset, ulong val,
>> - enum regmap_size_t size)
>> +int regmap_read(struct regmap *map, ulong offset, ulong *valp,
>> + enum regmap_size_t size)
>> {
>> + return regmap_read_ext(map, 0, offset, valp, size);
>> +}
>> +
>> +int regmap_write_ext(struct regmap *map, uint range_num, ulong offset,
>> + ulong val, enum regmap_size_t size)
>> +{
>> + struct regmap_range *range;
>> void *ptr;
>>
>> + if (range_num >= map->range_count)
>> + return 0;
>> + range = &map->range[range_num];
>> +
>> + ptr = map_physmem(range->start + offset, size, MAP_NOCACHE);
>> +
>> + if (offset + size > range->size) {
>> + debug("%s: offset/size combination invalid\n", __func__);
>> + return -EINVAL;
>> + }
>> +
>> switch (size) {
>> case REGMAP_SIZE_8:
>> - ptr = map_physmem(map->base + offset, 1, MAP_NOCACHE);
>> - writel((u8)val, ptr);
>> + writeb((u8)val, (u8 *)ptr);
>> break;
>> case REGMAP_SIZE_16:
>> - ptr = map_physmem(map->base + offset, 2, MAP_NOCACHE);
>> - writel(cpu_to_le16((u16)val), ptr);
>> + out_le16((u16 *)ptr, (u16)val);
>> break;
>> case REGMAP_SIZE_32:
>> - ptr = map_physmem(map->base + offset, 4, MAP_NOCACHE);
>> - writel(cpu_to_le32((u32)val), ptr);
>> + writel((u32)val, (u32 *)ptr);
>> break;
>> + default:
>> + debug("%s: size %d not supported\n", __func__, size);
>> + return -ENOTSUPP;
>> }
>>
>> return 0;
>> }
>> +
>> +int regmap_write(struct regmap *map, ulong offset, ulong val,
>> + enum regmap_size_t size)
>> +{
>> + return regmap_write_ext(map, 0, offset, val, size);
>> +}
>> diff --git a/include/regmap.h b/include/regmap.h
>> index a6e2fafd27..bb7e947ce2 100644
>> --- a/include/regmap.h
>> +++ b/include/regmap.h
>> @@ -44,7 +44,9 @@ struct regmap {
>> * Interface to provide access to registers either through a direct memory
>> * bus or through a peripheral bus like I2C, SPI.
>> */
>> +int regmap_write_ext(struct regmap *map, uint range_num, ulong offset, ulong val, enum regmap_size_t size);
>> int regmap_write(struct regmap *map, ulong offset, ulong val, enum regmap_size_t size);
>> +int regmap_read_ext(struct regmap *map, uint range_num, ulong offset, ulong *valp, enum regmap_size_t size);
>> int regmap_read(struct regmap *map, ulong offset, ulong *valp, enum regmap_size_t size);
>
> Can you please add full function comments?
>
OK, will be documented in v3.
>>
>> #define regmap_write32(map, ptr, member, val) \
>> --
>> 2.16.1
>>
>
> Regards,
> Simon
Best regards,
Mario
More information about the U-Boot
mailing list