Commit 93878cd5 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'regulator/fix/constrain' and...

Merge remote-tracking branches 'regulator/fix/constrain' and 'regulator/fix/defer' into regulator-linus
...@@ -906,7 +906,8 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, ...@@ -906,7 +906,8 @@ static int machine_constraints_voltage(struct regulator_dev *rdev,
/* do we need to apply the constraint voltage */ /* do we need to apply the constraint voltage */
if (rdev->constraints->apply_uV && if (rdev->constraints->apply_uV &&
rdev->constraints->min_uV == rdev->constraints->max_uV) { rdev->constraints->min_uV && rdev->constraints->max_uV) {
int target_min, target_max;
int current_uV = _regulator_get_voltage(rdev); int current_uV = _regulator_get_voltage(rdev);
if (current_uV < 0) { if (current_uV < 0) {
rdev_err(rdev, rdev_err(rdev,
...@@ -914,15 +915,32 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, ...@@ -914,15 +915,32 @@ static int machine_constraints_voltage(struct regulator_dev *rdev,
current_uV); current_uV);
return current_uV; return current_uV;
} }
if (current_uV < rdev->constraints->min_uV ||
current_uV > rdev->constraints->max_uV) { /*
* If we're below the minimum voltage move up to the
* minimum voltage, if we're above the maximum voltage
* then move down to the maximum.
*/
target_min = current_uV;
target_max = current_uV;
if (current_uV < rdev->constraints->min_uV) {
target_min = rdev->constraints->min_uV;
target_max = rdev->constraints->min_uV;
}
if (current_uV > rdev->constraints->max_uV) {
target_min = rdev->constraints->max_uV;
target_max = rdev->constraints->max_uV;
}
if (target_min != current_uV || target_max != current_uV) {
ret = _regulator_do_set_voltage( ret = _regulator_do_set_voltage(
rdev, rdev->constraints->min_uV, rdev, target_min, target_max);
rdev->constraints->max_uV);
if (ret < 0) { if (ret < 0) {
rdev_err(rdev, rdev_err(rdev,
"failed to apply %duV constraint(%d)\n", "failed to apply %d-%duV constraint(%d)\n",
rdev->constraints->min_uV, ret); target_min, target_max, ret);
return ret; return ret;
} }
} }
...@@ -3829,6 +3847,11 @@ static void rdev_init_debugfs(struct regulator_dev *rdev) ...@@ -3829,6 +3847,11 @@ static void rdev_init_debugfs(struct regulator_dev *rdev)
&rdev->bypass_count); &rdev->bypass_count);
} }
static int regulator_register_resolve_supply(struct device *dev, void *data)
{
return regulator_resolve_supply(dev_to_rdev(dev));
}
/** /**
* regulator_register - register regulator * regulator_register - register regulator
* @regulator_desc: regulator to register * @regulator_desc: regulator to register
...@@ -3975,8 +3998,11 @@ regulator_register(const struct regulator_desc *regulator_desc, ...@@ -3975,8 +3998,11 @@ regulator_register(const struct regulator_desc *regulator_desc,
} }
rdev_init_debugfs(rdev); rdev_init_debugfs(rdev);
out:
mutex_unlock(&regulator_list_mutex); mutex_unlock(&regulator_list_mutex);
/* try to resolve regulators supply since a new one was registered */
class_for_each_device(&regulator_class, NULL, NULL,
regulator_register_resolve_supply);
kfree(config); kfree(config);
return rdev; return rdev;
...@@ -3987,15 +4013,16 @@ regulator_register(const struct regulator_desc *regulator_desc, ...@@ -3987,15 +4013,16 @@ regulator_register(const struct regulator_desc *regulator_desc,
regulator_ena_gpio_free(rdev); regulator_ena_gpio_free(rdev);
device_unregister(&rdev->dev); device_unregister(&rdev->dev);
/* device core frees rdev */ /* device core frees rdev */
rdev = ERR_PTR(ret);
goto out; goto out;
wash: wash:
regulator_ena_gpio_free(rdev); regulator_ena_gpio_free(rdev);
clean: clean:
kfree(rdev); kfree(rdev);
rdev = ERR_PTR(ret); out:
goto out; mutex_unlock(&regulator_list_mutex);
kfree(config);
return ERR_PTR(ret);
} }
EXPORT_SYMBOL_GPL(regulator_register); EXPORT_SYMBOL_GPL(regulator_register);
......
...@@ -45,9 +45,9 @@ static void of_get_regulation_constraints(struct device_node *np, ...@@ -45,9 +45,9 @@ static void of_get_regulation_constraints(struct device_node *np,
/* Voltage change possible? */ /* Voltage change possible? */
if (constraints->min_uV != constraints->max_uV) if (constraints->min_uV != constraints->max_uV)
constraints->valid_ops_mask |= REGULATOR_CHANGE_VOLTAGE; constraints->valid_ops_mask |= REGULATOR_CHANGE_VOLTAGE;
/* Only one voltage? Then make sure it's set. */
if (constraints->min_uV && constraints->max_uV && /* Do we have a voltage range, if so try to apply it? */
constraints->min_uV == constraints->max_uV) if (constraints->min_uV && constraints->max_uV)
constraints->apply_uV = true; constraints->apply_uV = true;
if (!of_property_read_u32(np, "regulator-microvolt-offset", &pval)) if (!of_property_read_u32(np, "regulator-microvolt-offset", &pval))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment