static int flite_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) { struct flite_dev *flite = to_flite_dev(sd); struct flite_fmt const *f_fmt = find_flite_format(mf); struct flite_frame *f_frame = &flite->source_frame; flite_dbg("w: %d, h: %d", mf->width, mf->height); if (unlikely(!f_fmt)) { flite_err("f_fmt is null"); return -EINVAL; } flite->mbus_fmt = *mf; /* * These are the datas from fimc * If you want to crop the image, you can use s_crop */ f_frame->o_width = mf->width; f_frame->o_height = mf->height; f_frame->width = mf->width; f_frame->height = mf->height; f_frame->offs_h = 0; f_frame->offs_v = 0; return 0; }
int flite_hw_set_source_format(struct flite_dev *dev) { struct v4l2_mbus_framefmt *mbus_fmt = &dev->mbus_fmt; struct flite_fmt const *f_fmt = find_flite_format(mbus_fmt); u32 cfg = 0; if (!f_fmt) { flite_err("f_fmt is null"); return -EINVAL; } cfg = readl(dev->regs + FLITE_REG_CIGCTRL); cfg |= f_fmt->fmt_reg; writel(cfg, dev->regs + FLITE_REG_CIGCTRL); if (f_fmt->is_yuv) { cfg = readl(dev->regs + FLITE_REG_CISRCSIZE); switch (f_fmt->code) { case V4L2_MBUS_FMT_YUYV8_2X8: cfg |= FLITE_REG_CISRCSIZE_ORDER422_IN_YCBYCR; break; case V4L2_MBUS_FMT_YVYU8_2X8: cfg |= FLITE_REG_CISRCSIZE_ORDER422_IN_YCRYCB; break; case V4L2_MBUS_FMT_UYVY8_2X8: cfg |= FLITE_REG_CISRCSIZE_ORDER422_IN_CBYCRY; break; case V4L2_MBUS_FMT_VYUY8_2X8: cfg |= FLITE_REG_CISRCSIZE_ORDER422_IN_CRYCBY; break; default: flite_err("not supported mbus code"); return -EINVAL; } writel(cfg, dev->regs + FLITE_REG_CISRCSIZE); } return 0; }
static void flite_try_format(struct flite_dev *flite, struct v4l2_subdev_fh *fh, struct v4l2_mbus_framefmt *fmt, enum v4l2_subdev_format_whence which) { struct flite_fmt const *ffmt; struct flite_frame *f = &flite->source_frame; ffmt = find_flite_format(fmt); if (ffmt == NULL) ffmt = &flite_formats[1]; fmt->code = ffmt->code; fmt->width = clamp_t(u32, fmt->width, 1, FLITE_MAX_WIDTH_SIZE); fmt->height = clamp_t(u32, fmt->height, 1, FLITE_MAX_HEIGHT_SIZE); f->offs_h = f->offs_v = 0; f->width = f->o_width = fmt->width; f->height = f->o_height = fmt->height; fmt->colorspace = V4L2_COLORSPACE_JPEG; fmt->field = V4L2_FIELD_NONE; }