media: tegra-video: Add support for V4L2_PIX_FMT_NV16
authorSowjanya Komatineni <skomatineni@nvidia.com>
Fri, 11 Dec 2020 17:02:33 +0000 (18:02 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 4 Jan 2021 11:56:43 +0000 (12:56 +0100)
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: Sowjanya Komatineni <skomatineni@nvidia.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/tegra-video/tegra210.c
drivers/staging/media/tegra-video/vi.c

index 68f09e4..b731aa5 100644 (file)
@@ -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 */
@@ -296,6 +297,18 @@ static int tegra_channel_capture_frame(struct tegra_vi_channel *chan,
        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.
         * Frame start and Memory write acknowledge syncpts has their own
index 7edd35c..525c087 100644 (file)
@@ -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,