diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index ebf0e924d526..9d4c423d8b8f 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -3222,6 +3222,19 @@ out: return ret; } +static void vop_crtc_te_handler(struct drm_crtc *crtc) +{ + struct vop *vop; + + if (!crtc) + return; + + vop = to_vop(crtc); + + if (vop->mcu_timing.mcu_pix_total) + VOP_CTRL_SET(vop, mcu_frame_st, 1); +} + static const struct rockchip_crtc_funcs private_crtc_funcs = { .loader_protect = vop_crtc_loader_protect, .cancel_pending_vblank = vop_crtc_cancel_pending_vblank, @@ -3233,6 +3246,7 @@ static const struct rockchip_crtc_funcs private_crtc_funcs = { .crtc_close = vop_crtc_close, .crtc_send_mcu_cmd = vop_crtc_send_mcu_cmd, .wait_vact_end = vop_crtc_wait_vact_end, + .te_handler = vop_crtc_te_handler, }; static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, @@ -4273,7 +4287,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc, } else { VOP_CTRL_SET(vop, reg_done_frm, 0); } - if (vop->mcu_timing.mcu_pix_total) + if (vop->mcu_timing.mcu_pix_total && !s->soft_te) VOP_CTRL_SET(vop, mcu_hold_mode, 0); spin_unlock_irqrestore(&vop->irq_lock, flags);