Merge tag 'v3.8-rc7' into regulator-core
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / regulator / core.c
index 278584302f2d162c56599ad61a62ade3cdcceadd..abd3a05e8ee24c9ae51811d6aea8cfd58bbcf116 100644 (file)
@@ -2229,8 +2229,11 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
                        best_val = rdev->desc->ops->list_voltage(rdev, ret);
                        if (min_uV <= best_val && max_uV >= best_val) {
                                selector = ret;
-                               ret = rdev->desc->ops->set_voltage_sel(rdev,
-                                                                      ret);
+                               if (old_selector == selector)
+                                       ret = 0;
+                               else
+                                       ret = rdev->desc->ops->set_voltage_sel(
+                                                               rdev, ret);
                        } else {
                                ret = -EINVAL;
                        }
@@ -2241,7 +2244,7 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
 
        /* Call set_voltage_time_sel if successfully obtained old_selector */
        if (ret == 0 && _regulator_is_enabled(rdev) && old_selector >= 0 &&
-           rdev->desc->ops->set_voltage_time_sel) {
+           old_selector != selector && rdev->desc->ops->set_voltage_time_sel) {
 
                delay = rdev->desc->ops->set_voltage_time_sel(rdev,
                                                old_selector, selector);
@@ -2294,6 +2297,7 @@ int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)
 {
        struct regulator_dev *rdev = regulator->rdev;
        int ret = 0;
+       int old_min_uV, old_max_uV;
 
        mutex_lock(&rdev->mutex);
 
@@ -2315,18 +2319,29 @@ int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)
        ret = regulator_check_voltage(rdev, &min_uV, &max_uV);
        if (ret < 0)
                goto out;
+       
+       /* restore original values in case of error */
+       old_min_uV = regulator->min_uV;
+       old_max_uV = regulator->max_uV;
        regulator->min_uV = min_uV;
        regulator->max_uV = max_uV;
 
        ret = regulator_check_consumers(rdev, &min_uV, &max_uV);
        if (ret < 0)
-               goto out;
+               goto out2;
 
        ret = _regulator_do_set_voltage(rdev, min_uV, max_uV);
-
+       if (ret < 0)
+               goto out2;
+       
 out:
        mutex_unlock(&rdev->mutex);
        return ret;
+out2:
+       regulator->min_uV = old_min_uV;
+       regulator->max_uV = old_max_uV;
+       mutex_unlock(&rdev->mutex);
+       return ret;
 }
 EXPORT_SYMBOL_GPL(regulator_set_voltage);