Commit f4223ec2 authored by David Brownell's avatar David Brownell Committed by Tony Lindgren

Overo broken after recent mainline merge

Make the regulator setup code simpler and more consistent:

 - The only difference between "boot_on" and "always_on" is
   that an "always_on" regulator won't be disabled.  Both will
   be active (and usecount will be 1) on return from setup.

 - Regulators not marked as "boot_on" or "always_on" won't
   be active (and usecount will be 0) on return from setup.

The exception to that simple policy is when there's a non-Linux
interface to the regulator ... e.g. if either a DSP or the CPU
running Linux can enable the regulator, and the DSP needs it to
be on, then it will be on.
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 51b50f42
...@@ -711,6 +711,7 @@ static int set_machine_constraints(struct regulator_dev *rdev, ...@@ -711,6 +711,7 @@ static int set_machine_constraints(struct regulator_dev *rdev,
int ret = 0; int ret = 0;
const char *name; const char *name;
struct regulator_ops *ops = rdev->desc->ops; struct regulator_ops *ops = rdev->desc->ops;
int enable = 0;
if (constraints->name) if (constraints->name)
name = constraints->name; name = constraints->name;
...@@ -799,10 +800,6 @@ static int set_machine_constraints(struct regulator_dev *rdev, ...@@ -799,10 +800,6 @@ static int set_machine_constraints(struct regulator_dev *rdev,
} }
} }
/* are we enabled at boot time by firmware / bootloader */
if (rdev->constraints->boot_on)
rdev->use_count = 1;
/* do we need to setup our suspend state */ /* do we need to setup our suspend state */
if (constraints->initial_state) { if (constraints->initial_state) {
ret = suspend_prepare(rdev, constraints->initial_state); ret = suspend_prepare(rdev, constraints->initial_state);
...@@ -814,20 +811,38 @@ static int set_machine_constraints(struct regulator_dev *rdev, ...@@ -814,20 +811,38 @@ static int set_machine_constraints(struct regulator_dev *rdev,
} }
} }
/* if always_on is set then turn the regulator on if it's not /* Should this be enabled when we return from here? The difference
* already on. */ * between "boot_on" and "always_on" is that "always_on" regulators
if (constraints->always_on && ops->enable && * won't ever be disabled.
((ops->is_enabled && !ops->is_enabled(rdev)) || */
(!ops->is_enabled && !constraints->boot_on))) { if (constraints->boot_on || constraints->always_on)
enable = 1;
/* Make sure the regulator isn't wrongly enabled or disabled.
* Bootloaders are often sloppy about leaving things on; and
* sometimes Linux wants to use a different model.
*/
if (enable) {
if (ops->enable) {
ret = ops->enable(rdev); ret = ops->enable(rdev);
if (ret < 0) { if (ret < 0)
printk(KERN_ERR "%s: failed to enable %s\n", pr_warning("%s: %s disable --> %d\n",
__func__, name); __func__, name, ret);
rdev->constraints = NULL; }
goto out; if (ret >= 0)
rdev->use_count = 1;
} else {
if (ops->disable) {
ret = ops->disable(rdev);
if (ret < 0)
pr_warning("%s: %s disable --> %d\n",
__func__, name, ret);
} }
} }
if (ret < 0)
rdev->constraints = NULL;
else
print_constraints(rdev); print_constraints(rdev);
out: out:
return ret; return ret;
......
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