static void mdss_mdp_kcal_update_pcc(struct kcal_lut_data *lut_data) { u32 copyback = 0; struct mdp_pcc_cfg_data pcc_config; memset(&pcc_config, 0, sizeof(struct mdp_pcc_cfg_data)); lut_data->red = lut_data->red < lut_data->minimum ? lut_data->minimum : lut_data->red; lut_data->green = lut_data->green < lut_data->minimum ? lut_data->minimum : lut_data->green; lut_data->blue = lut_data->blue < lut_data->minimum ? lut_data->minimum : lut_data->blue; pcc_config.block = MDP_LOGICAL_BLOCK_DISP_0; pcc_config.ops = lut_data->enable ? MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE : MDP_PP_OPS_WRITE | MDP_PP_OPS_DISABLE; pcc_config.r.r = lut_data->red * PCC_ADJ; pcc_config.g.g = lut_data->green * PCC_ADJ; pcc_config.b.b = lut_data->blue * PCC_ADJ; if (lut_data->invert) { pcc_config.r.c = pcc_config.g.c = pcc_config.b.c = 0x7ff8; pcc_config.r.r |= (0xffff << 16); pcc_config.g.g |= (0xffff << 16); pcc_config.b.b |= (0xffff << 16); } mdss_mdp_pcc_config(&pcc_config, ©back); }
static void mdss_mdp_kcal_read_pcc(struct kcal_lut_data *lut_data) { u32 copyback = 0; struct mdp_pcc_cfg_data pcc_config; memset(&pcc_config, 0, sizeof(struct mdp_pcc_cfg_data)); pcc_config.block = MDP_LOGICAL_BLOCK_DISP_0; pcc_config.ops = MDP_PP_OPS_READ; mdss_mdp_pcc_config(&pcc_config, ©back); /* LiveDisplay disables pcc when using default values and regs * are zeroed on pp resume, so throw these values out. */ if (!pcc_config.r.r && !pcc_config.g.g && !pcc_config.b.b) return; lut_data->red = (pcc_config.r.r & 0xffff) / PCC_ADJ; lut_data->green = (pcc_config.g.g & 0xffff) / PCC_ADJ; lut_data->blue = (pcc_config.b.b & 0xffff) / PCC_ADJ; }