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 <adrianm@codeaurora.org>
This commit is contained in:
Adrian Salido-Moreno 2014-11-16 13:14:26 -08:00 committed by David Keitel
parent 4f5551fde5
commit 2e6dc83ede

View file

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