Messages in this thread | | | Date | Sun, 29 Mar 2009 19:25:56 +0000 | From | Jonathan Cameron <> | Subject | Re: regulator: Add disable_on_boot flag to constraints. |
| |
Dear All,
I'd forgotten about this one until I tried to clean up a patch dependent on it.
Any more comments / requested changes?
If anyone wants this rebased against a current tree just ask. ( I don't think it ended up in any relevant trees. Sorry if I've just missed it!)
Thanks,
Jonathan > From: Jonathan Cameron <jic23@cam.ac.uk> > > regulator: Add disable_on_boot flag to constraints. > > Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk> > Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> > --- > Now based on voltage / for-next and with kernel doc > added. > > Not quite sure what trashed the previous patch, but > hopefully this one should work. > > Changes in response to Mark Browns comments. > > Patch changed to disable_on_boot for more flexibility. > This only really involved removing the check in the enable code > found in the previous patch. > > This is intended to allow the disabling of regulators during > registration. Typical use case is regulators that aren't > actually connected to anything. > > This is against a clean voltage for-next with Mark's > hoisting of struct regulator_dev patch applied. (not that > it materially changes this patch). > > drivers/regulator/core.c | 19 ++++++++++++++++++- > include/linux/regulator/machine.h | 9 ++++++--- > 2 files changed, 24 insertions(+), 4 deletions(-) > > diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c > index 0ed13c2..ea7caaf 100644 > --- a/drivers/regulator/core.c > +++ b/drivers/regulator/core.c > @@ -723,7 +723,14 @@ static int set_machine_constraints(struct regulator_dev *rdev, > goto out; > } > } > - > + /* Sanity check */ > + if (constraints->always_on && constraints->disable_on_boot) { > + printk(KERN_ERR "%s: always on and disable at boot both set for %s\n", > + __func__, name); > + rdev->constraints = NULL; > + ret = -EINVAL; > + goto out; > + } > /* if always_on is set then turn the regulator on if it's not > * already on. */ > if (constraints->always_on && ops->enable && > @@ -736,6 +743,16 @@ static int set_machine_constraints(struct regulator_dev *rdev, > rdev->constraints = NULL; > goto out; > } > + } else if (constraints->disable_on_boot && ops->disable && > + ((ops->is_enabled && ops->is_enabled(rdev)) || > + (!ops->is_enabled && constraints->boot_on))) { > + ret = ops->disable(rdev); > + if (ret < 0) { > + printk(KERN_ERR "%s: failed to disable %s\n", > + __func__, name); > + rdev->constraints = NULL; > + goto out; > + } > } > > print_constraints(rdev); > diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h > index 3794773..f7d01dd 100644 > --- a/include/linux/regulator/machine.h > +++ b/include/linux/regulator/machine.h > @@ -74,6 +74,8 @@ struct regulator_state { > * @always_on: Set if the regulator should never be disabled. > * @boot_on: Set if the regulator is enabled when the system is initially > * started. > + * @disable_on_boot: Set if the regulator should be disabled. Typically > + * for regulators that are not connected. > * @apply_uV: Apply the voltage constraint when initialising. > * > * @input_uV: Input voltage for regulator when supplied by another regulator. > @@ -112,9 +114,10 @@ struct regulation_constraints { > suspend_state_t initial_state; /* suspend state to set at init */ > > /* constriant flags */ > - unsigned always_on:1; /* regulator never off when system is on */ > - unsigned boot_on:1; /* bootloader/firmware enabled regulator */ > - unsigned apply_uV:1; /* apply uV constraint iff min == max */ > + unsigned always_on:1; /* regulator never off when system on */ > + unsigned boot_on:1; /* bootloader/firmware enabled reg */ > + unsigned disable_on_boot:1; /* regulator to be disabled at boot */ > + unsigned apply_uV:1; /* apply uV constraint iff min == max */ > }; > > /** >
| |