From: Mark Brown Date: Tue, 19 Feb 2013 12:42:34 +0000 (+0000) Subject: Merge remote-tracking branch 'regulator/topic/gpio' into regulator-next X-Git-Tag: v3.9-rc1~154^2~15 X-Git-Url: https://repo.jachan.dev/linux.git/commitdiff_plain/a4dba88e6311ac51ea4328fea6fd000dc2948ddb?hp=-c Merge remote-tracking branch 'regulator/topic/gpio' into regulator-next --- a4dba88e6311ac51ea4328fea6fd000dc2948ddb diff --combined drivers/regulator/core.c index 98a6ec3240e4,6b3550ab480f..da9782bd27d0 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@@ -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; } @@@ -2254,7 -2241,7 +2254,7 @@@ /* 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); @@@ -2329,29 -2315,18 +2329,29 @@@ 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;