Hi Simon, On Thu, Aug 2, 2018 at 2:20 PM, Simon Glass <s...@chromium.org> wrote: > Hi Mario, > > On 31 July 2018 at 04:01, Mario Six <mario....@gdsys.cc> wrote: >> The regmap functions currently assume that all register map accesses >> have a data width of 32 bits, but there are maps that have different >> widths. >> >> To rectify this, implement the regmap_raw_read and regmap_raw_write >> functions from the Linux kernel API that specify the width of a desired >> read or write operation on a regmap. >> >> Implement the regmap_read and regmap_write functions using these raw >> functions in a backwards-compatible manner. >> >> Signed-off-by: Mario Six <mario....@gdsys.cc> >> --- >> >> v2 -> v3: >> * Implement the "raw" functions from Linux instead of adding a size >> parameter to the regmap_{read,write} functions >> * Fixed style violation >> * Improved error handling >> >> v1 -> v2: >> New in v2 >> >> --- >> drivers/core/regmap.c | 54 >> ++++++++++++++++++++++++++++++++++++++++++++------- >> include/regmap.h | 40 ++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 87 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c >> index 3488361ee14..83ca19a08a4 100644 >> --- a/drivers/core/regmap.c >> +++ b/drivers/core/regmap.c >> @@ -188,22 +188,62 @@ int regmap_uninit(struct regmap *map) >> return 0; >> } >> >> +int regmap_raw_read(struct regmap *map, uint offset, void *valp, size_t >> val_len) >> +{ >> + void *ptr; >> + >> + ptr = map_physmem(map->ranges[0] + offset, val_len, MAP_NOCACHE); >> + >> + switch (val_len) { >> + case REGMAP_SIZE_8: >> + *((u8 *)valp) = in_8((u8 *)ptr); >> + break; >> + case REGMAP_SIZE_16: >> + *((u16 *)valp) = in_le16((u16 *)ptr); >> + break; >> + case REGMAP_SIZE_32: >> + *((u32 *)valp) = in_le32((u32 *)ptr); >> + break; >> + default: >> + debug("%s: regmap size %u unknown\n", __func__, val_len); >> + return -EINVAL; >> + } >> + return 0; >> +} >> + >> int regmap_read(struct regmap *map, uint offset, uint *valp) >> { >> - u32 *ptr = map_physmem(map->ranges[0].start + offset, 4, >> MAP_NOCACHE); >> + return regmap_raw_read(map, offset, valp, REGMAP_SIZE_32); >> +} >> >> - *valp = le32_to_cpu(readl(ptr)); >> +int regmap_raw_write(struct regmap *map, uint offset, const void *val, >> + size_t val_len) >> +{ >> + void *ptr; >> + >> + ptr = map_physmem(map->ranges[0] + offset, val_len, MAP_NOCACHE); >> + >> + switch (val_len) { >> + case REGMAP_SIZE_8: >> + out_8((u8 *)ptr, *((u8 *)val)); >> + break; >> + case REGMAP_SIZE_16: >> + out_le16((u16 *)ptr, *((u16 *)val)); >> + break; >> + case REGMAP_SIZE_32: >> + out_le32((u32 *)ptr, *((u32 *)val)); >> + break; >> + default: >> + debug("%s: regmap size %u unknown\n", __func__, val_len); >> + return -EINVAL; >> + } >> >> return 0; >> } >> >> int regmap_write(struct regmap *map, uint offset, uint val) >> { >> - u32 *ptr = map_physmem(map->ranges[0].start + offset, 4, >> MAP_NOCACHE); >> - >> - writel(cpu_to_le32(val), ptr); >> - >> - return 0; >> + return regmap_raw_write(map, offset, &val, REGMAP_SIZE_32); >> } >> >> int regmap_update_bits(struct regmap *map, uint offset, uint mask, uint val) >> diff --git a/include/regmap.h b/include/regmap.h >> index 32f75e06f59..352851c715b 100644 >> --- a/include/regmap.h >> +++ b/include/regmap.h >> @@ -8,6 +8,19 @@ >> #define __REGMAP_H >> >> /** >> + * enum regmap_size_t - Access sizes for fpgamap reads and writes >> + * >> + * @REGMAP_SIZE_8: 8-bit read/write access size >> + * @REGMAP_SIZE_16: 16-bit read/write access size >> + * @REGMAP_SIZE_32: 32-bit read/write access size >> + */ >> +enum regmap_size_t { >> + REGMAP_SIZE_8 = 1, >> + REGMAP_SIZE_16 = 2, >> + REGMAP_SIZE_32 = 4, >> +}; >> + >> +/** >> * struct regmap_range - a register map range >> * >> * @start: Start address >> @@ -57,6 +70,33 @@ int regmap_write(struct regmap *map, uint offset, uint >> val); >> */ >> int regmap_read(struct regmap *map, uint offset, uint *valp); >> >> +/** >> + * regmap_raw_write() - Write a value of specified length to a regmap >> + * > > Please explain the meaning of 'raw' here. Also please update the > non-raw ones to explain that meaning. >
OK, I'll explain the difference in v4. >> + * @map: Regmap to write to >> + * @offset: Offset in the regmap to write to >> + * @val: Value to write to the regmap at the specified offset >> + * @val_len: Length of the data to be written to the regmap >> + * >> + * Return: 0 if OK, -ve on error >> + */ >> +int regmap_raw_write(struct regmap *map, uint offset, const void *val, >> + size_t val_len); >> + >> +/** >> + * regmap_raw_read() - Read a value of specified length from a regmap >> + * > > Same here > Dito. >> + * @map: Regmap to read from >> + * @offset: Offset in the regmap to read from >> + * @valp: Pointer to the buffer to receive the data read from the >> regmap >> + * at the specified offset >> + * @val_len: Length of the data to be read from the regmap >> + * >> + * Return: 0 if OK, -ve on error >> + */ >> +int regmap_raw_read(struct regmap *map, uint offset, void *valp, >> + size_t val_len); >> + >> #define regmap_write32(map, ptr, member, val) \ >> regmap_write(map, (uint32_t *)(ptr)->member - (uint32_t *)(ptr), val) >> >> -- >> 2.11.0 >> Best regards, Mario _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot