diff --git a/msm/dsi/dsi_ctrl.c b/msm/dsi/dsi_ctrl.c index ae79de1fbd..9170ee8a2e 100644 --- a/msm/dsi/dsi_ctrl.c +++ b/msm/dsi/dsi_ctrl.c @@ -1373,8 +1373,21 @@ static void dsi_kickoff_msg_tx(struct dsi_ctrl *dsi_ctrl, dsi_hw_ops.reset_trig_ctrl(&dsi_ctrl->hw, &dsi_ctrl->host_config.common_config); - /* check if custom dma scheduling line needed */ - if (flags & DSI_CTRL_CMD_CUSTOM_DMA_SCHED) + /* + * Always enable DMA scheduling for video mode panel. + * + * In video mode panel, if the DMA is triggered very close to + * the beginning of the active window and the DMA transfer + * happens in the last line of VBP, then the HW state will + * stay in ‘wait’ and return to ‘idle’ in the first line of VFP. + * But somewhere in the middle of the active window, if SW + * disables DSI command mode engine while the HW is still + * waiting and re-enable after timing engine is OFF. So the + * HW never ‘sees’ another vblank line and hence it gets + * stuck in the ‘wait’ state. + */ + if ((flags & DSI_CTRL_CMD_CUSTOM_DMA_SCHED) || + (dsi_ctrl->host_config.panel_mode == DSI_OP_VIDEO_MODE)) dsi_configure_command_scheduling(dsi_ctrl, cmd_mem); dsi_ctrl->cmd_mode = (dsi_ctrl->host_config.panel_mode ==