Unverified Commit 02d6fdec authored by Ansuel Smith's avatar Ansuel Smith Committed by Mark Brown
Browse files

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: default avatarAnsuel Smith <ansuelsmth@gmail.com>
Link: https://lore.kernel.org/r/20211104150040.1260-1-ansuelsmth@gmail.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent fa55b7dc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -876,6 +876,7 @@ struct regmap *__regmap_init(struct device *dev,
	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;
+7 −0
Original line number Diff line number Diff line
@@ -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;