Commit fbef4d6b authored by Sowjanya Komatineni's avatar Sowjanya Komatineni Committed by Mauro Carvalho Chehab
Browse files

media: tegra-video: Add support for V4L2_PIX_FMT_NV16



NV16 are two-plane versions of YUV422 format.

VI/CSI surface0 registers corresponds to first Y plane and
surface1 registers corresponds to seconds UV plane.

This patch updates image size for NV16 format to include both planes
and programs VI/CSI surface1 registers for UV plane capture.

Signed-off-by: default avatarSowjanya Komatineni <skomatineni@nvidia.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 689bfcac
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -287,6 +287,7 @@ static int tegra_channel_capture_frame(struct tegra_vi_channel *chan,
{
	u32 thresh, value, frame_start, mw_ack_done;
	int bytes_per_line = chan->format.bytesperline;
	u32 sizeimage = chan->format.sizeimage;
	int err;

	/* program buffer address by using surface 0 */
@@ -295,6 +296,18 @@ static int tegra_channel_capture_frame(struct tegra_vi_channel *chan,
	vi_csi_write(chan, TEGRA_VI_CSI_SURFACE0_OFFSET_LSB, buf->addr);
	vi_csi_write(chan, TEGRA_VI_CSI_SURFACE0_STRIDE, bytes_per_line);

	/*
	 * Program surface 1 for UV plane with offset sizeimage from Y plane.
	 */
	if (chan->fmtinfo->fourcc == V4L2_PIX_FMT_NV16) {
		vi_csi_write(chan, TEGRA_VI_CSI_SURFACE1_OFFSET_MSB,
			     ((u64)buf->addr + sizeimage / 2) >> 32);
		vi_csi_write(chan, TEGRA_VI_CSI_SURFACE1_OFFSET_LSB,
			     buf->addr + sizeimage / 2);
		vi_csi_write(chan, TEGRA_VI_CSI_SURFACE1_STRIDE,
			     bytes_per_line);
	}

	/*
	 * Tegra VI block interacts with host1x syncpt for synchronizing
	 * programmed condition of capture state and hardware operation.
+2 −0
Original line number Diff line number Diff line
@@ -484,6 +484,8 @@ static void tegra_channel_fmt_align(struct tegra_vi_channel *chan,

	pix->bytesperline = clamp(bpl, min_bpl, max_bpl);
	pix->sizeimage = pix->bytesperline * pix->height;
	if (pix->pixelformat == V4L2_PIX_FMT_NV16)
		pix->sizeimage *= 2;
}

static int __tegra_channel_try_format(struct tegra_vi_channel *chan,