diff --git a/drivers/video/msm/mdp4_overlay_dsi_video.c b/drivers/video/msm/mdp4_overlay_dsi_video.c index 7f799b3a4ba..fd2f78109c1 100644 --- a/drivers/video/msm/mdp4_overlay_dsi_video.c +++ b/drivers/video/msm/mdp4_overlay_dsi_video.c @@ -425,6 +425,12 @@ static void mdp4_overlay_dsi_video_wait4event(struct msm_fb_data_type *mfd, int intr_done) { unsigned long flag; + unsigned int data; + + data = inpdw(MDP_BASE + DSI_VIDEO_BASE); + data &= 0x01; + if (data == 0) /* timing generator disabled */ + return; spin_lock_irqsave(&mdp_spin_lock, flag); INIT_COMPLETION(dsi_video_comp); @@ -557,7 +563,8 @@ static void mdp4_dsi_video_do_blt(struct msm_fb_data_type *mfd, int enable) * timing generator */ data = inpdw(MDP_BASE + DSI_VIDEO_BASE); - if (data) { /* timing generatore enabled */ + data &= 0x01; + if (data) { /* timing generator enabled */ mdp4_overlay_dsi_video_wait4event(mfd, INTR_DMA_P_DONE); MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 0); msleep(20); /* make sure last frame is finished */ @@ -566,7 +573,7 @@ static void mdp4_dsi_video_do_blt(struct msm_fb_data_type *mfd, int enable) mdp4_overlayproc_cfg(dsi_pipe); mdp4_overlay_dmap_xy(dsi_pipe); - if (data) { /* timing generatore enabled */ + if (data) { /* timing generator enabled */ MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 1); mdp4_overlay_dsi_video_wait4event(mfd, INTR_DMA_P_DONE); mdp4_overlay_dsi_video_wait4event(mfd, INTR_DMA_P_DONE); diff --git a/drivers/video/msm/mdp4_overlay_lcdc.c b/drivers/video/msm/mdp4_overlay_lcdc.c index e303f566efc..1bf103b9d66 100644 --- a/drivers/video/msm/mdp4_overlay_lcdc.c +++ b/drivers/video/msm/mdp4_overlay_lcdc.c @@ -253,6 +253,11 @@ int mdp_lcdc_on(struct platform_device *pdev) int mdp_lcdc_off(struct platform_device *pdev) { int ret = 0; + struct msm_fb_data_type *mfd; + + mfd = (struct msm_fb_data_type *)platform_get_drvdata(pdev); + + mutex_lock(&mfd->dma->ov_mutex); /* MDP cmd block enable */ mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); @@ -264,6 +269,8 @@ int mdp_lcdc_off(struct platform_device *pdev) mdp_histogram_ctrl(FALSE); ret = panel_next_off(pdev); + mutex_unlock(&mfd->dma->ov_mutex); + /* delay to make sure the last frame finishes */ msleep(16); @@ -338,6 +345,12 @@ static void mdp4_overlay_lcdc_wait4event(struct msm_fb_data_type *mfd, int intr_done) { unsigned long flag; + unsigned int data; + + data = inpdw(MDP_BASE + LCDC_BASE); + data &= 0x01; + if (data == 0) /* timing generator disabled */ + return; spin_lock_irqsave(&mdp_spin_lock, flag); INIT_COMPLETION(lcdc_comp);