diff options
author | Axel Lin <axel.lin@gmail.com> | 2012-07-03 23:55:07 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-07-04 07:39:38 -0400 |
commit | 9c6a74c5e0ca3bfac09cb1e7bf7629cc0f3aa48c (patch) | |
tree | c5c1d04ce47081ca27aaf1dac9d2a50532bb7bf5 /drivers/regulator | |
parent | fca53d862dcbddaa9db017b70a64392da8c20bce (diff) |
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')
-rw-r--r-- | drivers/regulator/ad5398.c | 9 |
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 | |||
89 | unsigned short data; | 89 | unsigned short data; |
90 | int ret; | 90 | int ret; |
91 | 91 | ||
92 | if (min_uA > chip->max_uA || min_uA < chip->min_uA) | 92 | if (min_uA < chip->min_uA) |
93 | return -EINVAL; | 93 | min_uA = chip->min_uA; |
94 | if (max_uA > chip->max_uA || max_uA < chip->min_uA) | 94 | if (max_uA > chip->max_uA) |
95 | max_uA = chip->max_uA; | ||
96 | |||
97 | if (min_uA > chip->max_uA || max_uA < chip->min_uA) | ||
95 | return -EINVAL; | 98 | return -EINVAL; |
96 | 99 | ||
97 | selector = DIV_ROUND_UP((min_uA - chip->min_uA) * chip->current_level, | 100 | selector = DIV_ROUND_UP((min_uA - chip->min_uA) * chip->current_level, |