regulator: tps65910: Sleep off rails when ext sleep configured
Laxman Dewangan [Wed, 7 Mar 2012 12:51:49 +0000 (17:51 +0530)]
Keep the rails OFF in sleep mode only when the rails are
controlled by external sleep control.
The devices tps65910 and tps65911, both has the sleep input.
The tps65911's sleep input is not same as tps65910's EN3 and hence
taking care of SLEEP input as separate external sleep control input.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
cherry picked from mainline commit
87ae88a17396fe3f91c34ab44f460e5680eb6f61

Change-Id: I05645082ad5268a4553891db6b35af33650b7a95
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/89125

Rebase-Id: R7480202b64807d66b27a5fde39f2358b66e69ac0

drivers/regulator/tps65910-regulator.c
include/linux/mfd/tps65910.h

index eef5825..4a37c2b 100644 (file)
@@ -28,7 +28,8 @@
 #define TPS65910_SUPPLY_STATE_ENABLED  0x1
 #define EXT_SLEEP_CONTROL (TPS65910_SLEEP_CONTROL_EXT_INPUT_EN1 |      \
                        TPS65910_SLEEP_CONTROL_EXT_INPUT_EN2 |          \
-                       TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3)
+                       TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3 |          \
+                       TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP)
 
 /* supported VIO voltages in milivolts */
 static const u16 VIO_VSEL_table[] = {
@@ -980,6 +981,8 @@ static int tps65910_set_ext_sleep_config(struct tps65910_reg *pmic,
                                TPS65910_SLEEP_CONTROL_EXT_INPUT_EN2) != 0);
                en_count += ((ext_sleep_config &
                                TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3) != 0);
+               en_count += ((ext_sleep_config &
+                               TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP) != 0);
                if (en_count > 1) {
                        dev_err(mfd->dev,
                                "External sleep control flag is not proper\n");
@@ -1076,12 +1079,18 @@ static int tps65910_set_ext_sleep_config(struct tps65910_reg *pmic,
 
        ret = tps65910_clear_bits(mfd,
                        TPS65910_SLEEP_KEEP_LDO_ON + regoffs, bit_pos);
-       if (!ret)
-               ret = tps65910_set_bits(mfd,
-                       TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos);
+       if (!ret) {
+               if (ext_sleep_config & TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP)
+                       ret = tps65910_set_bits(mfd,
+                               TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos);
+               else
+                       ret = tps65910_clear_bits(mfd,
+                               TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos);
+       }
        if (ret < 0)
                dev_err(mfd->dev,
                        "Error in configuring SLEEP register\n");
+
        return ret;
 }
 
index 06a4cd6..f6021cc 100644 (file)
 /* Max number of TPS65910/11 regulators */
 #define TPS65910_NUM_REGS                              13
 
-/* External sleep controls through EN1/EN2/EN3 inputs*/
+/* External sleep controls through EN1/EN2/EN3/SLEEP inputs */
 #define TPS65910_SLEEP_CONTROL_EXT_INPUT_EN1           0x1
 #define TPS65910_SLEEP_CONTROL_EXT_INPUT_EN2           0x2
 #define TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3           0x4
-/* TPS65911 names the EN3 signal as SLEEP */
-#define TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP         0x4
+#define TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP         0x8
 
 /**
  * struct tps65910_board