From 85a85aada07d3cca027bea7056985f69b699da93 Mon Sep 17 00:00:00 2001 From: David Collins Date: Wed, 24 Sep 2014 14:30:45 -0700 Subject: [PATCH] regulator: add verbose error messages for invalid voltage requests Add error messages into the regulator_check_voltage() and regulator_check_consumers() functions which explain exactly what is not correct about given voltage requests. This makes debugging regulator_set_voltage() errors easier. Change-Id: I8b3ec8d6a78c94b436b57bd2228b8bd5c362cecd Signed-off-by: David Collins --- drivers/regulator/core.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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)