aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjorn Andersson <bjorn.andersson@linaro.org>2018-11-30 17:03:52 -0800
committerBjorn Andersson <bjorn.andersson@linaro.org>2018-11-30 17:26:24 -0800
commit1cbec06e52715228251ed5f2648ba7672f0ba9d0 (patch)
tree19fc46971e6dad300249623161a3a1974501818b
parent9b08be3b2bfc8018812580cd9e46b3342f05504e (diff)
regulator: qcom-smd: Postpone voltage changes to enable
Move the voltage request for disabled regulators to the subsequent enable request. It's been observed that while booting the QCS404 EVB, the effort of bringing PMS405 LDO3 into its configured voltage range causes the system to lock up. Enabling the regulator from the consumer drivers shortly after works fine, which indicates that there would be an ordering constraint involved, but the exact reason for the need of this is still uncertain. Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-rw-r--r--drivers/regulator/qcom_smd-regulator.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c
index 38c659d418d0..9e552c6755be 100644
--- a/drivers/regulator/qcom_smd-regulator.c
+++ b/drivers/regulator/qcom_smd-regulator.c
@@ -57,14 +57,20 @@ static int rpm_reg_write_active(struct qcom_rpm_reg *vreg,
static int rpm_reg_enable(struct regulator_dev *rdev)
{
struct qcom_rpm_reg *vreg = rdev_get_drvdata(rdev);
- struct rpm_regulator_req req;
+ struct rpm_regulator_req req[2];
int ret;
- req.key = cpu_to_le32(RPM_KEY_SWEN);
- req.nbytes = cpu_to_le32(sizeof(u32));
- req.value = cpu_to_le32(1);
+ /* Enable */
+ req[0].key = cpu_to_le32(RPM_KEY_SWEN);
+ req[0].nbytes = cpu_to_le32(sizeof(u32));
+ req[0].value = cpu_to_le32(1);
- ret = rpm_reg_write_active(vreg, &req, sizeof(req));
+ /* Set voltage */
+ req[1].key = cpu_to_le32(RPM_KEY_UV);
+ req[1].nbytes = cpu_to_le32(sizeof(u32));
+ req[1].value = cpu_to_le32(vreg->uV);
+
+ ret = rpm_reg_write_active(vreg, req, sizeof(req));
if (!ret)
vreg->is_enabled = 1;
@@ -111,15 +117,19 @@ static int rpm_reg_set_voltage(struct regulator_dev *rdev,
struct rpm_regulator_req req;
int ret = 0;
- req.key = cpu_to_le32(RPM_KEY_UV);
- req.nbytes = cpu_to_le32(sizeof(u32));
- req.value = cpu_to_le32(min_uV);
+ if (vreg->is_enabled) {
+ req.key = cpu_to_le32(RPM_KEY_UV);
+ req.nbytes = cpu_to_le32(sizeof(u32));
+ req.value = cpu_to_le32(min_uV);
- ret = rpm_reg_write_active(vreg, &req, sizeof(req));
- if (!ret)
- vreg->uV = min_uV;
+ ret = rpm_reg_write_active(vreg, &req, sizeof(req));
+ if (ret)
+ return ret;
+ }
- return ret;
+ vreg->uV = min_uV;
+
+ return 0;
}
static int rpm_reg_set_load(struct regulator_dev *rdev, int load_uA)