From 5e6f370c1e3dc5a97ed865a0c3e648f5100c349c Mon Sep 17 00:00:00 2001 From: Federico Amedeo Izzo Date: Sat, 23 May 2026 15:04:24 +0200 Subject: [PATCH] regulator: qcom-rpmh-regulator: fix regulator mode mismatch Initial regulator mode was read from dts but never applied. This caused a mismatch between saved mode and actual regulator mode. Apply the current mode from priv->mode during enable() and move rpmh_regulator_vrm_set_mode function before rpmh_regulator_set_enable_state(). Signed-off-by: Federico Amedeo Izzo Reviewed-by: Casey Connolly Link: https://patch.msgid.link/20260523-qcom-ufs-regulator-support-v4-1-45639533b06d@izzo.pro Signed-off-by: Casey Connolly --- drivers/power/regulator/qcom-rpmh-regulator.c | 108 +++++++++--------- 1 file changed, 57 insertions(+), 51 deletions(-) diff --git a/drivers/power/regulator/qcom-rpmh-regulator.c b/drivers/power/regulator/qcom-rpmh-regulator.c index 4d65aae1690..f789b5b6f86 100644 --- a/drivers/power/regulator/qcom-rpmh-regulator.c +++ b/drivers/power/regulator/qcom-rpmh-regulator.c @@ -295,57 +295,6 @@ static int rpmh_regulator_vrm_get_value(struct udevice *rdev) return vreg->uv; } -static int rpmh_regulator_is_enabled(struct udevice *rdev) -{ - struct rpmh_vreg *vreg = dev_get_priv(rdev); - int ret; - - debug("%s: is_enabled %d\n", rdev->name, vreg->enabled); - - if (vreg->enabled < 0) { - struct tcs_cmd cmd = { - .addr = vreg->addr + RPMH_REGULATOR_REG_ENABLE, - }; - ret = rpmh_regulator_read_data(vreg, &cmd); - /* - * Don't override if disabled since we will also vote the right voltage - * while enabling - */ - if (!ret && cmd.data) - vreg->enabled = cmd.data & RPMH_REGULATOR_ENABLE_MASK; - } - - return vreg->enabled > 0; -} - -static int rpmh_regulator_set_enable_state(struct udevice *rdev, - bool enable) -{ - struct rpmh_vreg *vreg = dev_get_priv(rdev); - struct tcs_cmd cmd = { - .addr = vreg->addr + RPMH_REGULATOR_REG_ENABLE, - .data = enable, - }; - int ret; - - debug("%s: set_enable %d (current %d)\n", rdev->name, enable, - vreg->enabled); - - if (vreg->enabled == -EINVAL && - vreg->uv != -ENOTRECOVERABLE) { - ret = _rpmh_regulator_vrm_set_value(rdev, - vreg->uv, true); - if (ret < 0) - return ret; - } - - ret = rpmh_regulator_send_request(vreg, &cmd, enable); - if (!ret) - vreg->enabled = enable; - - return ret; -} - static int rpmh_regulator_vrm_set_mode_bypass(struct rpmh_vreg *vreg, unsigned int mode, bool bypassed) { @@ -396,6 +345,63 @@ static int rpmh_regulator_vrm_set_mode(struct udevice *rdev, return ret; } +static int rpmh_regulator_is_enabled(struct udevice *rdev) +{ + struct rpmh_vreg *vreg = dev_get_priv(rdev); + int ret; + + debug("%s: is_enabled %d\n", rdev->name, vreg->enabled); + + if (vreg->enabled < 0) { + struct tcs_cmd cmd = { + .addr = vreg->addr + RPMH_REGULATOR_REG_ENABLE, + }; + ret = rpmh_regulator_read_data(vreg, &cmd); + /* + * Don't override if disabled since we will also vote the right voltage + * while enabling + */ + if (!ret && cmd.data) + vreg->enabled = cmd.data & RPMH_REGULATOR_ENABLE_MASK; + } + + return vreg->enabled > 0; +} + +static int rpmh_regulator_set_enable_state(struct udevice *rdev, + bool enable) +{ + struct rpmh_vreg *vreg = dev_get_priv(rdev); + struct tcs_cmd cmd = { + .addr = vreg->addr + RPMH_REGULATOR_REG_ENABLE, + .data = enable, + }; + int ret; + + debug("%s: set_enable %d (current %d)\n", rdev->name, enable, + vreg->enabled); + + if (vreg->mode != -EINVAL) { + ret = rpmh_regulator_vrm_set_mode_bypass(vreg, vreg->mode, vreg->bypassed); + if (ret < 0) + return ret; + } + + if (vreg->enabled == -EINVAL && + vreg->uv != -ENOTRECOVERABLE) { + ret = _rpmh_regulator_vrm_set_value(rdev, + vreg->uv, true); + if (ret < 0) + return ret; + } + + ret = rpmh_regulator_send_request(vreg, &cmd, enable); + if (!ret) + vreg->enabled = enable; + + return ret; +} + static int rpmh_regulator_vrm_get_pmic_mode(struct rpmh_vreg *vreg, int *pmic_mode) { struct tcs_cmd cmd = {