void flite_hw_set_out_order(struct flite_dev *dev) { struct flite_frame *frame = &dev->d_frame; u32 cfg = readl(dev->regs + FLITE_REG_CIODMAFMT); if (frame->fmt->is_yuv) { switch (frame->fmt->code) { case V4L2_MBUS_FMT_UYVY8_2X8: cfg |= FLITE_REG_CIODMAFMT_CBYCRY; break; case V4L2_MBUS_FMT_VYUY8_2X8: cfg |= FLITE_REG_CIODMAFMT_CRYCBY; break; case V4L2_MBUS_FMT_YUYV8_2X8: cfg |= FLITE_REG_CIODMAFMT_YCBYCR; break; case V4L2_MBUS_FMT_YVYU8_2X8: cfg |= FLITE_REG_CIODMAFMT_YCRYCB; break; default: flite_err("not supported mbus_code"); break; } } else { switch (frame->fmt->code) { case V4L2_MBUS_FMT_SGRBG8_1X8: cfg |= FLITE_REG_CIODMAFMT_1D_DMA; break; default : flite_err("not supported mbus_code"); break; } } writel(cfg, dev->regs + FLITE_REG_CIODMAFMT); }
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; }
static int __init flite_init(void) { int ret = platform_driver_register(&flite_driver); if (ret) flite_err("platform_driver_register failed: %d", ret); return ret; }
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 int flite_link_setup(struct media_entity *entity, const struct media_pad *local, const struct media_pad *remote, u32 flags) { struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity); struct flite_dev *flite = to_flite_dev(sd); flite_info(""); switch (local->index | media_entity_type(remote->entity)) { case FLITE_PAD_SINK | MEDIA_ENT_T_V4L2_SUBDEV: if (flags & MEDIA_LNK_FL_ENABLED) { if (flite->input != FLITE_INPUT_NONE) { flite_err("link is busy"); return -EBUSY; } if (remote->index == CSIS_PAD_SOURCE) flite->input |= FLITE_INPUT_CSIS; else flite->input |= FLITE_INPUT_SENSOR; } else { flite->input = FLITE_INPUT_NONE; } break; case FLITE_PAD_SOURCE_PREVIEW | MEDIA_ENT_T_V4L2_SUBDEV: /* fall through */ case FLITE_PAD_SOURCE_CAMCORDING | MEDIA_ENT_T_V4L2_SUBDEV: if (flags & MEDIA_LNK_FL_ENABLED) flite->output = FLITE_OUTPUT_GSC; else flite->output = FLITE_OUTPUT_NONE; break; default: flite_err("ERR link"); return -EINVAL; } return 0; }
void flite_hw_set_output_addr(struct flite_dev *dev, struct flite_addr *addr, int index) { u32 cfg = 0; flite_dbg("dst_buf[%d]: 0x%X", index, addr->y); cfg = readl(dev->regs + FLITE_REG_CIOSA(index)); if (!cfg) { writel(addr->y, dev->regs + FLITE_REG_CIOSA(index)); } else if (cfg != addr->y) { flite_err("address is invalid(%08X != %08X)\n", cfg, addr->y); writel(addr->y, dev->regs + FLITE_REG_CIOSA(index)); } }