lkml.org 
[lkml]   [2021]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[RFC PATCH 5/5] Add parser for X_9 formats
Date
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 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
\
 
 \ /
  Last update: 2021-12-17 21:44    [W:0.072 / U:2.460 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site