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; }