Skip to content

Commit

Permalink
regulator: Factor out voltage constraint setup
Browse files Browse the repository at this point in the history
This allows constraints to take effect on regulators that support
voltage setting but for which the board does not specify a voltage
range (for example, because it is fixed correctly at system startup).

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
  • Loading branch information
Mark Brown authored and Liam Girdwood committed Dec 17, 2009
1 parent 5b30762 commit e79055d
Showing 1 changed file with 37 additions and 27 deletions.
64 changes: 37 additions & 27 deletions drivers/regulator/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -672,31 +672,11 @@ static void print_constraints(struct regulator_dev *rdev)
printk(KERN_INFO "regulator: %s: %s\n", rdev->desc->name, buf);
}

/**
* set_machine_constraints - sets regulator constraints
* @rdev: regulator source
* @constraints: constraints to apply
*
* Allows platform initialisation code to define and constrain
* regulator circuits e.g. valid voltage/current ranges, etc. NOTE:
* Constraints *must* be set by platform code in order for some
* regulator operations to proceed i.e. set_voltage, set_current_limit,
* set_mode.
*/
static int set_machine_constraints(struct regulator_dev *rdev,
struct regulation_constraints *constraints)
static int machine_constraints_voltage(struct regulator_dev *rdev,
const char *name, struct regulation_constraints *constraints)
{
int ret = 0;
const char *name;
struct regulator_ops *ops = rdev->desc->ops;

if (constraints->name)
name = constraints->name;
else if (rdev->desc->name)
name = rdev->desc->name;
else
name = "regulator";

/* constrain machine-level voltage specs to fit
* the actual range supported by this regulator.
*/
Expand All @@ -719,14 +699,13 @@ static int set_machine_constraints(struct regulator_dev *rdev,

/* voltage constraints are optional */
if ((cmin == 0) && (cmax == 0))
goto out;
return 0;

/* else require explicit machine-level constraints */
if (cmin <= 0 || cmax <= 0 || cmax < cmin) {
pr_err("%s: %s '%s' voltage constraints\n",
__func__, "invalid", name);
ret = -EINVAL;
goto out;
return -EINVAL;
}

/* initial: [cmin..cmax] valid, [min_uV..max_uV] not */
Expand All @@ -748,8 +727,7 @@ static int set_machine_constraints(struct regulator_dev *rdev,
if (max_uV < min_uV) {
pr_err("%s: %s '%s' voltage constraints\n",
__func__, "unsupportable", name);
ret = -EINVAL;
goto out;
return -EINVAL;
}

/* use regulator's subset of machine constraints */
Expand All @@ -767,6 +745,38 @@ static int set_machine_constraints(struct regulator_dev *rdev,
}
}

return 0;
}

/**
* set_machine_constraints - sets regulator constraints
* @rdev: regulator source
* @constraints: constraints to apply
*
* Allows platform initialisation code to define and constrain
* regulator circuits e.g. valid voltage/current ranges, etc. NOTE:
* Constraints *must* be set by platform code in order for some
* regulator operations to proceed i.e. set_voltage, set_current_limit,
* set_mode.
*/
static int set_machine_constraints(struct regulator_dev *rdev,
struct regulation_constraints *constraints)
{
int ret = 0;
const char *name;
struct regulator_ops *ops = rdev->desc->ops;

if (constraints->name)
name = constraints->name;
else if (rdev->desc->name)
name = rdev->desc->name;
else
name = "regulator";

ret = machine_constraints_voltage(rdev, name, constraints);
if (ret != 0)
goto out;

rdev->constraints = constraints;

/* do we need to apply the constraint voltage */
Expand Down

0 comments on commit e79055d

Please sign in to comment.