static int fimc_cap_s_selection(struct file *file, void *fh, struct v4l2_selection *s) { struct fimc_dev *fimc = video_drvdata(file); struct fimc_ctx *ctx = fimc->vid_cap.ctx; struct v4l2_rect rect = s->r; struct fimc_frame *f; unsigned long flags; unsigned int pad; if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) return -EINVAL; switch (s->target) { case V4L2_SEL_TGT_COMPOSE_DEFAULT: case V4L2_SEL_TGT_COMPOSE_BOUNDS: case V4L2_SEL_TGT_COMPOSE_ACTIVE: f = &ctx->d_frame; pad = FIMC_SD_PAD_SOURCE; break; case V4L2_SEL_TGT_CROP_BOUNDS: case V4L2_SEL_TGT_CROP_DEFAULT: case V4L2_SEL_TGT_CROP_ACTIVE: f = &ctx->s_frame; pad = FIMC_SD_PAD_SINK; break; default: return -EINVAL; } fimc_capture_try_crop(ctx, &rect, pad); if (s->flags & V4L2_SEL_FLAG_LE && !enclosed_rectangle(&rect, &s->r)) return -ERANGE; if (s->flags & V4L2_SEL_FLAG_GE && !enclosed_rectangle(&s->r, &rect)) return -ERANGE; s->r = rect; spin_lock_irqsave(&fimc->slock, flags); set_frame_crop(f, s->r.left, s->r.top, s->r.width, s->r.height); spin_unlock_irqrestore(&fimc->slock, flags); set_bit(ST_CAPT_APPLY_CFG, &fimc->state); return 0; }
static int fimc_cap_s_crop(struct file *file, void *fh, struct v4l2_crop *cr) { struct fimc_dev *fimc = video_drvdata(file); struct fimc_ctx *ctx = fimc->vid_cap.ctx; struct fimc_frame *ff; unsigned long flags; fimc_capture_try_crop(ctx, &cr->c, FIMC_SD_PAD_SINK); ff = &ctx->s_frame; spin_lock_irqsave(&fimc->slock, flags); set_frame_crop(ff, cr->c.left, cr->c.top, cr->c.width, cr->c.height); set_bit(ST_CAPT_APPLY_CFG, &fimc->state); spin_unlock_irqrestore(&fimc->slock, flags); return 0; }