drm/rockchip: vop2: Fix internal power domain on/off status check when memory bisr enabled

When query vop internal power domain on/off
status from PMU BISR_STS3, 1 is for power up,
0 is for power down, this is different from
the pd status in vop.

Fixes: edf7edcdee29("drm/rockchip: vop2: Check PMU_BISR_STATUS register
for pd status when bisr enabled")
Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
Change-Id: I25d7dbe777511571e9b156aeafba94a5bdfe26da
This commit is contained in:
Andy Yan
2022-01-05 16:39:06 +08:00
committed by Tao Huang
parent 5e364b4473
commit b26c5ead68

View File

@@ -1375,6 +1375,12 @@ static inline void vop2_cfg_done(struct drm_crtc *crtc)
return rk3588_vop2_cfg_done(crtc);
}
/*
* Read VOP internal power domain on/off status.
* We should query BISR_STS register in PMU for
* power up/down status when memory repair is enabled.
* Return value: 1 for power on, 0 for power off;
*/
static uint32_t vop2_power_domain_status(struct vop2_power_domain *pd)
{
struct vop2 *vop2 = pd->vop2;
@@ -1382,7 +1388,7 @@ static uint32_t vop2_power_domain_status(struct vop2_power_domain *pd)
if (vop2_read_grf_reg(vop2->sys_pmu, &pd->data->regs->bisr_en_status))
return vop2_read_grf_reg(vop2->sys_pmu, &pd->data->regs->pmu_status);
else
return vop2_read_reg(vop2, 0, &pd->data->regs->status);
return vop2_read_reg(vop2, 0, &pd->data->regs->status) ? 0 : 1;
}
static void vop2_wait_power_domain_off(struct vop2_power_domain *pd)
@@ -1391,7 +1397,7 @@ static void vop2_wait_power_domain_off(struct vop2_power_domain *pd)
int val;
int ret;
ret = readx_poll_timeout_atomic(vop2_power_domain_status, pd, val, val, 0, 50 * 1000);
ret = readx_poll_timeout_atomic(vop2_power_domain_status, pd, val, !val, 0, 50 * 1000);
if (ret)
DRM_DEV_ERROR(vop2->dev, "wait pd%d off timeout\n", ffs(pd->data->id) - 1);
@@ -1403,7 +1409,7 @@ static void vop2_wait_power_domain_on(struct vop2_power_domain *pd)
int val;
int ret;
ret = readx_poll_timeout_atomic(vop2_power_domain_status, pd, val, !val, 0, 50 * 1000);
ret = readx_poll_timeout_atomic(vop2_power_domain_status, pd, val, val, 0, 50 * 1000);
if (ret)
DRM_DEV_ERROR(vop2->dev, "wait pd%d on timeout\n", ffs(pd->data->id) - 1);
}