mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
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 <federico@izzo.pro> Reviewed-by: Casey Connolly <casey.connolly@linaro.org> Link: https://patch.msgid.link/20260523-qcom-ufs-regulator-support-v4-1-45639533b06d@izzo.pro Signed-off-by: Casey Connolly <casey.connolly@linaro.org>
This commit is contained in:
committed by
Casey Connolly
parent
1a8b7ad50a
commit
5e6f370c1e
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user