diff options
author | Graeme Gregory <gg@slimlogic.co.uk> | 2011-10-17 13:04:51 +0100 |
---|---|---|
committer | Ziyann <jaraidaniel@gmail.com> | 2014-10-01 12:55:26 +0200 |
commit | dfab61f2a04c6a94ce1f05cde06396d2156579de (patch) | |
tree | 94bcab5445c4528130ff5db540979d9d7402f6bf | |
parent | fa1cb8a3caf94378e25ad5e344ad45712f260c94 (diff) | |
download | kernel_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.c | 28 |
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; |