aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGraeme Gregory <gg@slimlogic.co.uk>2011-10-17 13:04:51 +0100
committerZiyann <jaraidaniel@gmail.com>2014-10-01 12:55:26 +0200
commitdfab61f2a04c6a94ce1f05cde06396d2156579de (patch)
tree94bcab5445c4528130ff5db540979d9d7402f6bf
parentfa1cb8a3caf94378e25ad5e344ad45712f260c94 (diff)
downloadkernel_samsung_tuna-dfab61f2a04c6a94ce1f05cde06396d2156579de.zip
kernel_samsung_tuna-dfab61f2a04c6a94ce1f05cde06396d2156579de.tar.gz
kernel_samsung_tuna-dfab61f2a04c6a94ce1f05cde06396d2156579de.tar.bz2
REGULATOR: update the handling of state
TWL6032 handles state in a slightly different way than TWL6030. Fix the state handling to deal with the TWL6032 lack of groups. This means kernel correctly determines the state of TWL6032 regulators. Change-Id: I58468829711e2aac4b45f949797c4b33abd92ed8 Signed-off-by: Graeme Gregory <gg@slimlogic.co.uk> Signed-off-by: Volodymyr Riazantsev <v.riazantsev@ti.com>
-rw-r--r--drivers/regulator/twl-regulator.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
index 8ac43a2..e9ee41a 100644
--- a/drivers/regulator/twl-regulator.c
+++ b/drivers/regulator/twl-regulator.c
@@ -101,7 +101,9 @@ struct twlreg_info {
#define TWL6030_CFG_STATE_SLEEP 0x03
#define TWL6030_CFG_STATE_GRP_SHIFT 5
#define TWL6030_CFG_STATE_APP_SHIFT 2
-#define TWL6030_CFG_STATE_APP_MASK (0x03 << TWL6030_CFG_STATE_APP_SHIFT)
+#define TWL6030_CFG_STATE_MASK 0x03
+#define TWL6030_CFG_STATE_APP_MASK (TWL6030_CFG_STATE_MASK << \
+ TWL6030_CFG_STATE_APP_SHIFT)
#define TWL6030_CFG_STATE_APP(v) (((v) & TWL6030_CFG_STATE_APP_MASK) >>\
TWL6030_CFG_STATE_APP_SHIFT)
@@ -185,18 +187,19 @@ static int twl6030reg_is_enabled(struct regulator_dev *rdev)
struct twlreg_info *info = rdev_get_drvdata(rdev);
int grp = 0, val;
- if (!(twl_class_is_6030() && (info->features & TWL6032_SUBCLASS)))
+ if (!(info->features & TWL6032_SUBCLASS)) {
grp = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_GRP);
- if (grp < 0)
- return grp;
+ if (grp < 0)
+ return grp;
- if (!(twl_class_is_6030() && (info->features & TWL6032_SUBCLASS)))
grp &= P1_GRP_6030;
- else
+ val = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_STATE);
+ val = TWL6030_CFG_STATE_APP(val);
+ } else {
+ val = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_STATE);
+ val &= TWL6030_CFG_STATE_MASK;
grp = 1;
-
- val = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_STATE);
- val = TWL6030_CFG_STATE_APP(val);
+ }
return grp && (val == TWL6030_CFG_STATE_ON);
}
@@ -339,7 +342,12 @@ static int twl6030reg_get_status(struct regulator_dev *rdev)
val = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_STATE);
- switch (TWL6030_CFG_STATE_APP(val)) {
+ if (info->features & TWL6032_SUBCLASS)
+ val &= TWL6030_CFG_STATE_MASK;
+ else
+ val = TWL6030_CFG_STATE_APP(val);
+
+ switch (val) {
case TWL6030_CFG_STATE_ON:
return REGULATOR_STATUS_NORMAL;