aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/base/regmap/regmap.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index e533368e5598..10ecbba32e10 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -583,18 +583,19 @@ int regmap_update_bits(struct regmap *map, unsigned int reg,
583 unsigned int mask, unsigned int val) 583 unsigned int mask, unsigned int val)
584{ 584{
585 int ret; 585 int ret;
586 unsigned int tmp; 586 unsigned int tmp, orig;
587 587
588 mutex_lock(&map->lock); 588 mutex_lock(&map->lock);
589 589
590 ret = _regmap_read(map, reg, &tmp); 590 ret = _regmap_read(map, reg, &orig);
591 if (ret != 0) 591 if (ret != 0)
592 goto out; 592 goto out;
593 593
594 tmp &= ~mask; 594 tmp = orig & ~mask;
595 tmp |= val & mask; 595 tmp |= val & mask;
596 596
597 ret = _regmap_write(map, reg, tmp); 597 if (tmp != orig)
598 ret = _regmap_write(map, reg, tmp);
598 599
599out: 600out:
600 mutex_unlock(&map->lock); 601 mutex_unlock(&map->lock);