Commit 16e3f539 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'regulator-v3.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator

Pull regulator fixes from Mark Brown:
 "A couple of fixes here which ensure that regulators using the core
  support for GPIO enables work in all cases by ensuring that helpers
  are used consistently rather than open coding in places and hence not
  having GPIO support in some of them"

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