diff --git a/drivers/video/msm/mdp4_overlay.c b/drivers/video/msm/mdp4_overlay.c index a9d6d3de8cf..385d918144c 100644 --- a/drivers/video/msm/mdp4_overlay.c +++ b/drivers/video/msm/mdp4_overlay.c @@ -3432,6 +3432,8 @@ int mdp4_overlay_commit(struct fb_info *info, int mixer) mdp4_overlay_mdp_perf_upd(mfd, 1); + msm_fb_wait_for_fence(mfd); + if (mixer == MDP4_MIXER0) { if (ctrl->panel_mode & MDP4_PANEL_DSI_CMD) { /* cndx = 0 */ @@ -3447,6 +3449,7 @@ int mdp4_overlay_commit(struct fb_info *info, int mixer) if (ctrl->panel_mode & MDP4_PANEL_DTV) mdp4_dtv_pipe_commit(0, 1); } + msm_fb_signal_timeline(mfd); mdp4_overlay_mdp_perf_upd(mfd, 0); diff --git a/drivers/video/msm/msm_fb.c b/drivers/video/msm/msm_fb.c index cc739b9f829..ff3fe859a79 100644 --- a/drivers/video/msm/msm_fb.c +++ b/drivers/video/msm/msm_fb.c @@ -1754,8 +1754,34 @@ static int msm_fb_release(struct fb_info *info, int user) return ret; } -DEFINE_SEMAPHORE(msm_fb_pan_sem); +int msm_fb_wait_for_fence(struct msm_fb_data_type *mfd) +{ + int i, ret = 0; + /* buf sync */ + for (i = 0; i < mfd->acq_fen_cnt; i++) { + ret = sync_fence_wait(mfd->acq_fen[i], WAIT_FENCE_TIMEOUT); + sync_fence_put(mfd->acq_fen[i]); + if (ret < 0) { + pr_err("%s: sync_fence_wait failed! ret = %x\n", + __func__, ret); + break; + } + } + mfd->acq_fen_cnt = 0; + return ret; +} +int msm_fb_signal_timeline(struct msm_fb_data_type *mfd) +{ + if (mfd->timeline) { + sw_sync_timeline_inc(mfd->timeline, 1); + mfd->timeline_value++; + } + mfd->last_rel_fence = mfd->cur_rel_fence; + mfd->cur_rel_fence = 0; + return 0; +} +DEFINE_SEMAPHORE(msm_fb_pan_sem); static int msm_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { @@ -1763,7 +1789,6 @@ static int msm_fb_pan_display(struct fb_var_screeninfo *var, struct mdp_dirty_region *dirtyPtr = NULL; struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par; struct msm_fb_panel_data *pdata; - int i, ret; /* * If framebuffer is 2, io pen display is not allowed. @@ -1835,17 +1860,7 @@ static int msm_fb_pan_display(struct fb_var_screeninfo *var, mutex_unlock(&msm_fb_notify_update_sem); down(&msm_fb_pan_sem); - /* buf sync */ - for (i = 0; i < mfd->acq_fen_cnt; i++) { - ret = sync_fence_wait(mfd->acq_fen[i], WAIT_FENCE_TIMEOUT); - sync_fence_put(mfd->acq_fen[i]); - if (ret < 0) { - pr_err("%s: sync_fence_wait failed! ret = %x\n", - __func__, ret); - break; - } - } - mfd->acq_fen_cnt = 0; + msm_fb_wait_for_fence(mfd); if (info->node == 0 && !(mfd->cont_splash_done)) { /* primary */ mdp_set_dma_pan_info(info, NULL, TRUE); if (msm_fb_blank_sub(FB_BLANK_UNBLANK, info, mfd->op_enable)) { @@ -1862,12 +1877,7 @@ static int msm_fb_pan_display(struct fb_var_screeninfo *var, mdp_set_dma_pan_info(info, dirtyPtr, (var->activate == FB_ACTIVATE_VBL)); mdp_dma_pan_update(info); - if (mfd->timeline) { - sw_sync_timeline_inc(mfd->timeline, 1); - mfd->timeline_value++; - } - mfd->last_rel_fence = mfd->cur_rel_fence; - mfd->cur_rel_fence = 0; + msm_fb_signal_timeline(mfd); up(&msm_fb_pan_sem); if (unset_bl_level && !bl_updated) { diff --git a/drivers/video/msm/msm_fb.h b/drivers/video/msm/msm_fb.h index 25ee000ee33..da721320772 100644 --- a/drivers/video/msm/msm_fb.h +++ b/drivers/video/msm/msm_fb.h @@ -214,7 +214,8 @@ int msm_fb_writeback_stop(struct fb_info *info); int msm_fb_writeback_terminate(struct fb_info *info); int msm_fb_detect_client(const char *name); int calc_fb_offset(struct msm_fb_data_type *mfd, struct fb_info *fbi, int bpp); - +int msm_fb_wait_for_fence(struct msm_fb_data_type *mfd); +int msm_fb_signal_timeline(struct msm_fb_data_type *mfd); #ifdef CONFIG_FB_BACKLIGHT void msm_fb_config_backlight(struct msm_fb_data_type *mfd); #endif