[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20211217201758.1743750-6-linuxkernel@fbautosys.co.uk>
Date: Fri, 17 Dec 2021 20:17:58 +0000
From: linuxkernel@...utosys.co.uk
To: linux-kernel@...r.kernel.org
Cc: broonie@...nel.org
Subject: [RFC PATCH 5/5] Add parser for X_9 formats
From: Christopher Tyerman <c.tyerman@...ebladeautomationsystems.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@...ebladeautomationsystems.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 ea1664fa4c60..3f105e4266b4 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -365,6 +365,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);
@@ -1047,6 +1080,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
Powered by blists - more mailing lists