static int fimc_is_bayer_video_s_ctrl(struct file *file, void *priv, struct v4l2_control *ctrl) { int ret = 0; struct fimc_is_video_sensor *video = file->private_data; struct fimc_is_device_sensor *sensor = video->common.device; switch (ctrl->id) { case V4L2_CID_IS_S_STREAM: if (ctrl->value == IS_ENABLE_STREAM) ret = fimc_is_sensor_front_start(sensor); else ret = fimc_is_sensor_front_stop(sensor); break; } return ret; }
static int fimc_is_sen_video_s_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; struct v4l2_subdev *subdev_flite; BUG_ON(!ctrl); BUG_ON(!vctx); device = vctx->device; if (!device) { err("device is NULL"); ret = -EINVAL; goto p_err; } subdev_flite = device->subdev_flite; if (!subdev_flite) { err("subdev_flite is NULL"); ret = -EINVAL; goto p_err; } switch (ctrl->id) { case V4L2_CID_IS_S_STREAM: { u32 sstream, instant, noblock; sstream = (ctrl->value & SENSOR_SSTREAM_MASK) >> SENSOR_SSTREAM_SHIFT; instant = (ctrl->value & SENSOR_INSTANT_MASK) >> SENSOR_INSTANT_SHIFT; noblock = (ctrl->value & SENSOR_NOBLOCK_MASK) >> SENSOR_NOBLOCK_SHIFT; /* * nonblock(0) : blocking command * nonblock(1) : non-blocking command */ if (sstream == IS_ENABLE_STREAM) { ret = fimc_is_sensor_front_start(device, instant, noblock); if (ret) { merr("fimc_is_sensor_front_start is fail(%d)", device, ret); goto p_err; } } else { ret = fimc_is_sensor_front_stop(device); if (ret) { merr("fimc_is_sensor_front_stop is fail(%d)", device, ret); goto p_err; } } } break; case V4L2_CID_IS_S_BNS: if (device->pdata->is_bns == false) { mwarn("Could not support BNS\n", device); goto p_err; } ret = fimc_is_sensor_s_bns(device, ctrl->value); if (ret) { merr("fimc_is_sensor_s_bns is fail(%d)", device, ret); goto p_err; } ret = v4l2_subdev_call(subdev_flite, core, s_ctrl, ctrl); if (ret) { merr("v4l2_flite_call(s_ctrl) is fail(%d)", device, ret); goto p_err; } break; /* * gain boost: min_target_fps, max_target_fps, scene_mode */ case V4L2_CID_IS_MIN_TARGET_FPS: if (test_bit(FIMC_IS_SENSOR_FRONT_START, &device->state)) { err("failed to set min_target_fps: %d - sensor stream on already\n", ctrl->value); ret = -EINVAL; } else { device->min_target_fps = ctrl->value; } break; case V4L2_CID_IS_MAX_TARGET_FPS: if (test_bit(FIMC_IS_SENSOR_FRONT_START, &device->state)) { err("failed to set max_target_fps: %d - sensor stream on already\n", ctrl->value); ret = -EINVAL; } else { device->max_target_fps = ctrl->value; } break; case V4L2_CID_IS_SCENE_MODE: if (test_bit(FIMC_IS_SENSOR_FRONT_START, &device->state)) { err("failed to set scene_mode: %d - sensor stream on already\n", ctrl->value); ret = -EINVAL; } else { device->scene_mode = ctrl->value; } break; case V4L2_CID_SENSOR_SET_FRAME_RATE: if (fimc_is_sensor_s_frame_duration(device, ctrl->value)) { err("failed to set frame duration : %d\n - %d", ctrl->value, ret); ret = -EINVAL; } break; case V4L2_CID_SENSOR_SET_AE_TARGET: if (fimc_is_sensor_s_exposure_time(device, ctrl->value)) { err("failed to set exposure time : %d\n - %d", ctrl->value, ret); ret = -EINVAL; } break; default: ret = fimc_is_sensor_s_ctrl(device, ctrl); if (ret) { err("invalid ioctl(0x%08X) is requested", ctrl->id); ret = -EINVAL; goto p_err; } break; } p_err: return ret; }