diff options
author | Axel Lin <axel.lin@ingics.com> | 2013-07-18 10:21:57 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-07-18 10:55:09 -0400 |
commit | a56d66a2f01b172bc00d73b0b0392423c8aaae19 (patch) | |
tree | 3ce675637f8b26f4fe3b3928233de8c587eecaee | |
parent | c36a1cdf96dd3a4e6b612d6847bff6c7086e358b (diff) |
regulator: core: Allow fixed voltage range in multiple linear ranges
Current code does not allow fixed voltage range in multiple linear ranges.
If someone does set range->uV_step == 0 in one of the linear ranges, we hit
divided by zero bug. This patch fixes this issue.
For fixed voltage range, return any selector means the same voltage.
Thus just return 0.
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r-- | drivers/regulator/core.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index e8604be4c66d..fd3f6e003729 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -2436,9 +2436,15 @@ int regulator_map_voltage_linear_range(struct regulator_dev *rdev, | |||
2436 | if (min_uV <= range->min_uV) | 2436 | if (min_uV <= range->min_uV) |
2437 | min_uV = range->min_uV; | 2437 | min_uV = range->min_uV; |
2438 | 2438 | ||
2439 | ret = DIV_ROUND_UP(min_uV - range->min_uV, range->uV_step); | 2439 | /* range->uV_step == 0 means fixed voltage range */ |
2440 | if (ret < 0) | 2440 | if (range->uV_step == 0) { |
2441 | return ret; | 2441 | ret = 0; |
2442 | } else { | ||
2443 | ret = DIV_ROUND_UP(min_uV - range->min_uV, | ||
2444 | range->uV_step); | ||
2445 | if (ret < 0) | ||
2446 | return ret; | ||
2447 | } | ||
2442 | 2448 | ||
2443 | break; | 2449 | break; |
2444 | } | 2450 | } |