aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-11-18 11:03:50 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-11-20 15:56:38 -0500
commitd91e8db2c3bbe8ef0e2f3e1a6ff5b31a8d53ef16 (patch)
tree2bcc299fa62738407b5e25483230f7249f0d016d /drivers/base
parent4c691664583ef6a91f9ed0e08a75fbd30a5ffd5c (diff)
regmap: Suppress noop writes in regmap_update_bits()
If the new register value is identical to the original one then suppress the write to the hardware in regmap_update_bits(), saving some I/O cost. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/base')
-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);