Example #1
0
int fimc_hwset_input_burst_cnt(struct fimc_control *ctrl, u32 cnt)
{
	u32 cfg = readl(ctrl->regs + S3C_MSCTRL);
	cfg &= ~S3C_MSCTRL_BURST_CNT_MASK;

	if (cnt > 4)
		cnt = 4;
	else if (cnt == 0)
		cnt = 4;

	cfg |= S3C_MSCTRL_SUCCESSIVE_COUNT(cnt);
	writel(cfg, ctrl->regs + S3C_MSCTRL);

	return 0;
}
Example #2
0
void s3c_fimc_set_input_dma(struct s3c_fimc_control *ctrl)
{
	struct s3c_fimc_in_frame *frame = &ctrl->in_frame;
	u32 cfg;

	/* for offsets */
	cfg = 0;
	cfg |= S3C_CIIYOFF_HORIZONTAL(frame->offset.y_h);
	cfg |= S3C_CIIYOFF_VERTICAL(frame->offset.y_v);
	writel(cfg, ctrl->regs + S3C_CIIYOFF);

	cfg = 0;
	cfg |= S3C_CIICBOFF_HORIZONTAL(frame->offset.cb_h);
	cfg |= S3C_CIICBOFF_VERTICAL(frame->offset.cb_v);
	writel(cfg, ctrl->regs + S3C_CIICBOFF);

	cfg = 0;
	cfg |= S3C_CIICROFF_HORIZONTAL(frame->offset.cr_h);
	cfg |= S3C_CIICROFF_VERTICAL(frame->offset.cr_v);
	writel(cfg, ctrl->regs + S3C_CIICROFF);

	/* for original & real size */
	s3c_fimc_set_input_dma_size(ctrl);

	/* for input dma control */
	cfg = (S3C_MSCTRL_SUCCESSIVE_COUNT(4) | S3C_MSCTRL_INPUT_MEMORY);

	switch (frame->format) {
	case FORMAT_RGB565: /* fall through */
	case FORMAT_RGB666: /* fall through */
	case FORMAT_RGB888:
		cfg |= S3C_MSCTRL_INFORMAT_RGB;
		break;

	case FORMAT_YCBCR420:
		cfg |= S3C_MSCTRL_INFORMAT_YCBCR420;

		if (frame->planes == 2)
			cfg |= (S3C_MSCTRL_C_INT_IN_2PLANE | \
				(frame->order_2p << S3C_MSCTRL_2PLANE_SHIFT));
		else
			cfg |= S3C_MSCTRL_C_INT_IN_3PLANE;

		break;

	case FORMAT_YCBCR422:
		if (frame->planes == 1)
			cfg |= (frame->order_1p | \
				S3C_MSCTRL_INFORMAT_YCBCR422_1PLANE);
		else {
			cfg |= S3C_MSCTRL_INFORMAT_YCBCR422;

			if (frame->planes == 2)
				cfg |= (S3C_MSCTRL_C_INT_IN_2PLANE | \
					(frame->order_2p << S3C_MSCTRL_2PLANE_SHIFT));
			else
				cfg |= S3C_MSCTRL_C_INT_IN_3PLANE;
		}

		break;
	}

	writel(cfg, ctrl->regs + S3C_MSCTRL);
}