aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@gmail.com>2012-07-19 03:10:31 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-08-28 14:00:24 -0400
commit8db98440facad7e3a194f21ce6069e04bff336c6 (patch)
tree7ca20257e4be2dfd323d3bbbffd39b49367d9c8d /drivers
parent825d105910d549e69748b19f83031b231152ac9d (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.c42
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);
459err:
460 mc13xxx_unlock(priv->mc13xxx); 448 mc13xxx_unlock(priv->mc13xxx);
461 449
462 return ret; 450 return ret;