dm: regmap: Fix mask in regmap_update_bits()
authorSimon Glass <sjg@chromium.org>
Fri, 11 Oct 2019 22:16:49 +0000 (16:16 -0600)
committerSimon Glass <sjg@chromium.org>
Sun, 27 Oct 2019 16:56:41 +0000 (10:56 -0600)
This function assumes that the 'val' parameter has no masked bits set.
This is not defined by the function prototype though. Fix the function to
mask the value and update the documentation.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
drivers/core/regmap.c
include/regmap.h

index d1d12eef385f5757bd327cb01d2027bbe3bfb662..e9e55c9d165cb8ed2f5999b8928060d8f49c72b2 100644 (file)
@@ -462,5 +462,5 @@ int regmap_update_bits(struct regmap *map, uint offset, uint mask, uint val)
 
        reg &= ~mask;
 
-       return regmap_write(map, offset, reg | val);
+       return regmap_write(map, offset, reg | (val & mask));
 }
index 0854200a9c162811a96b47e3d14f6e0779b3121c..9ada1af5ef047acc5be4abf383aae8596ac6093a 100644 (file)
@@ -295,7 +295,8 @@ int regmap_raw_read_range(struct regmap *map, uint range_num, uint offset,
  * @map:       The map returned by regmap_init_mem*()
  * @offset:    Offset of the memory
  * @mask:      Mask to apply to the read value
- * @val:       Value to apply to the value to write
+ * @val:       Value to OR with the read value after masking. Note that any
+ *     bits set in @val which are not set in @mask are ignored
  * Return: 0 if OK, -ve on error
  */
 int regmap_update_bits(struct regmap *map, uint offset, uint mask, uint val);