Messages in this thread Patch in this message | | | From | linuxkernel@fbautosy ... | Subject | [RFC PATCH v2 5/5] Add parser for X_9 formats | Date | Wed, 22 Dec 2021 18:43:40 +0000 |
| |
From: Christopher Tyerman <c.tyerman@firebladeautomationsystems.co.uk>
added 9 bit Parser functions
these operate in same way as 16 bit parsers but mask out higher bits
regmap_parse_9_be() regmap_parse_9_be_inplace() regmap_parse_9_le() regmap_parse_9_le_inplace() regmap_parse_9_native()
modified: drivers/base/regmap/regmap.c
Signed-off-by: Christopher Tyerman <c.tyerman@firebladeautomationsystems.co.uk> --- drivers/base/regmap/regmap.c | 53 ++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 177f2010a490..40579975209a 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -370,6 +370,39 @@ static unsigned int regmap_parse_8(const void *buf) return b[0]; } +static unsigned int regmap_parse_9_be(const void *buf) +{ + return get_unaligned_be16(buf) & 0x1FF; +} + +static unsigned int regmap_parse_9_le(const void *buf) +{ + + return get_unaligned_le16(buf) & 0x1FF; +} + +static void regmap_parse_9_be_inplace(void *buf) +{ + u16 v = get_unaligned_be16(buf) & 0x1FF; + + memcpy(buf, &v, sizeof(v)); +} + +static void regmap_parse_9_le_inplace(void *buf) +{ + u16 v = get_unaligned_le16(buf) & 0x1FF; + + memcpy(buf, &v, sizeof(v)); +} + +static unsigned int regmap_parse_9_native(const void *buf) +{ + u16 v; + + memcpy(&v, buf, sizeof(v)); + return v & 0x1FF; +} + static unsigned int regmap_parse_16_be(const void *buf) { return get_unaligned_be16(buf); @@ -1052,6 +1085,26 @@ struct regmap *__regmap_init(struct device *dev, map->format.parse_val = regmap_parse_8; map->format.parse_inplace = regmap_parse_inplace_noop; break; + case 9: + switch (val_endian) { + case REGMAP_ENDIAN_BIG: + //map->format.format_val = regmap_format_9_be; + map->format.parse_val = regmap_parse_9_be; + map->format.parse_inplace = regmap_parse_9_be_inplace; + break; + case REGMAP_ENDIAN_LITTLE: + //map->format.format_val = regmap_format_9_le; + map->format.parse_val = regmap_parse_9_le; + map->format.parse_inplace = regmap_parse_9_le_inplace; + break; + case REGMAP_ENDIAN_NATIVE: + //map->format.format_val = regmap_format_9_native; + map->format.parse_val = regmap_parse_9_native; + break; + default: + goto err_hwlock; + } + break; case 16: switch (val_endian) { case REGMAP_ENDIAN_BIG: -- 2.25.1
| |