From 2e6dc83edee9b1fefcecf1cc87031117e4b966c5 Mon Sep 17 00:00:00 2001 From: Adrian Salido-Moreno Date: Sun, 16 Nov 2014 13:14:26 -0800 Subject: [PATCH] msm: mdss: fix rotator release all logic Rotator release all is called in cases such as shutdown or display going down. In these cases need to release all rotator resources, in current logic doesn't release all resources and ends up freeing session twice. Refactor release logic to ensure rotator resources are cleaned up. Change-Id: I453dfed96a6ee01328480737a5b619f67960360a Signed-off-by: Adrian Salido-Moreno --- drivers/video/fbdev/msm/mdss_mdp_rotator.c | 33 +++++++++++++++------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/drivers/video/fbdev/msm/mdss_mdp_rotator.c b/drivers/video/fbdev/msm/mdss_mdp_rotator.c index 077088ecb315..94dd33e0c01e 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_rotator.c +++ b/drivers/video/fbdev/msm/mdss_mdp_rotator.c @@ -325,7 +325,7 @@ static struct mdss_mdp_rotator_session struct mdss_mdp_rotator_session, head); if (rot) { - list_del(&rot->head); + list_del_init(&rot->head); rot_mgr->session_count--; } mutex_unlock(&rot_mgr->session_lock); @@ -340,8 +340,12 @@ static void mdss_mdp_rot_mgr_del_session(struct mdss_mdp_rotator_session *rot) return; } + /* if head is empty means that session was already removed */ + if (list_empty(&rot->head)) + return; + mutex_lock(&rot_mgr->session_lock); - list_del(&rot->head); + list_del_init(&rot->head); rot_mgr->session_count--; mutex_lock(&rot_mgr->pipe_lock); @@ -405,7 +409,13 @@ static void mdss_mdp_rotator_session_free( if (!list_empty(&rot->list)) list_del(&rot->list); - kfree(rot->rot_sync_pt_data); + if (rot->rot_sync_pt_data) { + struct sync_timeline *obj; + + obj = (struct sync_timeline *) rot->rot_sync_pt_data->timeline; + sync_timeline_destroy(obj); + kfree(rot->rot_sync_pt_data); + } kfree(rot); } @@ -936,6 +946,8 @@ int mdss_mdp_rotator_release(struct mdss_mdp_rotator_session *rot) int rc; rc = mdss_mdp_rotator_finish(rot); + mdss_mdp_data_free(&rot->src_buf); + mdss_mdp_data_free(&rot->dst_buf); mdss_mdp_rotator_session_free(rot); return rc; @@ -950,9 +962,14 @@ int mdss_mdp_rotator_release_all(void) if (!rot) break; - mdss_mdp_rotator_finish(rot); + mdss_mdp_rotator_release(rot); } + mutex_lock(&rot_mgr->pipe_lock); + if (rot_mgr->session_count < rot_mgr->pipe_count) + mdss_mdp_rot_mgr_remove_free_pipe(); + mutex_unlock(&rot_mgr->pipe_lock); + return 0; } @@ -1029,12 +1046,8 @@ int mdss_mdp_rotator_unset(int ndx) int ret = 0; rot = mdss_mdp_rot_mgr_get_session(ndx); - if (rot) { - ret = mdss_mdp_rotator_finish(rot); - mdss_mdp_data_free(&rot->src_buf); - mdss_mdp_data_free(&rot->dst_buf); - mdss_mdp_rotator_session_free(rot); - } + if (rot) + ret = mdss_mdp_rotator_release(rot); return ret; }