summaryrefslogtreecommitdiffstats
path: root/drivers/regulator/core.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2010-12-16 15:49:37 +0000
committerLiam Girdwood <lrg@slimlogic.co.uk>2011-01-12 14:33:05 +0000
commit95a3c23ae620c1b4c499746e70f4034bdc067737 (patch)
treedb55c660ce1f3201135850510b11a09c1c16c221 /drivers/regulator/core.c
parent606a25628187ce863b48d43ca42bc0cbe8342de9 (diff)
downloadlinux-95a3c23ae620c1b4c499746e70f4034bdc067737.tar.gz
linux-95a3c23ae620c1b4c499746e70f4034bdc067737.tar.bz2
linux-95a3c23ae620c1b4c499746e70f4034bdc067737.zip
regulator: Optimise out noop voltage changes
If a consumer sets the same voltage range as is currently configured for that consumer there's no need to run through setting the voltage again. This pattern may occur with some CPUfreq implementations where the same voltage range is used for multiple frequencies. Reported-by: Saravana Kannan <skannan@codeaurora.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'drivers/regulator/core.c')
-rw-r--r--drivers/regulator/core.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index a12cba32460e..ab419f8b2a84 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1697,10 +1697,17 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)
{
struct regulator_dev *rdev = regulator->rdev;
- int ret;
+ int ret = 0;
mutex_lock(&rdev->mutex);
+ /* If we're setting the same range as last time the change
+ * should be a noop (some cpufreq implementations use the same
+ * voltage for multiple frequencies, for example).
+ */
+ if (regulator->min_uV == min_uV && regulator->max_uV == max_uV)
+ goto out;
+
/* sanity check */
if (!rdev->desc->ops->set_voltage &&
!rdev->desc->ops->set_voltage_sel) {