summaryrefslogtreecommitdiffstats
path: root/drivers/regulator/ad5398.c
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@gmail.com>2012-07-04 11:55:07 +0800
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-07-04 12:39:38 +0100
commit9c6a74c5e0ca3bfac09cb1e7bf7629cc0f3aa48c (patch)
treec5c1d04ce47081ca27aaf1dac9d2a50532bb7bf5 /drivers/regulator/ad5398.c
parentfca53d862dcbddaa9db017b70a64392da8c20bce (diff)
downloadlinux-9c6a74c5e0ca3bfac09cb1e7bf7629cc0f3aa48c.tar.gz
linux-9c6a74c5e0ca3bfac09cb1e7bf7629cc0f3aa48c.tar.bz2
linux-9c6a74c5e0ca3bfac09cb1e7bf7629cc0f3aa48c.zip
regulator: ad5398: Fix min/max current limit boundary checking
It is ok to request current limit with min_uA < chip->min_uA and max_uA > chip->max_uA. We need to set min_uA = chip->min_uA if (min_uA < chip->min_uA), this ensures the equation to calcuate selator does not return negative number. Also set max_uA = chip->max_uA if (max_uA > chip->max_uA), as suggested by Sonic. Signed-off-by: Axel Lin <axel.lin@gmail.com> Acked-by: Sonic Zhang <sonic.zhang@analog.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/regulator/ad5398.c')
-rw-r--r--drivers/regulator/ad5398.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/regulator/ad5398.c b/drivers/regulator/ad5398.c
index 46d05f38baf8..f123f7e3b752 100644
--- a/drivers/regulator/ad5398.c
+++ b/drivers/regulator/ad5398.c
@@ -89,9 +89,12 @@ static int ad5398_set_current_limit(struct regulator_dev *rdev, int min_uA, int
unsigned short data;
int ret;
- if (min_uA > chip->max_uA || min_uA < chip->min_uA)
- return -EINVAL;
- if (max_uA > chip->max_uA || max_uA < chip->min_uA)
+ if (min_uA < chip->min_uA)
+ min_uA = chip->min_uA;
+ if (max_uA > chip->max_uA)
+ max_uA = chip->max_uA;
+
+ if (min_uA > chip->max_uA || max_uA < chip->min_uA)
return -EINVAL;
selector = DIV_ROUND_UP((min_uA - chip->min_uA) * chip->current_level,