diff options
author | Bjorn Andersson <bjorn.andersson@linaro.org> | 2018-11-30 17:03:52 -0800 |
---|---|---|
committer | Bjorn Andersson <bjorn.andersson@linaro.org> | 2018-11-30 17:26:24 -0800 |
commit | 1cbec06e52715228251ed5f2648ba7672f0ba9d0 (patch) | |
tree | 19fc46971e6dad300249623161a3a1974501818b | |
parent | 9b08be3b2bfc8018812580cd9e46b3342f05504e (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.c | 34 |
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) |