drm/rockchip: vop2: get power_ctrl default value and backup to regsbak

Read default register value and backup to regsbak must after pd power on, so we
can get correctly value, but the pd power on action depend on regsbak, so
we add extra regsbak for power_ctrl.

Fixes: 6282856b67 ("drm/rockchip: vop2: move power up plane pd before read regsbak")
Signed-off-by: Sandy Huang <hjc@rock-chips.com>
Change-Id: I465b0ec76d4e1233c40e79528ee42b5c5c2fb727
This commit is contained in:
Sandy Huang
2024-07-15 15:26:51 +08:00
committed by Tao Huang
parent 6e99cb3d84
commit 764ff0a4cb

View File

@@ -4293,7 +4293,13 @@ static void vop2_initial(struct drm_crtc *crtc)
*/
if (vop2->version == VOP_VERSION_RK3588) {
struct vop2_power_domain *esmart_pd = vop2_find_pd_by_id(vop2, VOP2_PD_ESMART);
u32 pd_offset = esmart_pd->data->regs->pd.offset;
/*
* Get power_ctrl default value and backup to regsbak,
* so we can config pd register correctly as expected.
*/
vop2->regsbak[pd_offset >> 2] = vop2_readl(vop2, pd_offset);
if (vop2_power_domain_status(esmart_pd))
esmart_pd->on = true;
else
@@ -4302,10 +4308,14 @@ static void vop2_initial(struct drm_crtc *crtc)
struct vop2_power_domain *pd, *n;
list_for_each_entry_safe_reverse(pd, n, &vop2->pd_list_head, list) {
if (vop2_power_domain_status(pd))
if (vop2_power_domain_status(pd)) {
pd->on = true;
else
} else {
u32 pd_offset = pd->data->regs->pd.offset;
vop2->regsbak[pd_offset >> 2] = vop2_readl(vop2, pd_offset);
vop2_power_domain_on(pd);
}
}
}