Add code implementing a simple version of regmap_write_bits(). Signed-off-by: Andrey Smirnov <andrew.smirnov@xxxxxxxxx> --- drivers/base/regmap/regmap.c | 27 +++++++++++++++++++++++++++ include/regmap.h | 6 +++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index a042a1a..52b7d88 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -137,6 +137,33 @@ int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val) } /** + * regmap_write_bits - write bits of a register in a map + * + * @map: The map + * @reg: The register offset of the register + * @mask: Mask indicating bits to be modified + * (1 - modified, 0 - untouched) + * @val: Bit value to be set + * + * Returns 0 for success or negative error code on failure + */ +int regmap_write_bits(struct regmap *map, unsigned int reg, + unsigned int mask, unsigned int val) +{ + int ret; + unsigned int tmp, orig; + + ret = regmap_read(map, reg, &orig); + if (ret != 0) + return ret; + + tmp = orig & ~mask; + tmp |= val & mask; + + return regmap_write(map, reg, tmp); +} + +/** * regmap_bulk_read(): Read data from the device * * @map: Register map to read from diff --git a/include/regmap.h b/include/regmap.h index bcbe6c1..9675a17 100644 --- a/include/regmap.h +++ b/include/regmap.h @@ -60,4 +60,8 @@ int regmap_get_val_bytes(struct regmap *map); int regmap_get_max_register(struct regmap *map); int regmap_get_reg_stride(struct regmap *map); -#endif /* __REGMAP_H */ \ No newline at end of file +int regmap_write_bits(struct regmap *map, unsigned int reg, + unsigned int mask, unsigned int val); + + +#endif /* __REGMAP_H */ -- 2.5.5 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox