The RPM firmware on Qualcomm platforms does not provide a way to check if a regulator is on during boot using the SMD interface. If the regulators are already on during boot and Linux does not make use of them they will currently stay enabled forever. The regulator core does not know these regulators are on and cannot clean them up together with the other unused regulators. Fix this by setting the initial enable state to -EINVAL similar to qcom-rpmh-regulator.c. The regulator core will then also explicitly disable all unused regulators with unknown status. Signed-off-by: Stephan Gerhold <stephan.gerhold@xxxxxxxxxxxxxxx> --- NOTE: This has a slight potential of breaking boards that rely on having unused regulators permanently enabled (without regulator-always-on). However, this is always a mistake in the device tree so it's probably better to risk some breakage now, add the missing regulators and avoid this problem for all future boards. --- drivers/regulator/qcom_smd-regulator.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c index f53ada076252..0bbfba2e17ff 100644 --- a/drivers/regulator/qcom_smd-regulator.c +++ b/drivers/regulator/qcom_smd-regulator.c @@ -53,14 +53,14 @@ static int rpm_reg_write_active(struct qcom_rpm_reg *vreg) reqlen++; } - if (vreg->uv_updated && vreg->is_enabled) { + if (vreg->uv_updated && vreg->is_enabled > 0) { req[reqlen].key = cpu_to_le32(RPM_KEY_UV); req[reqlen].nbytes = cpu_to_le32(sizeof(u32)); req[reqlen].value = cpu_to_le32(vreg->uV); reqlen++; } - if (vreg->load_updated && vreg->is_enabled) { + if (vreg->load_updated && vreg->is_enabled > 0) { req[reqlen].key = cpu_to_le32(RPM_KEY_MA); req[reqlen].nbytes = cpu_to_le32(sizeof(u32)); req[reqlen].value = cpu_to_le32(vreg->load / 1000); @@ -1377,6 +1377,7 @@ static int rpm_regulator_init_vreg(struct qcom_rpm_reg *vreg, struct device *dev vreg->rpm = rpm; vreg->type = rpm_data->type; vreg->id = rpm_data->id; + vreg->is_enabled = -EINVAL; memcpy(&vreg->desc, rpm_data->desc, sizeof(vreg->desc)); vreg->desc.name = rpm_data->name; -- 2.39.2