diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index 6dcc29d98136154b8365fb2701e86386f1727730..50d033f80df3959fd833b2cfc57d9eace5f30a4c 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -1152,38 +1152,6 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd) mutex_unlock(&mfd->bl_lock); } -static int mdss_fb_start_disp_thread(struct msm_fb_data_type *mfd) -{ - int ret = 0; - - pr_debug("%pS: start display thread fb%d\n", - __builtin_return_address(0), mfd->index); - - mdss_fb_get_split(mfd); - - atomic_set(&mfd->commits_pending, 0); - mfd->disp_thread = kthread_run(__mdss_fb_display_thread, - mfd, "mdss_fb%d", mfd->index); - - if (IS_ERR(mfd->disp_thread)) { - pr_err("ERROR: unable to start display thread %d\n", - mfd->index); - ret = PTR_ERR(mfd->disp_thread); - mfd->disp_thread = NULL; - } - - return ret; -} - -static void mdss_fb_stop_disp_thread(struct msm_fb_data_type *mfd) -{ - pr_debug("%pS: stop display thread fb%d\n", - __builtin_return_address(0), mfd->index); - - kthread_stop(mfd->disp_thread); - mfd->disp_thread = NULL; -} - static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd, int req_power_state) { @@ -1220,9 +1188,6 @@ static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd, mfd->op_enable = false; mutex_lock(&mfd->bl_lock); if (mdss_panel_is_power_off(req_power_state)) { - /* Stop Display thread */ - if (mfd->disp_thread) - mdss_fb_stop_disp_thread(mfd); mdss_fb_set_backlight(mfd, 0); mfd->bl_updated = 0; } @@ -1248,13 +1213,6 @@ static int mdss_fb_blank_unblank(struct msm_fb_data_type *mfd) if (!mfd) return -EINVAL; - /* Start Display thread */ - if (mfd->disp_thread == NULL) { - ret = mdss_fb_start_disp_thread(mfd); - if (IS_ERR_VALUE(ret)) - return ret; - } - cur_power_state = mfd->panel_power_state; pr_debug("Transitioning from %d --> %d\n", cur_power_state, MDSS_PANEL_POWER_ON); @@ -1269,10 +1227,8 @@ static int mdss_fb_blank_unblank(struct msm_fb_data_type *mfd) u32 temp; ret = mfd->mdp.on_fnc(mfd); - if (ret) { - mdss_fb_stop_disp_thread(mfd); + if (ret) goto error; - } mfd->panel_power_state = MDSS_PANEL_POWER_ON; mutex_lock(&mfd->update.lock); @@ -1326,9 +1282,6 @@ static int mdss_fb_blank_sub(int blank_mode, struct fb_info *info, if (mfd->dcm_state == DCM_ENTER) return -EPERM; - pr_debug("%pS mode:%d\n", __builtin_return_address(0), - blank_mode); - cur_power_state = mfd->panel_power_state; /* @@ -2160,6 +2113,17 @@ static int mdss_fb_open(struct fb_info *info, int user) } if (!mfd->ref_cnt) { + mdss_fb_get_split(mfd); + mfd->disp_thread = kthread_run(__mdss_fb_display_thread, mfd, + "mdss_fb%d", mfd->index); + if (IS_ERR(mfd->disp_thread)) { + pr_err("unable to start display thread %d\n", + mfd->index); + result = PTR_ERR(mfd->disp_thread); + mfd->disp_thread = NULL; + goto thread_error; + } + result = mdss_fb_blank_sub(FB_BLANK_UNBLANK, info, mfd->op_enable); if (result) { @@ -2175,6 +2139,10 @@ static int mdss_fb_open(struct fb_info *info, int user) return 0; blank_error: + kthread_stop(mfd->disp_thread); + mfd->disp_thread = NULL; + +thread_error: pm_runtime_put(info->dev); pm_error: @@ -2245,6 +2213,11 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all) pm_runtime_put(info->dev); } while (release_all && pinfo->ref_cnt); + if (release_all && mfd->disp_thread) { + kthread_stop(mfd->disp_thread); + mfd->disp_thread = NULL; + } + if (pinfo->ref_cnt == 0) { list_del(&pinfo->list); kfree(pinfo); @@ -2287,6 +2260,11 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all) } if (!mfd->ref_cnt) { + if (mfd->disp_thread) { + kthread_stop(mfd->disp_thread); + mfd->disp_thread = NULL; + } + if (mfd->mdp.release_fnc) { ret = mfd->mdp.release_fnc(mfd, true); if (ret)