]> Git Repo - linux.git/commitdiff
Merge remote-tracking branch 'regulator/topic/gpio' into regulator-next
authorMark Brown <[email protected]>
Tue, 19 Feb 2013 12:42:34 +0000 (12:42 +0000)
committerMark Brown <[email protected]>
Tue, 19 Feb 2013 12:42:34 +0000 (12:42 +0000)
1  2 
drivers/regulator/core.c

diff --combined drivers/regulator/core.c
index 98a6ec3240e49da3cd42ebe17764c57def7b6805,6b3550ab480f8e13c0fda35ea7033dd78228200f..da9782bd27d0a182d32578c4779481072d0657ef
@@@ -200,8 -200,8 +200,8 @@@ static int regulator_check_consumers(st
        }
  
        if (*min_uV > *max_uV) {
 -              dev_err(regulator->dev, "Restricting voltage, %u-%uuV\n",
 -                      regulator->min_uV, regulator->max_uV);
 +              rdev_err(rdev, "Restricting voltage, %u-%uuV\n",
 +                      *min_uV, *max_uV);
                return -EINVAL;
        }
  
@@@ -2080,20 -2080,10 +2080,20 @@@ EXPORT_SYMBOL_GPL(regulator_get_voltage
   */
  int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel)
  {
 +      int ret;
 +
        sel <<= ffs(rdev->desc->vsel_mask) - 1;
  
 -      return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
 +      ret = regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
                                  rdev->desc->vsel_mask, sel);
 +      if (ret)
 +              return ret;
 +
 +      if (rdev->desc->apply_bit)
 +              ret = regmap_update_bits(rdev->regmap, rdev->desc->apply_reg,
 +                                       rdev->desc->apply_bit,
 +                                       rdev->desc->apply_bit);
 +      return ret;
  }
  EXPORT_SYMBOL_GPL(regulator_set_voltage_sel_regmap);
  
@@@ -2239,11 -2229,8 +2239,11 @@@ static int _regulator_do_set_voltage(st
                        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;
                        }
  
        /* 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);
@@@ -2307,7 -2294,6 +2307,7 @@@ int regulator_set_voltage(struct regula
  {
        struct regulator_dev *rdev = regulator->rdev;
        int ret = 0;
 +      int old_min_uV, old_max_uV;
  
        mutex_lock(&rdev->mutex);
  
        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);
  
@@@ -3233,7 -3208,7 +3233,7 @@@ static int add_regulator_attributes(str
                if (status < 0)
                        return status;
        }
-       if (ops->is_enabled) {
+       if (rdev->ena_gpio || ops->is_enabled) {
                status = device_create_file(dev, &dev_attr_state);
                if (status < 0)
                        return status;
This page took 0.080053 seconds and 4 git commands to generate.