static int fimc_is_sen_video_g_ctrl(struct file *file, void *priv, struct v4l2_control *ctrl) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; struct fimc_is_device_sensor *device; BUG_ON(!vctx); BUG_ON(!ctrl); device = vctx->device; if (!device) { err("device is NULL"); ret = -EINVAL; goto p_err; } switch (ctrl->id) { case V4L2_CID_IS_G_STREAM: if (device->instant_ret) ctrl->value = device->instant_ret; else ctrl->value = (test_bit(FIMC_IS_SENSOR_FRONT_START, &device->state) ? IS_ENABLE_STREAM : IS_DISABLE_STREAM); break; case V4L2_CID_IS_G_BNS_SIZE: { u32 width, height; width = fimc_is_sensor_g_bns_width(device); height = fimc_is_sensor_g_bns_height(device); ctrl->value = (width << 16) | height; } break; case V4L2_CID_IS_G_DTPSTATUS: if (test_bit(FIMC_IS_SENSOR_FRONT_DTP_STOP, &device->state)) ctrl->value = 1; else ctrl->value = 0; break; default: ret = fimc_is_sensor_g_ctrl(device, ctrl); if (ret) { err("invalid ioctl(0x%08X) is requested", ctrl->id); ret = -EINVAL; goto p_err; } break; } p_err: return ret; }
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/ 3aa size :(%d/%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), ((fimc_is_sensor_g_bns_width(device->sensor) - device->margin_width)), ((fimc_is_sensor_g_bns_height(device->sensor) - device->margin_height)), 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; }