Revert "msm: mdss: fix race condition between commit thread and power off"
Revert this due to display deadlock on power off
This reverts commit 0ef56b89fefaa716a279e7e0b2bc4ea0a89ee259.
Bug: 20069498
Change-Id: Ie620231057d50048a9e7279390899c820bf94846
Signed-off-by: Devin Kim <dojip.kim@lge.com>
diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c
index 6dcc29d..50d033f 100644
--- a/drivers/video/msm/mdss/mdss_fb.c
+++ b/drivers/video/msm/mdss/mdss_fb.c
@@ -1152,38 +1152,6 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
}
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)