12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- From 02d6fdecb9c38de19065f6bed8d5214556fd061d Mon Sep 17 00:00:00 2001
- From: Ansuel Smith <[email protected]>
- Date: Thu, 4 Nov 2021 16:00:40 +0100
- Subject: regmap: allow to define reg_update_bits for no bus configuration
- Some device requires a special handling for reg_update_bits and can't use
- the normal regmap read write logic. An example is when locking is
- handled by the device and rmw operations requires to do atomic operations.
- Allow to declare a dedicated function in regmap_config for
- reg_update_bits in no bus configuration.
- Signed-off-by: Ansuel Smith <[email protected]>
- Link: https://lore.kernel.org/r/[email protected]
- Signed-off-by: Mark Brown <[email protected]>
- ---
- drivers/base/regmap/regmap.c | 1 +
- include/linux/regmap.h | 7 +++++++
- 2 files changed, 8 insertions(+)
- --- a/drivers/base/regmap/regmap.c
- +++ b/drivers/base/regmap/regmap.c
- @@ -877,6 +877,7 @@ struct regmap *__regmap_init(struct devi
- if (!bus) {
- map->reg_read = config->reg_read;
- map->reg_write = config->reg_write;
- + map->reg_update_bits = config->reg_update_bits;
-
- map->defer_caching = false;
- goto skip_format_initialization;
- --- a/include/linux/regmap.h
- +++ b/include/linux/regmap.h
- @@ -290,6 +290,11 @@ typedef void (*regmap_unlock)(void *);
- * read operation on a bus such as SPI, I2C, etc. Most of the
- * devices do not need this.
- * @reg_write: Same as above for writing.
- + * @reg_update_bits: Optional callback that if filled will be used to perform
- + * all the update_bits(rmw) operation. Should only be provided
- + * if the function require special handling with lock and reg
- + * handling and the operation cannot be represented as a simple
- + * update_bits operation on a bus such as SPI, I2C, etc.
- * @fast_io: Register IO is fast. Use a spinlock instead of a mutex
- * to perform locking. This field is ignored if custom lock/unlock
- * functions are used (see fields lock/unlock of struct regmap_config).
- @@ -372,6 +377,8 @@ struct regmap_config {
-
- int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
- int (*reg_write)(void *context, unsigned int reg, unsigned int val);
- + int (*reg_update_bits)(void *context, unsigned int reg,
- + unsigned int mask, unsigned int val);
-
- bool fast_io;
-
|