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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 5
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));
	}
}