diff options
author | Axel Lin <axel.lin@gmail.com> | 2012-07-19 03:10:31 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-08-28 14:00:24 -0400 |
commit | 8db98440facad7e3a194f21ce6069e04bff336c6 (patch) | |
tree | 7ca20257e4be2dfd323d3bbbffd39b49367d9c8d /drivers | |
parent | 825d105910d549e69748b19f83031b231152ac9d (diff) |
regulator: mc13892: Simplify implementation of mc13892_sw_regulator_set_voltage_sel()
Use mc13xxx_reg_rmw rather than a mc13xxx_reg_read and a mc13xxx_reg_write calls.
This logic to set MC13892_SWITCHERS0_SWxHI bit is pretty simple:
if (volt > 1375000)
set MC13892_SWITCHERS0_SWxHI bit
else if (volt < 1100000)
clear MC13892_SWITCHERS0_SWxHI bit
else
leave MC13892_SWITCHERS0_SWxHI bit untouched
We already know the selector, so we don't need to calculate the selector again.
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/regulator/mc13892-regulator.c | 42 |
1 files changed, 15 insertions, 27 deletions
diff --git a/drivers/regulator/mc13892-regulator.c b/drivers/regulator/mc13892-regulator.c index 9d4296b96adb..5d1d487c47af 100644 --- a/drivers/regulator/mc13892-regulator.c +++ b/drivers/regulator/mc13892-regulator.c | |||
@@ -426,37 +426,25 @@ static int mc13892_sw_regulator_set_voltage_sel(struct regulator_dev *rdev, | |||
426 | unsigned selector) | 426 | unsigned selector) |
427 | { | 427 | { |
428 | struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev); | 428 | struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev); |
429 | int hi, value, mask, id = rdev_get_id(rdev); | 429 | int volt, mask, id = rdev_get_id(rdev); |
430 | u32 valread; | 430 | u32 reg_value; |
431 | int ret; | 431 | int ret; |
432 | 432 | ||
433 | value = rdev->desc->volt_table[selector]; | 433 | volt = rdev->desc->volt_table[selector]; |
434 | mask = mc13892_regulators[id].vsel_mask; | ||
435 | reg_value = selector << mc13892_regulators[id].vsel_shift; | ||
434 | 436 | ||
435 | mc13xxx_lock(priv->mc13xxx); | 437 | if (volt > 1375000) { |
436 | ret = mc13xxx_reg_read(priv->mc13xxx, | 438 | mask |= MC13892_SWITCHERS0_SWxHI; |
437 | mc13892_regulators[id].vsel_reg, &valread); | 439 | reg_value |= MC13892_SWITCHERS0_SWxHI; |
438 | if (ret) | 440 | } else if (volt < 1100000) { |
439 | goto err; | 441 | mask |= MC13892_SWITCHERS0_SWxHI; |
442 | reg_value &= ~MC13892_SWITCHERS0_SWxHI; | ||
443 | } | ||
440 | 444 | ||
441 | if (value > 1375000) | 445 | mc13xxx_lock(priv->mc13xxx); |
442 | hi = 1; | 446 | ret = mc13xxx_reg_rmw(priv->mc13xxx, mc13892_regulators[id].reg, mask, |
443 | else if (value < 1100000) | 447 | reg_value); |
444 | hi = 0; | ||
445 | else | ||
446 | hi = valread & MC13892_SWITCHERS0_SWxHI; | ||
447 | |||
448 | if (hi) { | ||
449 | value = (value - 1100000) / 25000; | ||
450 | value |= MC13892_SWITCHERS0_SWxHI; | ||
451 | } else | ||
452 | value = (value - 600000) / 25000; | ||
453 | |||
454 | mask = mc13892_regulators[id].vsel_mask | MC13892_SWITCHERS0_SWxHI; | ||
455 | valread = (valread & ~mask) | | ||
456 | (value << mc13892_regulators[id].vsel_shift); | ||
457 | ret = mc13xxx_reg_write(priv->mc13xxx, mc13892_regulators[id].vsel_reg, | ||
458 | valread); | ||
459 | err: | ||
460 | mc13xxx_unlock(priv->mc13xxx); | 448 | mc13xxx_unlock(priv->mc13xxx); |
461 | 449 | ||
462 | return ret; | 450 | return ret; |