[PATCH] regulator: max14577: Add set_suspend_mode for MAX77836 LDOs

From: Jad Keskes

Date: Mon Jun 15 2026 - 13:18:56 EST


The MAX77836 LDOs support three power modes via the PWRMD field in
CNFG1_LDO registers: normal, low-power, and off. Implement the
set_suspend_mode callback so the regulator core can switch LDOs to
the appropriate mode on system suspend, rather than leaving them in
the default operating mode.

Remove the TODO comment that has been sitting here since the driver
was first added.

Signed-off-by: Jad Keskes <inasj268@xxxxxxxxx>
---
drivers/regulator/max14577-regulator.c | 25 ++++++++++++++++++++++++-
include/linux/mfd/max14577-private.h | 3 +++
2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/regulator/max14577-regulator.c b/drivers/regulator/max14577-regulator.c
index 41fd15adfd1f..b7bd459e8a09 100644
--- a/drivers/regulator/max14577-regulator.c
+++ b/drivers/regulator/max14577-regulator.c
@@ -123,6 +123,29 @@ static const struct regulator_desc max14577_supported_regulators[] = {
[MAX14577_CHARGER] = MAX14577_CHARGER_REG,
};

+static int max77836_ldo_set_suspend_mode(struct regulator_dev *rdev,
+ unsigned int mode)
+{
+ unsigned int val;
+
+ switch (mode) {
+ case REGULATOR_MODE_NORMAL:
+ val = MAX77836_CNFG1_LDO_PWRMD_NORMAL;
+ break;
+ case REGULATOR_MODE_IDLE:
+ val = MAX77836_CNFG1_LDO_PWRMD_LPM;
+ break;
+ case REGULATOR_MODE_STANDBY:
+ val = MAX77836_CNFG1_LDO_PWRMD_OFF;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
+ MAX77836_CNFG1_LDO_PWRMD_MASK, val);
+}
+
static const struct regulator_ops max77836_ldo_ops = {
.is_enabled = regulator_is_enabled_regmap,
.enable = regulator_enable_regmap,
@@ -131,7 +154,7 @@ static const struct regulator_ops max77836_ldo_ops = {
.map_voltage = regulator_map_voltage_linear,
.get_voltage_sel = regulator_get_voltage_sel_regmap,
.set_voltage_sel = regulator_set_voltage_sel_regmap,
- /* TODO: add .set_suspend_mode */
+ .set_suspend_mode = max77836_ldo_set_suspend_mode,
};

#define MAX77836_LDO_REG(num) { \
diff --git a/include/linux/mfd/max14577-private.h b/include/linux/mfd/max14577-private.h
index dd51a37fa37f..5957e15b568e 100644
--- a/include/linux/mfd/max14577-private.h
+++ b/include/linux/mfd/max14577-private.h
@@ -350,6 +350,9 @@ enum max77836_pmic_reg {
#define MAX77836_CNFG1_LDO_PWRMD_SHIFT 6
#define MAX77836_CNFG1_LDO_TV_SHIFT 0
#define MAX77836_CNFG1_LDO_PWRMD_MASK (0x3 << MAX77836_CNFG1_LDO_PWRMD_SHIFT)
+#define MAX77836_CNFG1_LDO_PWRMD_OFF (0x0 << MAX77836_CNFG1_LDO_PWRMD_SHIFT)
+#define MAX77836_CNFG1_LDO_PWRMD_LPM (0x1 << MAX77836_CNFG1_LDO_PWRMD_SHIFT)
+#define MAX77836_CNFG1_LDO_PWRMD_NORMAL (0x3 << MAX77836_CNFG1_LDO_PWRMD_SHIFT)
#define MAX77836_CNFG1_LDO_TV_MASK (0x3f << MAX77836_CNFG1_LDO_TV_SHIFT)

/* LDO1/LDO2 CONFIG2 register */
--
2.54.0