static int mdss_mdp_kcal_display_commit(void) { int i; int ret = 0; struct mdss_mdp_ctl *ctl; struct mdss_data_type *mdata = mdss_mdp_get_mdata(); for (i = 0; i < mdata->nctl; i++) { ctl = mdata->ctl_off + i; /* pp setup requires mfd */ if ((ctl->power_on) && (ctl->mfd)) { ret = mdss_mdp_pp_setup(ctl); if (ret) pr_err("%s: setup failed: %d\n", __func__, ret); } } return ret; }
int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg) { int mixer1_changed, mixer2_changed; int ret = 0; int perf_update = MDSS_MDP_PERF_UPDATE_SKIP; u32 update_flags = 0; if (!ctl) { pr_err("display function not set\n"); return -ENODEV; } pr_debug("commit ctl=%d play_cnt=%d\n", ctl->num, ctl->play_cnt); ret = mutex_lock_interruptible(&ctl->lock); if (ret) return ret; if (!ctl->power_on) { mutex_unlock(&ctl->lock); return 0; } mixer1_changed = (ctl->mixer_left && ctl->mixer_left->params_changed); mixer2_changed = (ctl->mixer_right && ctl->mixer_right->params_changed); mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false); if (mixer1_changed || mixer2_changed) { perf_update = mdss_mdp_ctl_perf_update(ctl, &update_flags); if (ctl->prepare_fnc) ret = ctl->prepare_fnc(ctl, arg); if (ret) { pr_err("error preparing display\n"); goto done; } if (perf_update == MDSS_MDP_PERF_UPDATE_EARLY) mdss_mdp_ctl_perf_commit(update_flags); if (mixer1_changed) mdss_mdp_mixer_update(ctl->mixer_left); if (mixer2_changed) mdss_mdp_mixer_update(ctl->mixer_right); mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_TOP, ctl->opmode); ctl->flush_bits |= BIT(17); /* CTL */ } /* postprocessing setup, including dspp */ mdss_mdp_pp_setup(ctl); mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_FLUSH, ctl->flush_bits); wmb(); ctl->flush_bits = 0; if (ctl->display_fnc) ret = ctl->display_fnc(ctl, arg); /* kickoff */ if (ret) pr_warn("error displaying frame\n"); ctl->play_cnt++; if (perf_update == MDSS_MDP_PERF_UPDATE_LATE) mdss_mdp_ctl_perf_commit(update_flags); done: mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF, false); mutex_unlock(&ctl->lock); return ret; }