regulator: improved mode error checks
PATCH 1/1 regulator: improved mode error checks
From: David Brownell <[email protected]>
Minor bugfixes in handling of regulator modes:
- have the routine verifying regulator modes check against the set of legal modes (!);
- have regulator_set_optimum_mode() verify the return value of regulator_ops.get_optimum_mode(), like drms_uA_update();
- one call to regulator_ops.set_mode() treated zero as a failure code; make this consistent with other callers.
Both regulator_set_mode() and regulator_set_optimum_mode() now require valid_ops_mask to include REGULATOR_CHANGE_MODE; that seems like a bugfix too.
Signed-off-by David Brownell <[email protected]>
--- drivers/regulator/core.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
drivers/regulator/core.c +13 -2
@@ -174,6 +174,16 @@ static int regulator_check_current_limit/* operating mode constraint check */ static int regulator_check_mode (struct regulator_dev *rdev,int mode) { +switch (mode) { +case REGULATOR_MODE_FAST : +case REGULATOR_MODE_NORMAL : +case REGULATOR_MODE_IDLE : +case REGULATOR_MODE_STANDBY : +break ; +default : +return -EINVAL ; + } +if (!rdev->constraints) {printk (KERN_ERR "%s: no constraints for %s\n" , __func__, rdev->desc->name);
@@ -1463,7 +1473,8 @@ int regulator_set_optimum_mode(struct re mode = rdev->desc->ops->get_optimum_mode (rdev, input_uV, output_uV, total_uA_load); -if (ret <=0 ) { + ret =regulator_check_mode (rdev, mode); +if (ret <0 ) {printk (KERN_ERR "%s: failed to get optimum mode for %s @" " %d uA %d -> %d uV\n" , __func__, rdev->desc->name, total_uA_load, input_uV, output_uV);
@@ -1471,7 +1482,7 @@ int regulator_set_optimum_mode(struct re } ret = rdev->desc->ops->set_mode (rdev, mode); -if (ret <=0 ) { +if (ret <0 ) {printk (KERN_ERR "%s: failed to set optimum mode %x for %s\n" , __func__, mode, rdev->desc->name); goto out;