aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2013-04-18 09:02:48 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-04-18 13:23:53 -0400
commit51d3a0c999e18a802a654171b5e05952b4630148 (patch)
tree4ddc1594d7f4d132d40b6e3adf62892ba01eb2cc /drivers/regulator
parent28d1e8cd671a53d6b4f967abbbc2a55f7bd333f6 (diff)
regulator: palmas: preserve modes of rails during enable/disable
The Palma device like TPS65913 have the mode mask which is also used for enable/disable the rails. The mode bits are defined as 00: OFF 01: AUTO 10: ECO 11: Forced PWM and modes are set accordingly as REGULATOR_MODE_NORMAL: AUTO REGULATOR_MODE_IDLE: ECO REGULATOR_MODE_FAST: PWM Two issue observed: 1. If client calls following sequence: regulator_enable(), regulator_set_mode(FAST), regulator_disable() and again the regulator_enable() then the mode is reset to NORMAL inplace of keeping the mode as FAST. Fixing this by storing the current mode configured by client and restoring modes when enable() is called after disable(). 2. In following sequence, the regulator get enabled: regulator_disable() regulator_set_mode(FAST), Fixing this by updating new mode in register only if it is enabled. Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Acked-by: Graeme Gregory <gg@slimlogic.co.uk> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/regulator')
-rw-r--r--drivers/regulator/palmas-regulator.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c
index 33369160b770..38447ac53cb8 100644
--- a/drivers/regulator/palmas-regulator.c
+++ b/drivers/regulator/palmas-regulator.c
@@ -274,7 +274,10 @@ static int palmas_enable_smps(struct regulator_dev *dev)
274 palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, &reg); 274 palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, &reg);
275 275
276 reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; 276 reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
277 reg |= SMPS_CTRL_MODE_ON; 277 if (pmic->current_reg_mode[id])
278 reg |= pmic->current_reg_mode[id];
279 else
280 reg |= SMPS_CTRL_MODE_ON;
278 281
279 palmas_smps_write(pmic->palmas, palmas_regs_info[id].ctrl_addr, reg); 282 palmas_smps_write(pmic->palmas, palmas_regs_info[id].ctrl_addr, reg);
280 283
@@ -296,16 +299,19 @@ static int palmas_disable_smps(struct regulator_dev *dev)
296 return 0; 299 return 0;
297} 300}
298 301
299
300static int palmas_set_mode_smps(struct regulator_dev *dev, unsigned int mode) 302static int palmas_set_mode_smps(struct regulator_dev *dev, unsigned int mode)
301{ 303{
302 struct palmas_pmic *pmic = rdev_get_drvdata(dev); 304 struct palmas_pmic *pmic = rdev_get_drvdata(dev);
303 int id = rdev_get_id(dev); 305 int id = rdev_get_id(dev);
304 unsigned int reg; 306 unsigned int reg;
307 bool rail_enable = true;
305 308
306 palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, &reg); 309 palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, &reg);
307 reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; 310 reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
308 311
312 if (reg == SMPS_CTRL_MODE_OFF)
313 rail_enable = false;
314
309 switch (mode) { 315 switch (mode) {
310 case REGULATOR_MODE_NORMAL: 316 case REGULATOR_MODE_NORMAL:
311 reg |= SMPS_CTRL_MODE_ON; 317 reg |= SMPS_CTRL_MODE_ON;
@@ -319,8 +325,11 @@ static int palmas_set_mode_smps(struct regulator_dev *dev, unsigned int mode)
319 default: 325 default:
320 return -EINVAL; 326 return -EINVAL;
321 } 327 }
322 palmas_smps_write(pmic->palmas, palmas_regs_info[id].ctrl_addr, reg);
323 328
329 pmic->current_reg_mode[id] = reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
330 if (rail_enable)
331 palmas_smps_write(pmic->palmas,
332 palmas_regs_info[id].ctrl_addr, reg);
324 return 0; 333 return 0;
325} 334}
326 335
@@ -330,9 +339,7 @@ static unsigned int palmas_get_mode_smps(struct regulator_dev *dev)
330 int id = rdev_get_id(dev); 339 int id = rdev_get_id(dev);
331 unsigned int reg; 340 unsigned int reg;
332 341
333 palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, &reg); 342 reg = pmic->current_reg_mode[id] & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
334 reg &= PALMAS_SMPS12_CTRL_STATUS_MASK;
335 reg >>= PALMAS_SMPS12_CTRL_STATUS_SHIFT;
336 343
337 switch (reg) { 344 switch (reg) {
338 case SMPS_CTRL_MODE_ON: 345 case SMPS_CTRL_MODE_ON:
@@ -871,7 +878,8 @@ static int palmas_regulators_probe(struct platform_device *pdev)
871 /* 878 /*
872 * Read and store the RANGE bit for later use 879 * Read and store the RANGE bit for later use
873 * This must be done before regulator is probed, 880 * This must be done before regulator is probed,
874 * otherwise we error in probe with unsupportable ranges. 881 * otherwise we error in probe with unsupportable
882 * ranges. Read the current smps mode for later use.
875 */ 883 */
876 addr = palmas_regs_info[id].vsel_addr; 884 addr = palmas_regs_info[id].vsel_addr;
877 885
@@ -888,6 +896,14 @@ static int palmas_regulators_probe(struct platform_device *pdev)
888 palmas_regs_info[id].vsel_addr); 896 palmas_regs_info[id].vsel_addr);
889 pmic->desc[id].vsel_mask = 897 pmic->desc[id].vsel_mask =
890 PALMAS_SMPS12_VOLTAGE_VSEL_MASK; 898 PALMAS_SMPS12_VOLTAGE_VSEL_MASK;
899
900 /* Read the smps mode for later use. */
901 addr = palmas_regs_info[id].ctrl_addr;
902 ret = palmas_smps_read(pmic->palmas, addr, &reg);
903 if (ret)
904 goto err_unregister_regulator;
905 pmic->current_reg_mode[id] = reg &
906 PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
891 } 907 }
892 908
893 pmic->desc[id].type = REGULATOR_VOLTAGE; 909 pmic->desc[id].type = REGULATOR_VOLTAGE;