Takashi Iwai 77a87f
From 31a6297b89aabc81b274c093a308a7f5b55081a7 Mon Sep 17 00:00:00 2001
Takashi Iwai 77a87f
From: Andreas Kemnade <andreas@kemnade.info>
Takashi Iwai 77a87f
Date: Sun, 20 Nov 2022 23:12:08 +0100
Takashi Iwai 77a87f
Subject: [PATCH] regulator: twl6030: fix get status of twl6032 regulators
Takashi Iwai 77a87f
Git-commit: 31a6297b89aabc81b274c093a308a7f5b55081a7
Takashi Iwai 77a87f
Patch-mainline: v6.1-rc7
Takashi Iwai 77a87f
References: git-fixes
Takashi Iwai 77a87f
Takashi Iwai 77a87f
Status is reported as always off in the 6032 case. Status
Takashi Iwai 77a87f
reporting now matches the logic in the setters. Once of
Takashi Iwai 77a87f
the differences to the 6030 is that there are no groups,
Takashi Iwai 77a87f
therefore the state needs to be read out in the lower bits.
Takashi Iwai 77a87f
Takashi Iwai 77a87f
Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
Takashi Iwai 77a87f
Link: https://lore.kernel.org/r/20221120221208.3093727-3-andreas@kemnade.info
Takashi Iwai 77a87f
Signed-off-by: Mark Brown <broonie@kernel.org>
Takashi Iwai 77a87f
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 77a87f
Takashi Iwai 77a87f
---
Takashi Iwai 77a87f
 drivers/regulator/twl6030-regulator.c | 15 +++++++++++----
Takashi Iwai 77a87f
 1 file changed, 11 insertions(+), 4 deletions(-)
Takashi Iwai 77a87f
Takashi Iwai 77a87f
diff --git a/drivers/regulator/twl6030-regulator.c b/drivers/regulator/twl6030-regulator.c
Takashi Iwai 77a87f
index 7c7e3648ea4b..f3856750944f 100644
Takashi Iwai 77a87f
--- a/drivers/regulator/twl6030-regulator.c
Takashi Iwai 77a87f
+++ b/drivers/regulator/twl6030-regulator.c
Takashi Iwai 77a87f
@@ -67,6 +67,7 @@ struct twlreg_info {
Takashi Iwai 77a87f
 #define TWL6030_CFG_STATE_SLEEP	0x03
Takashi Iwai 77a87f
 #define TWL6030_CFG_STATE_GRP_SHIFT	5
Takashi Iwai 77a87f
 #define TWL6030_CFG_STATE_APP_SHIFT	2
Takashi Iwai 77a87f
+#define TWL6030_CFG_STATE_MASK		0x03
Takashi Iwai 77a87f
 #define TWL6030_CFG_STATE_APP_MASK	(0x03 << TWL6030_CFG_STATE_APP_SHIFT)
Takashi Iwai 77a87f
 #define TWL6030_CFG_STATE_APP(v)	(((v) & TWL6030_CFG_STATE_APP_MASK) >>\
Takashi Iwai 77a87f
 						TWL6030_CFG_STATE_APP_SHIFT)
Takashi Iwai 77a87f
@@ -128,13 +129,14 @@ static int twl6030reg_is_enabled(struct regulator_dev *rdev)
Takashi Iwai 77a87f
 		if (grp < 0)
Takashi Iwai 77a87f
 			return grp;
Takashi Iwai 77a87f
 		grp &= P1_GRP_6030;
Takashi Iwai 77a87f
+		val = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_STATE);
Takashi Iwai 77a87f
+		val = TWL6030_CFG_STATE_APP(val);
Takashi Iwai 77a87f
 	} else {
Takashi Iwai 77a87f
+		val = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_STATE);
Takashi Iwai 77a87f
+		val &= TWL6030_CFG_STATE_MASK;
Takashi Iwai 77a87f
 		grp = 1;
Takashi Iwai 77a87f
 	}
Takashi Iwai 77a87f
 
Takashi Iwai 77a87f
-	val = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_STATE);
Takashi Iwai 77a87f
-	val = TWL6030_CFG_STATE_APP(val);
Takashi Iwai 77a87f
-
Takashi Iwai 77a87f
 	return grp && (val == TWL6030_CFG_STATE_ON);
Takashi Iwai 77a87f
 }
Takashi Iwai 77a87f
 
Takashi Iwai 77a87f
@@ -187,7 +189,12 @@ static int twl6030reg_get_status(struct regulator_dev *rdev)
Takashi Iwai 77a87f
 
Takashi Iwai 77a87f
 	val = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_STATE);
Takashi Iwai 77a87f
 
Takashi Iwai 77a87f
-	switch (TWL6030_CFG_STATE_APP(val)) {
Takashi Iwai 77a87f
+	if (info->features & TWL6032_SUBCLASS)
Takashi Iwai 77a87f
+		val &= TWL6030_CFG_STATE_MASK;
Takashi Iwai 77a87f
+	else
Takashi Iwai 77a87f
+		val = TWL6030_CFG_STATE_APP(val);
Takashi Iwai 77a87f
+
Takashi Iwai 77a87f
+	switch (val) {
Takashi Iwai 77a87f
 	case TWL6030_CFG_STATE_ON:
Takashi Iwai 77a87f
 		return REGULATOR_STATUS_NORMAL;
Takashi Iwai 77a87f
 
Takashi Iwai 77a87f
-- 
Takashi Iwai 77a87f
2.35.3
Takashi Iwai 77a87f