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:
parent
4f5551fde5
commit
2e6dc83ede
1 changed files with 23 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue