int fimc_is_dvfs_sel_static(struct fimc_is_device_ischain *device) { struct fimc_is_core *core; struct fimc_is_dvfs_ctrl *dvfs_ctrl; struct fimc_is_dvfs_scenario_ctrl *static_ctrl; struct fimc_is_dvfs_scenario *scenarios; struct fimc_is_resourcemgr *resourcemgr; int i, scenario_id, scenario_cnt; BUG_ON(!device); BUG_ON(!device->interface); core = (struct fimc_is_core *)device->interface->core; resourcemgr = device->resourcemgr; dvfs_ctrl = &(resourcemgr->dvfs_ctrl); static_ctrl = dvfs_ctrl->static_ctrl; /* static scenario */ if (!static_ctrl) { err("static_dvfs_ctrl is NULL\n"); return -EINVAL; } if (static_ctrl->scenario_cnt == 0) { pr_debug("static_scenario's count is zero\n"); return -EINVAL; } scenarios = static_ctrl->scenarios; scenario_cnt = static_ctrl->scenario_cnt; for (i = 0; i < scenario_cnt; i++) { if (!scenarios[i].check_func) { warn("check_func[%d] is NULL\n", i); continue; } if ((scenarios[i].check_func(device)) > 0) { scenario_id = scenarios[i].scenario_id; static_ctrl->cur_scenario_id = scenario_id; static_ctrl->cur_scenario_idx = i; static_ctrl->cur_frame_tick = scenarios[i].keep_frame_tick; return scenario_id; } } warn("couldn't find static dvfs scenario [sensor:(%d/%d)/fps:%d/setfile:%d/scp size:(%d/%d)]\n", fimc_is_get_open_sensor_cnt(core), device->sensor->pdev->id, fimc_is_sensor_g_framerate(device->sensor), (device->setfile & FIMC_IS_SETFILE_MASK), device->scp.output.width, device->scp.output.height); static_ctrl->cur_scenario_id = FIMC_IS_SN_DEFAULT; static_ctrl->cur_scenario_idx = -1; static_ctrl->cur_frame_tick = -1; return FIMC_IS_SN_DEFAULT; }
int fimc_is_dvfs_sel_scenario(u32 type, struct fimc_is_device_ischain *device, struct fimc_is_frame *frame) { struct fimc_is_dvfs_ctrl *dvfs_ctrl; struct fimc_is_dvfs_scenario_ctrl *static_ctrl, *dynamic_ctrl; struct fimc_is_dvfs_scenario *scenarios; struct fimc_is_dvfs_scenario *cur_scenario; struct fimc_is_resourcemgr *resourcemgr; int i, scenario_id, scenario_cnt; if (device == NULL) { err("device is NULL\n"); return -EINVAL; } resourcemgr = device->resourcemgr; dvfs_ctrl = &(resourcemgr->dvfs_ctrl); static_ctrl = dvfs_ctrl->static_ctrl; dynamic_ctrl = dvfs_ctrl->dynamic_ctrl; if (type == FIMC_IS_DYNAMIC_SN) { /* dynamic scenario */ if (!dynamic_ctrl) { err("dynamic_dvfs_ctrl is NULL\n"); return -EINVAL; } if (dynamic_ctrl->scenario_cnt == 0) { pr_debug("dynamic_scenario's count is jero\n"); return -EINVAL; } scenarios = dynamic_ctrl->scenarios; scenario_cnt = dynamic_ctrl->scenario_cnt; if (dynamic_ctrl->cur_frame_tick >= 0) { (dynamic_ctrl->cur_frame_tick)--; /* * when cur_frame_tick is lower than 0, clear current scenario. * This means that current frame tick to keep dynamic scenario * was expired. */ if (dynamic_ctrl->cur_frame_tick < 0) { dynamic_ctrl->cur_scenario_id = -1; dynamic_ctrl->cur_scenario_idx = -1; } } } else { /* static scenario */ if (!static_ctrl) { err("static_dvfs_ctrl is NULL\n"); return -EINVAL; } if (static_ctrl->scenario_cnt == 0) { pr_debug("static_scenario's count is jero\n"); return -EINVAL; } scenarios = static_ctrl->scenarios; scenario_cnt = static_ctrl->scenario_cnt; } for (i = 0; i < scenario_cnt; i++) { if (!scenarios[i].check_func) { warn("check_func[%d] is NULL\n", i); continue; } if ((scenarios[i].check_func(device, frame)) > 0) { scenario_id = scenarios[i].scenario_id; if (type == FIMC_IS_DYNAMIC_SN) { cur_scenario = &scenarios[dynamic_ctrl->cur_scenario_idx]; /* * if condition 1 or 2 is true * condition 1 : There's no dynamic scenario applied. * condition 2 : Finded scenario's prority was higher than current */ if ((dynamic_ctrl->cur_scenario_id <= 0) || (scenarios[i].priority < (cur_scenario->priority))) { dynamic_ctrl->cur_scenario_id = scenarios[i].scenario_id; dynamic_ctrl->cur_scenario_idx = i; dynamic_ctrl->cur_frame_tick = scenarios[i].keep_frame_tick; } else { /* if finded scenario is same */ if (scenarios[i].priority == (cur_scenario->priority)) dynamic_ctrl->cur_frame_tick = scenarios[i].keep_frame_tick; return -EAGAIN; } } else { static_ctrl->cur_scenario_id = scenario_id; static_ctrl->cur_scenario_idx = i; static_ctrl->cur_frame_tick = scenarios[i].keep_frame_tick; } return scenario_id; } } if (type == FIMC_IS_DYNAMIC_SN) return -EAGAIN; { struct fimc_is_core *core; int sensor_cnt = 0; core = (struct fimc_is_core *)device->interface->core; sensor_cnt = fimc_is_get_open_sensor_cnt(core); warn("couldn't find static dvfs scenario [sensor:(%d/%d)/fps:%d/setfile:%d/scp size:(%d/%d)]\n", sensor_cnt, device->sensor->pdev->id, fimc_is_sensor_g_framerate(device->sensor), (device->setfile & FIMC_IS_SETFILE_MASK), device->chain3_width, device->chain3_height); } static_ctrl->cur_scenario_id = FIMC_IS_SN_DEFAULT; static_ctrl->cur_scenario_idx = -1; static_ctrl->cur_frame_tick = -1; return FIMC_IS_SN_DEFAULT; }