static int mdss_mdp_rotator_pipe_dequeue(struct mdss_mdp_rotator_session *rot) { int rc; if (rot->pipe) { pr_debug("reusing existing session=%d\n", rot->pipe->num); mdss_mdp_rotator_busy_wait(rot); list_move_tail(&rot->head, &rotator_queue); } else { struct mdss_mdp_rotator_session *tmp; rot->params_changed++; rot->pipe = mdss_mdp_rotator_pipe_alloc(); if (rot->pipe) { pr_debug("use new rotator pipe=%d\n", rot->pipe->num); list_add_tail(&rot->head, &rotator_queue); } else if (!list_empty(&rotator_queue)) { tmp = list_first_entry(&rotator_queue, struct mdss_mdp_rotator_session, head); rc = mdss_mdp_rotator_busy_wait(tmp); list_del(&tmp->head); if (rc) { pr_err("no pipe attached to session=%d\n", tmp->session_id); return rc; } else { pr_debug("waited for rotator pipe=%d\n", tmp->pipe->num); } rot->pipe = tmp->pipe; tmp->pipe = NULL; list_add_tail(&rot->head, &rotator_queue); } else {
static int mdss_mdp_rotator_pipe_dequeue(struct mdss_mdp_rotator_session *rot) { if (rot->pipe) { pr_debug("reusing existing session=%d\n", rot->pipe->num); mdss_mdp_rotator_busy_wait(rot); list_move_tail(&rot->head, &rotator_queue); } else { struct mdss_mdp_rotator_session *tmp; rot->params_changed++; rot->pipe = mdss_mdp_rotator_pipe_alloc(); if (rot->pipe) { pr_debug("use new rotator pipe=%d\n", rot->pipe->num); rot->pipe->mixer_stage = MDSS_MDP_STAGE_UNUSED; list_add_tail(&rot->head, &rotator_queue); } else if (!list_empty(&rotator_queue)) { tmp = list_first_entry(&rotator_queue, struct mdss_mdp_rotator_session, head); pr_debug("wait for rotator pipe=%d\n", tmp->pipe->num); mdss_mdp_rotator_busy_wait(tmp); rot->pipe = tmp->pipe; tmp->pipe = NULL; list_del(&tmp->head); list_add_tail(&rot->head, &rotator_queue); } else {
void mdss_mdp_rotator_wait4idle(void) { struct mdss_mdp_rotator_session *rot; int i; mutex_lock(&rotator_lock); for (i = 0; i < MAX_ROTATOR_SESSIONS; i++) { rot = &rotator_session[i]; if (rot->ref_cnt) mdss_mdp_rotator_busy_wait(rot); } mutex_unlock(&rotator_lock); }