[RFC PATCH 1/2] regmap: add regmap_reg_field_* APIs
From: Victor Chernyakin
Date: Wed Nov 04 2026 - 19:22:38 EST
These functions are equivalent to their regmap_field_* counterparts,
but allow working with reg_field directly, without having to
allocate and manage regmap_fields.
Signed-off-by: Victor Chernyakin <chernyakin.victor.j@xxxxxxxxxxx>
---
include/linux/regmap.h | 61 +++++++++++++++++++++++++++++++++++-------
1 file changed, 51 insertions(+), 10 deletions(-)
diff --git a/include/linux/regmap.h b/include/linux/regmap.h
index c8aebd148e08..b4131495d993 100644
--- a/include/linux/regmap.h
+++ b/include/linux/regmap.h
@@ -11,6 +11,7 @@
*/
+#include <linux/bitfield.h>
#include <linux/bug.h>
#include <linux/cleanup.h>
#include <linux/delay.h>
#include <linux/err.h>
@@ -1463,18 +1464,18 @@ struct reg_field {
unsigned int id_offset;
};
-#define REG_FIELD(_reg, _lsb, _msb) { \
- .reg = _reg, \
- .lsb = _lsb, \
- .msb = _msb, \
+#define REG_FIELD(_reg, _lsb, _msb) (struct reg_field){ \
+ .reg = _reg, \
+ .lsb = _lsb, \
+ .msb = _msb, \
}
-#define REG_FIELD_ID(_reg, _lsb, _msb, _size, _offset) { \
- .reg = _reg, \
- .lsb = _lsb, \
- .msb = _msb, \
- .id_size = _size, \
- .id_offset = _offset, \
+#define REG_FIELD_ID(_reg, _lsb, _msb, _size, _offset) (struct reg_field){ \
+ .reg = _reg, \
+ .lsb = _lsb, \
+ .msb = _msb, \
+ .id_size = _size, \
+ .id_offset = _offset, \
}
struct regmap_field *regmap_field_alloc(struct regmap *regmap,
@@ -1583,6 +1584,30 @@ regmap_fields_force_update_bits(struct regmap_field *field, unsigned int id,
NULL, false, true);
}
+static inline int
+regmap_reg_field_read(struct regmap *regmap, struct reg_field field,
+ unsigned int *val)
+{
+ int ret;
+
+ ret = regmap_read(regmap, field.reg, val);
+ if (ret)
+ return ret;
+
+ *val = field_get(GENMASK(field.msb, field.lsb), *val);
+
+ return ret;
+}
+
+static inline int
+regmap_reg_field_write(struct regmap *regmap, struct reg_field field,
+ unsigned int val)
+{
+ return regmap_update_bits(regmap, field.reg,
+ GENMASK(field.msb, field.lsb),
+ val << field.lsb);
+}
+
/**
* struct regmap_irq_type - IRQ type definitions.
*
@@ -2071,6 +2096,22 @@ regmap_fields_force_update_bits(struct regmap_field *field, unsigned int id,
return -EINVAL;
}
+static inline int
+regmap_reg_field_read(struct regmap *regmap, struct reg_field field,
+ unsigned int *val)
+{
+ WARN_ONCE(1, "regmap API is disabled");
+ return -EINVAL;
+}
+
+static inline int
+regmap_reg_field_write(struct regmap *regmap, struct reg_field field,
+ unsigned int val)
+{
+ WARN_ONCE(1, "regmap API is disabled");
+ return -EINVAL;
+}
+
static inline int regmap_get_val_bytes(struct regmap *map)
{
WARN_ONCE(1, "regmap API is disabled");
--
2.53.0