disp: msm: disable regulator load after the regulator was disabled

Setting a lower load can make the regulator enter into LPM. Now the
lower load was set before the regulator disable, there's a risk here.
The regulator has been LPM, while it was not disable, if the cosumer
has a higher current needed than LPM at this time, that will lead OCP
on this regulator. The right operation for a regulator enable/disable
should be:
 1. regulator_set_voltage(vreg, active_min_uV, active_max_uV) and
    regulator_set_load(vreg, active_load_uA); in either order
 2. regulator_enable()
 3. regulator_disable()
 4. regulator_set_voltage(vreg, inactive_min_uV, inactive_max_uV)
    and regulator_set_load(vreg, inactive_load_uA); in either order

Change-Id: Ibe4f888a5675baf2691e479daa163d8867902e69
Signed-off-by: Zhao, Yuan <yzhao@codeaurora.org>
This commit is contained in:
Zhao, Yuan
2020-09-21 17:12:16 +08:00
committed by Gerrit - the friendly Code Review server
父節點 bb71c092c8
當前提交 d9c2a8d3a6
共有 3 個文件被更改,包括 25 次插入22 次删除

查看文件

@@ -179,9 +179,14 @@ static int dsi_pwr_enable_vregs(struct dsi_regulator_info *regs, bool enable)
usleep_range((pre_off_ms * 1000),
(pre_off_ms * 1000) + 10);
(void)regulator_disable(regs->vregs[i].vreg);
if (post_off_ms)
usleep_range((post_off_ms * 1000),
(post_off_ms * 1000) + 10);
(void)regulator_set_load(regs->vregs[i].vreg,
regs->vregs[i].disable_load);
(void)regulator_disable(regs->vregs[i].vreg);
num_of_v = regulator_count_voltages(vreg->vreg);
if (num_of_v > 0)
@@ -189,9 +194,6 @@ static int dsi_pwr_enable_vregs(struct dsi_regulator_info *regs, bool enable)
regs->vregs[i].off_min_voltage,
regs->vregs[i].max_voltage);
if (post_off_ms)
usleep_range((post_off_ms * 1000),
(post_off_ms * 1000) + 10);
}
}
@@ -214,19 +216,20 @@ error:
usleep_range((pre_off_ms * 1000),
(pre_off_ms * 1000) + 10);
(void)regulator_disable(regs->vregs[i].vreg);
if (post_off_ms)
usleep_range((post_off_ms * 1000),
(post_off_ms * 1000) + 10);
(void)regulator_set_load(regs->vregs[i].vreg,
regs->vregs[i].disable_load);
num_of_v = regulator_count_voltages(regs->vregs[i].vreg);
if (num_of_v > 0)
(void)regulator_set_voltage(regs->vregs[i].vreg,
0, regs->vregs[i].max_voltage);
0, regs->vregs[i].max_voltage);
(void)regulator_disable(regs->vregs[i].vreg);
if (post_off_ms)
usleep_range((post_off_ms * 1000),
(post_off_ms * 1000) + 10);
}
return rc;