diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index e0c0cf462004..903ececbf49f 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -431,6 +431,15 @@ 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) @@ -460,6 +469,8 @@ int regulator_check_consumers(struct regulator_dev *rdev, { struct regulator *regulator; struct regulator_voltage *voltage; + int init_min_uV = *min_uV; + int init_max_uV = *max_uV; list_for_each_entry(regulator, &rdev->consumer_list, list) { voltage = ®ulator->voltage[state]; @@ -470,6 +481,12 @@ int regulator_check_consumers(struct regulator_dev *rdev, if (!voltage->min_uV && !voltage->max_uV) continue; + if (init_max_uV < voltage->min_uV + || init_min_uV > voltage->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, voltage->min_uV, + voltage->max_uV); + if (*max_uV > voltage->max_uV) *max_uV = voltage->max_uV; if (*min_uV < voltage->min_uV)