diff options
| -rw-r--r-- | drivers/regulator/core.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index cae41f1d96da..566518eba799 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -224,6 +224,15 @@ static int regulator_check_voltage(struct regulator_dev *rdev, return -EPERM; } + /* check if requested voltage range actually overlaps the constraints */ + if (*max_uV < rdev->constraints->min_uV || + *min_uV > rdev->constraints->max_uV) { + rdev_err(rdev, "requested voltage range [%d, %d] does not fit " + "within constraints: [%d, %d]\n", *min_uV, *max_uV, + rdev->constraints->min_uV, rdev->constraints->max_uV); + return -EINVAL; + } + if (*max_uV > rdev->constraints->max_uV) *max_uV = rdev->constraints->max_uV; if (*min_uV < rdev->constraints->min_uV) @@ -245,6 +254,8 @@ static int regulator_check_consumers(struct regulator_dev *rdev, int *min_uV, int *max_uV) { struct regulator *regulator; + int init_min_uV = *min_uV; + int init_max_uV = *max_uV; list_for_each_entry(regulator, &rdev->consumer_list, list) { /* @@ -254,6 +265,13 @@ static int regulator_check_consumers(struct regulator_dev *rdev, if (!regulator->min_uV && !regulator->max_uV) continue; + if (init_max_uV < regulator->min_uV + || init_min_uV > regulator->max_uV) + rdev_err(rdev, "requested voltage range [%d, %d] does " + "not fit within previously voted range: " + "[%d, %d]\n", init_min_uV, init_max_uV, + regulator->min_uV, regulator->max_uV); + if (*max_uV > regulator->max_uV) *max_uV = regulator->max_uV; if (*min_uV < regulator->min_uV) |
