|
@@ -953,6 +953,8 @@ static int machine_constraints_current(struct regulator_dev *rdev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int _regulator_do_enable(struct regulator_dev *rdev);
|
|
|
+
|
|
|
/**
|
|
|
* set_machine_constraints - sets regulator constraints
|
|
|
* @rdev: regulator source
|
|
@@ -1013,10 +1015,9 @@ static int set_machine_constraints(struct regulator_dev *rdev,
|
|
|
/* If the constraints say the regulator should be on at this point
|
|
|
* and we have control then make sure it is enabled.
|
|
|
*/
|
|
|
- if ((rdev->constraints->always_on || rdev->constraints->boot_on) &&
|
|
|
- ops->enable) {
|
|
|
- ret = ops->enable(rdev);
|
|
|
- if (ret < 0) {
|
|
|
+ if (rdev->constraints->always_on || rdev->constraints->boot_on) {
|
|
|
+ ret = _regulator_do_enable(rdev);
|
|
|
+ if (ret < 0 && ret != -EINVAL) {
|
|
|
rdev_err(rdev, "failed to enable\n");
|
|
|
goto out;
|
|
|
}
|
|
@@ -1907,8 +1908,6 @@ static int _regulator_do_disable(struct regulator_dev *rdev)
|
|
|
|
|
|
trace_regulator_disable_complete(rdev_get_name(rdev));
|
|
|
|
|
|
- _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE,
|
|
|
- NULL);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1932,6 +1931,8 @@ static int _regulator_disable(struct regulator_dev *rdev)
|
|
|
rdev_err(rdev, "failed to disable\n");
|
|
|
return ret;
|
|
|
}
|
|
|
+ _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE,
|
|
|
+ NULL);
|
|
|
}
|
|
|
|
|
|
rdev->use_count = 0;
|
|
@@ -1984,20 +1985,16 @@ static int _regulator_force_disable(struct regulator_dev *rdev)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
|
|
|
- /* force disable */
|
|
|
- if (rdev->desc->ops->disable) {
|
|
|
- /* ah well, who wants to live forever... */
|
|
|
- ret = rdev->desc->ops->disable(rdev);
|
|
|
- if (ret < 0) {
|
|
|
- rdev_err(rdev, "failed to force disable\n");
|
|
|
- return ret;
|
|
|
- }
|
|
|
- /* notify other consumers that power has been forced off */
|
|
|
- _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE |
|
|
|
- REGULATOR_EVENT_DISABLE, NULL);
|
|
|
+ ret = _regulator_do_disable(rdev);
|
|
|
+ if (ret < 0) {
|
|
|
+ rdev_err(rdev, "failed to force disable\n");
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
- return ret;
|
|
|
+ _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE |
|
|
|
+ REGULATOR_EVENT_DISABLE, NULL);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -3630,23 +3627,18 @@ int regulator_suspend_finish(void)
|
|
|
|
|
|
mutex_lock(®ulator_list_mutex);
|
|
|
list_for_each_entry(rdev, ®ulator_list, list) {
|
|
|
- struct regulator_ops *ops = rdev->desc->ops;
|
|
|
-
|
|
|
mutex_lock(&rdev->mutex);
|
|
|
- if ((rdev->use_count > 0 || rdev->constraints->always_on) &&
|
|
|
- ops->enable) {
|
|
|
- error = ops->enable(rdev);
|
|
|
+ if (rdev->use_count > 0 || rdev->constraints->always_on) {
|
|
|
+ error = _regulator_do_enable(rdev);
|
|
|
if (error)
|
|
|
ret = error;
|
|
|
} else {
|
|
|
if (!have_full_constraints())
|
|
|
goto unlock;
|
|
|
- if (!ops->disable)
|
|
|
- goto unlock;
|
|
|
if (!_regulator_is_enabled(rdev))
|
|
|
goto unlock;
|
|
|
|
|
|
- error = ops->disable(rdev);
|
|
|
+ error = _regulator_do_disable(rdev);
|
|
|
if (error)
|
|
|
ret = error;
|
|
|
}
|
|
@@ -3820,7 +3812,7 @@ static int __init regulator_init_complete(void)
|
|
|
ops = rdev->desc->ops;
|
|
|
c = rdev->constraints;
|
|
|
|
|
|
- if (!ops->disable || (c && c->always_on))
|
|
|
+ if (c && c->always_on)
|
|
|
continue;
|
|
|
|
|
|
mutex_lock(&rdev->mutex);
|
|
@@ -3841,7 +3833,7 @@ static int __init regulator_init_complete(void)
|
|
|
/* We log since this may kill the system if it
|
|
|
* goes wrong. */
|
|
|
rdev_info(rdev, "disabling\n");
|
|
|
- ret = ops->disable(rdev);
|
|
|
+ ret = _regulator_do_disable(rdev);
|
|
|
if (ret != 0)
|
|
|
rdev_err(rdev, "couldn't disable: %d\n", ret);
|
|
|
} else {
|