static int s3c_fimc_v4l2_s_ctrl(struct file *filp, void *fh, struct v4l2_control *c) { struct s3c_fimc_control *ctrl = (struct s3c_fimc_control *) fh; struct s3c_fimc_out_frame *frame = &ctrl->out_frame; struct s3c_fimc_window_offset *offset = &ctrl->in_cam->offset; switch (c->id) { case V4L2_CID_EFFECT_ORIGINAL: frame->effect.type = EFFECT_ORIGINAL; s3c_fimc_change_effect(ctrl); break; case V4L2_CID_EFFECT_NEGATIVE: frame->effect.type = EFFECT_NEGATIVE; s3c_fimc_change_effect(ctrl); break; case V4L2_CID_EFFECT_EMBOSSING: frame->effect.type = EFFECT_EMBOSSING; s3c_fimc_change_effect(ctrl); break; case V4L2_CID_EFFECT_ARTFREEZE: frame->effect.type = EFFECT_ARTFREEZE; s3c_fimc_change_effect(ctrl); break; case V4L2_CID_EFFECT_SILHOUETTE: frame->effect.type = EFFECT_SILHOUETTE; s3c_fimc_change_effect(ctrl); break; case V4L2_CID_EFFECT_ARBITRARY: frame->effect.type = EFFECT_ARBITRARY; frame->effect.pat_cb = PAT_CB(c->value); frame->effect.pat_cr = PAT_CR(c->value); s3c_fimc_change_effect(ctrl); break; case V4L2_CID_ROTATE_ORIGINAL: frame->flip = FLIP_ORIGINAL; ctrl->rot90 = 0; s3c_fimc_change_rotate(ctrl); break; case V4L2_CID_HFLIP: frame->flip = FLIP_X_AXIS; ctrl->rot90 = 0; s3c_fimc_change_rotate(ctrl); break; case V4L2_CID_VFLIP: frame->flip = FLIP_Y_AXIS; ctrl->rot90 = 0; s3c_fimc_change_rotate(ctrl); break; case V4L2_CID_ROTATE_180: frame->flip = FLIP_XY_AXIS; ctrl->rot90 = 0; s3c_fimc_change_rotate(ctrl); break; case V4L2_CID_ROTATE_90: frame->flip = FLIP_ORIGINAL; ctrl->rot90 = 1; s3c_fimc_change_rotate(ctrl); break; case V4L2_CID_ROTATE_270: frame->flip = FLIP_XY_AXIS; ctrl->rot90 = 1; s3c_fimc_change_rotate(ctrl); break; case V4L2_CID_ROTATE_90_HFLIP: frame->flip = FLIP_X_AXIS; ctrl->rot90 = 1; s3c_fimc_change_rotate(ctrl); break; case V4L2_CID_ROTATE_90_VFLIP: frame->flip = FLIP_Y_AXIS; ctrl->rot90 = 1; s3c_fimc_change_rotate(ctrl); break; case V4L2_CID_ZOOM_IN: if (s3c_fimc_check_zoom(ctrl, c->id) == 0) { offset->h1 += S3C_FIMC_ZOOM_PIXELS; offset->h2 += S3C_FIMC_ZOOM_PIXELS; offset->v1 += S3C_FIMC_ZOOM_PIXELS; offset->v2 += S3C_FIMC_ZOOM_PIXELS; s3c_fimc_restart_dma(ctrl); } break; case V4L2_CID_ZOOM_OUT: if (s3c_fimc_check_zoom(ctrl, c->id) == 0) { offset->h1 -= S3C_FIMC_ZOOM_PIXELS; offset->h2 -= S3C_FIMC_ZOOM_PIXELS; offset->v1 -= S3C_FIMC_ZOOM_PIXELS; offset->v2 -= S3C_FIMC_ZOOM_PIXELS; s3c_fimc_restart_dma(ctrl); } break; case V4L2_CID_AUTO_WHITE_BALANCE: s3c_fimc_i2c_command(ctrl, I2C_CAM_WB, c->value); break; case V4L2_CID_ACTIVE_CAMERA: s3c_fimc_set_active_camera(ctrl, c->value); s3c_fimc_i2c_command(ctrl, I2C_CAM_WB, WB_AUTO); break; case V4L2_CID_TEST_PATTERN: s3c_fimc_set_active_camera(ctrl, S3C_FIMC_TPID); s3c_fimc_set_test_pattern(ctrl, c->value); break; case V4L2_CID_NR_FRAMES: s3c_fimc_set_nr_frames(ctrl, c->value); break; case V4L2_CID_INPUT_ADDR: s3c_fimc_alloc_input_memory(&ctrl->in_frame, \ (dma_addr_t) c->value); s3c_fimc_set_input_address(ctrl); break; case V4L2_CID_INPUT_ADDR_Y: case V4L2_CID_INPUT_ADDR_RGB: s3c_fimc_alloc_y_memory(&ctrl->in_frame, \ (dma_addr_t) c->value); s3c_fimc_set_input_address(ctrl); break; case V4L2_CID_INPUT_ADDR_CB: /* fall through */ case V4L2_CID_INPUT_ADDR_CBCR: s3c_fimc_alloc_cb_memory(&ctrl->in_frame, \ (dma_addr_t) c->value); s3c_fimc_set_input_address(ctrl); break; case V4L2_CID_INPUT_ADDR_CR: s3c_fimc_alloc_cr_memory(&ctrl->in_frame, \ (dma_addr_t) c->value); s3c_fimc_set_input_address(ctrl); break; case V4L2_CID_RESET: ctrl->rot90 = 0; ctrl->in_frame.flip = FLIP_ORIGINAL; ctrl->out_frame.flip = FLIP_ORIGINAL; ctrl->out_frame.effect.type = EFFECT_ORIGINAL; ctrl->scaler.bypass = 0; s3c_fimc_reset(ctrl); break; case V4L2_CID_JPEG_INPUT: /* fall through */ case V4L2_CID_SCALER_BYPASS: ctrl->scaler.bypass = 1; break; case V4L2_CID_THUMBNAIL_SIZE: frame->jpeg.thumb_res = c->value; break; case V4L2_CID_JPEG_QUALITY: frame->jpeg.quality = c->value - 1; break; default: err("invalid control id: %d\n", c->id); return -EINVAL; } return 0; }
static int nx_vip_v4l2_s_ctrl(struct file *filp, void *fh, struct v4l2_control *c) { struct nx_vip_control *ctrl = (struct nx_vip_control *) fh; struct nx_vip_out_frame *frame = &ctrl->out_frame; struct nx_vip_window_offset *offset = &ctrl->in_cam->offset; switch (c->id) { #if 0 case V4L2_CID_EFFECT_ORIGINAL: frame->effect.type = EFFECT_ORIGINAL; nx_vip_change_effect(ctrl); break; case V4L2_CID_EFFECT_NEGATIVE: frame->effect.type = EFFECT_NEGATIVE; nx_vip_change_effect(ctrl); break; case V4L2_CID_EFFECT_EMBOSSING: frame->effect.type = EFFECT_EMBOSSING; nx_vip_change_effect(ctrl); break; case V4L2_CID_EFFECT_ARTFREEZE: frame->effect.type = EFFECT_ARTFREEZE; nx_vip_change_effect(ctrl); break; case V4L2_CID_EFFECT_SILHOUETTE: frame->effect.type = EFFECT_SILHOUETTE; nx_vip_change_effect(ctrl); break; case V4L2_CID_EFFECT_ARBITRARY: frame->effect.type = EFFECT_ARBITRARY; frame->effect.pat_cb = PAT_CB(c->value); frame->effect.pat_cr = PAT_CR(c->value); nx_vip_change_effect(ctrl); break; case V4L2_CID_ROTATE_ORIGINAL: frame->flip = FLIP_ORIGINAL; ctrl->rot90 = 0; nx_vip_change_rotate(ctrl); break; case V4L2_CID_HFLIP: frame->flip = FLIP_X_AXIS; ctrl->rot90 = 0; nx_vip_change_rotate(ctrl); break; case V4L2_CID_VFLIP: frame->flip = FLIP_Y_AXIS; ctrl->rot90 = 0; nx_vip_change_rotate(ctrl); break; case V4L2_CID_ROTATE_180: frame->flip = FLIP_XY_AXIS; ctrl->rot90 = 0; nx_vip_change_rotate(ctrl); break; case V4L2_CID_ROTATE_90: frame->flip = FLIP_ORIGINAL; ctrl->rot90 = 1; nx_vip_change_rotate(ctrl); break; case V4L2_CID_ROTATE_270: frame->flip = FLIP_XY_AXIS; ctrl->rot90 = 1; nx_vip_change_rotate(ctrl); break; case V4L2_CID_ROTATE_90_HFLIP: frame->flip = FLIP_X_AXIS; ctrl->rot90 = 1; nx_vip_change_rotate(ctrl); break; case V4L2_CID_ROTATE_90_VFLIP: frame->flip = FLIP_Y_AXIS; ctrl->rot90 = 1; nx_vip_change_rotate(ctrl); break; case V4L2_CID_ZOOM_IN: if (nx_vip_check_zoom(ctrl, c->id) == 0) { offset->h1 += NX_VIP_ZOOM_PIXELS; offset->h2 += NX_VIP_ZOOM_PIXELS; offset->v1 += NX_VIP_ZOOM_PIXELS; offset->v2 += NX_VIP_ZOOM_PIXELS; nx_vip_restart_dma(ctrl); } break; case V4L2_CID_ZOOM_OUT: if (nx_vip_check_zoom(ctrl, c->id) == 0) { offset->h1 -= NX_VIP_ZOOM_PIXELS; offset->h2 -= NX_VIP_ZOOM_PIXELS; offset->v1 -= NX_VIP_ZOOM_PIXELS; offset->v2 -= NX_VIP_ZOOM_PIXELS; nx_vip_restart_dma(ctrl); } break; case V4L2_CID_AUTO_WHITE_BALANCE: nx_vip_i2c_command(ctrl, I2C_CAM_WB, c->value); break; case V4L2_CID_ACTIVE_CAMERA: nx_vip_set_active_camera(ctrl, c->value); nx_vip_i2c_command(ctrl, I2C_CAM_WB, WB_AUTO); break; case V4L2_CID_TEST_PATTERN: nx_vip_set_active_camera(ctrl, NX_VIP_TPID); nx_vip_set_test_pattern(ctrl, c->value); break; case V4L2_CID_NR_FRAMES: nx_vip_set_nr_frames(ctrl, c->value); break; case V4L2_CID_INPUT_ADDR: nx_vip_alloc_input_memory(&ctrl->in_frame, \ (dma_addr_t) c->value); nx_vip_set_input_address(ctrl); break; case V4L2_CID_INPUT_ADDR_Y: case V4L2_CID_INPUT_ADDR_RGB: nx_vip_alloc_y_memory(&ctrl->in_frame, \ (dma_addr_t) c->value); nx_vip_set_input_address(ctrl); break; case V4L2_CID_INPUT_ADDR_CB: /* fall through */ case V4L2_CID_INPUT_ADDR_CBCR: nx_vip_alloc_cb_memory(&ctrl->in_frame, \ (dma_addr_t) c->value); nx_vip_set_input_address(ctrl); break; case V4L2_CID_INPUT_ADDR_CR: nx_vip_alloc_cr_memory(&ctrl->in_frame, \ (dma_addr_t) c->value); nx_vip_set_input_address(ctrl); break; case V4L2_CID_RESET: ctrl->rot90 = 0; ctrl->in_frame.flip = FLIP_ORIGINAL; ctrl->out_frame.flip = FLIP_ORIGINAL; ctrl->out_frame.effect.type = EFFECT_ORIGINAL; ctrl->scaler.bypass = 0; nx_vip_reset(ctrl); break; case V4L2_CID_JPEG_INPUT: /* fall through */ case V4L2_CID_SCALER_BYPASS: ctrl->scaler.bypass = 1; break; #endif case V4L2_CID_BLACK_LEVEL: // Do nothing but implemented.. break; case V4L2_CID_BRIGHTNESS: // Do nothing but implemeted.. nx_vip_i2c_command(ctrl, I2C_CAM_BRIGHTNESS, c->value); break; case V4L2_CID_POWER_SAVE: // Do nothing but implemeted.. nx_vip_i2c_command(ctrl, I2C_CAM_POWER_SAVE, c->value); break; default: err("invalid control id: %d\n", c->id); return -EINVAL; } return 0; }