From f42f33f394d8dc600053a578fbc529cd167edb1d Mon Sep 17 00:00:00 2001 From: Evan Wilson Date: Sat, 12 Mar 2016 17:14:04 -0800 Subject: Adding a new EXT_SLEEP flag This flag ensures the regulator is in full ACTIVE mode during sleep Normally the tps65910 regulators go into an IDLE mode during sleep Change-Id: I30c0025ee1904ac20fec3ced66041f006658b92c --- drivers/regulator/tps65910-regulator.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'drivers/regulator/tps65910-regulator.c') diff --git a/drivers/regulator/tps65910-regulator.c b/drivers/regulator/tps65910-regulator.c index 035eb750e28..46e5f663151 100644 --- a/drivers/regulator/tps65910-regulator.c +++ b/drivers/regulator/tps65910-regulator.c @@ -29,7 +29,8 @@ #define EXT_SLEEP_CONTROL (TPS65910_SLEEP_CONTROL_EXT_INPUT_EN1 | \ TPS65910_SLEEP_CONTROL_EXT_INPUT_EN2 | \ TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3 | \ - TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP) + TPS65910_SLEEP_CONTROL_EXT_INPUT_SLEEP | \ + TPS65910_SLEEP_CONTROL_EXT_INPUT_ACTIVE) /* supported VIO voltages in microvolts */ static const unsigned int VIO_VSEL_table[] = { @@ -389,6 +390,7 @@ static int tps65910_set_mode(struct regulator_dev *dev, unsigned int mode) return reg; switch (mode) { + dev_info(&(dev->dev), "Setting regulator: %d to mode: %d", reg, mode); case REGULATOR_MODE_NORMAL: return tps65910_reg_update_bits(pmic->mfd, reg, LDO_ST_MODE_BIT | LDO_ST_ON_BIT, @@ -408,6 +410,7 @@ static unsigned int tps65910_get_mode(struct regulator_dev *dev) struct tps65910_reg *pmic = rdev_get_drvdata(dev); int ret, reg, value, id = rdev_get_id(dev); + dev_info(&(dev->dev), "Getting mode for regulator: %d", reg); reg = pmic->get_ctrl_reg(id); if (reg < 0) return reg; @@ -807,7 +810,9 @@ static int tps65910_set_ext_sleep_config(struct tps65910_reg *pmic, en_count += ((ext_sleep_config & TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3) != 0); en_count += ((ext_sleep_config & - TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP) != 0); + TPS65910_SLEEP_CONTROL_EXT_INPUT_SLEEP) != 0); + en_count += ((ext_sleep_config & + TPS65910_SLEEP_CONTROL_EXT_INPUT_ACTIVE) != 0); if (en_count > 1) { dev_err(mfd->dev, "External sleep control flag is not proper\n"); @@ -911,10 +916,15 @@ static int tps65910_set_ext_sleep_config(struct tps65910_reg *pmic, } } - ret = tps65910_reg_clear_bits(mfd, + if (ext_sleep_config & TPS65910_SLEEP_CONTROL_EXT_INPUT_ACTIVE) { + ret = tps65910_reg_set_bits(mfd, + TPS65910_SLEEP_KEEP_LDO_ON + regoffs, bit_pos); + } else { + ret = tps65910_reg_clear_bits(mfd, TPS65910_SLEEP_KEEP_LDO_ON + regoffs, bit_pos); + } if (!ret) { - if (ext_sleep_config & TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP) + if (ext_sleep_config & TPS65910_SLEEP_CONTROL_EXT_INPUT_SLEEP) ret = tps65910_reg_set_bits(mfd, TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos); else -- cgit v1.2.3-70-g09d2