diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 796541f8864a..81f27d7fe04f 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -2174,7 +2174,7 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all) unknown_pid = false; pr_debug("found process %s pid=%d mfd->ref=%d pinfo->ref=%d\n", - task->comm, mfd->ref_cnt, pinfo->pid, pinfo->ref_cnt); + task->comm, pinfo->pid, mfd->ref_cnt, pinfo->ref_cnt); proc_info = mdss_fb_release_file_entry(info, pinfo, release_all); @@ -2199,10 +2199,6 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all) pm_runtime_put(info->dev); } while (release_all && pinfo->ref_cnt); - /* we need to stop display thread before release */ - if (release_all && mfd->disp_thread) - mdss_fb_stop_disp_thread(mfd); - if (pinfo->ref_cnt == 0) { list_del(&pinfo->list); kfree(pinfo); @@ -2233,27 +2229,10 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all) } } - if (release_needed) { - pr_debug("current process=%s pid=%d known pid=%d mfd->ref=%d\n", - task->comm, current->tgid, pid, mfd->ref_cnt); - - if (mfd->mdp.release_fnc) { - ret = mfd->mdp.release_fnc(mfd, false, pid); - if (ret) - pr_err("error releasing fb%d for current pid=%d known pid=%d\n", - mfd->index, current->tgid, pid); - } - } else if (release_all && mfd->ref_cnt) { - pr_err("reference count mismatch with proc list entries\n"); - } - - if (!mfd->ref_cnt) { - if (mfd->mdp.release_fnc) { - ret = mfd->mdp.release_fnc(mfd, true, pid); - if (ret) - pr_err("error fb%d release current process=%s pid=%d known pid=%d\n", - mfd->index, task->comm, current->tgid, pid); - } + if (!mfd->ref_cnt || release_all) { + /* resources (if any) will be released during blank */ + if (mfd->mdp.release_fnc) + mfd->mdp.release_fnc(mfd, true, pid); if (mfd->fb_ion_handle) mdss_fb_free_fb_ion_memory(mfd); @@ -2266,6 +2245,17 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all) return ret; } atomic_set(&mfd->ioctl_ref_cnt, 0); + } else if (release_needed) { + pr_debug("current process=%s pid=%d known pid=%d mfd->ref=%d\n", + task->comm, current->tgid, pid, mfd->ref_cnt); + + if (mfd->mdp.release_fnc) { + ret = mfd->mdp.release_fnc(mfd, false, pid); + + /* display commit is needed to release resources */ + if (ret) + mdss_fb_pan_display(&mfd->fbi->var, mfd->fbi); + } } return ret; diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 4ebdb63534c1..9747b5b65cc0 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -1683,6 +1683,8 @@ done: * * Release any resources allocated by calling process, this can be called * on fb_release to release any overlays/rotator sessions left open. + * + * Return number of resources released */ static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd, bool release_all, uint32_t pid) @@ -1721,9 +1723,6 @@ static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd, } mutex_unlock(&mdp5_data->ov_lock); - if (cnt) - mfd->mdp.kickoff_fnc(mfd, NULL); - list_for_each_entry_safe(rot, tmp, &mdp5_data->rot_proc_list, list) { if (rot->pid == pid) { if (!list_empty(&rot->list)) @@ -1732,7 +1731,7 @@ static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd, } } - return 0; + return cnt; } static int mdss_mdp_overlay_play_wait(struct msm_fb_data_type *mfd,