162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * vivid-vid-common.c - common video support functions.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/errno.h>
962306a36Sopenharmony_ci#include <linux/kernel.h>
1062306a36Sopenharmony_ci#include <linux/sched.h>
1162306a36Sopenharmony_ci#include <linux/videodev2.h>
1262306a36Sopenharmony_ci#include <linux/v4l2-dv-timings.h>
1362306a36Sopenharmony_ci#include <media/v4l2-common.h>
1462306a36Sopenharmony_ci#include <media/v4l2-event.h>
1562306a36Sopenharmony_ci#include <media/v4l2-dv-timings.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include "vivid-core.h"
1862306a36Sopenharmony_ci#include "vivid-vid-common.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciconst struct v4l2_dv_timings_cap vivid_dv_timings_cap = {
2162306a36Sopenharmony_ci	.type = V4L2_DV_BT_656_1120,
2262306a36Sopenharmony_ci	/* keep this initialization for compatibility with GCC < 4.4.6 */
2362306a36Sopenharmony_ci	.reserved = { 0 },
2462306a36Sopenharmony_ci	V4L2_INIT_BT_TIMINGS(16, MAX_WIDTH, 16, MAX_HEIGHT, 14000000, 775000000,
2562306a36Sopenharmony_ci		V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
2662306a36Sopenharmony_ci		V4L2_DV_BT_STD_CVT | V4L2_DV_BT_STD_GTF,
2762306a36Sopenharmony_ci		V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_INTERLACED)
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* ------------------------------------------------------------------
3162306a36Sopenharmony_ci	Basic structures
3262306a36Sopenharmony_ci   ------------------------------------------------------------------*/
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct vivid_fmt vivid_formats[] = {
3562306a36Sopenharmony_ci	{
3662306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUYV,
3762306a36Sopenharmony_ci		.vdownsampling = { 1 },
3862306a36Sopenharmony_ci		.bit_depth = { 16 },
3962306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
4062306a36Sopenharmony_ci		.planes   = 1,
4162306a36Sopenharmony_ci		.buffers = 1,
4262306a36Sopenharmony_ci		.data_offset = { PLANE0_DATA_OFFSET },
4362306a36Sopenharmony_ci	},
4462306a36Sopenharmony_ci	{
4562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_UYVY,
4662306a36Sopenharmony_ci		.vdownsampling = { 1 },
4762306a36Sopenharmony_ci		.bit_depth = { 16 },
4862306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
4962306a36Sopenharmony_ci		.planes   = 1,
5062306a36Sopenharmony_ci		.buffers = 1,
5162306a36Sopenharmony_ci	},
5262306a36Sopenharmony_ci	{
5362306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YVYU,
5462306a36Sopenharmony_ci		.vdownsampling = { 1 },
5562306a36Sopenharmony_ci		.bit_depth = { 16 },
5662306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
5762306a36Sopenharmony_ci		.planes   = 1,
5862306a36Sopenharmony_ci		.buffers = 1,
5962306a36Sopenharmony_ci	},
6062306a36Sopenharmony_ci	{
6162306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_VYUY,
6262306a36Sopenharmony_ci		.vdownsampling = { 1 },
6362306a36Sopenharmony_ci		.bit_depth = { 16 },
6462306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
6562306a36Sopenharmony_ci		.planes   = 1,
6662306a36Sopenharmony_ci		.buffers = 1,
6762306a36Sopenharmony_ci	},
6862306a36Sopenharmony_ci	{
6962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUV422P,
7062306a36Sopenharmony_ci		.vdownsampling = { 1, 1, 1 },
7162306a36Sopenharmony_ci		.bit_depth = { 8, 4, 4 },
7262306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
7362306a36Sopenharmony_ci		.planes   = 3,
7462306a36Sopenharmony_ci		.buffers = 1,
7562306a36Sopenharmony_ci	},
7662306a36Sopenharmony_ci	{
7762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUV420,
7862306a36Sopenharmony_ci		.vdownsampling = { 1, 2, 2 },
7962306a36Sopenharmony_ci		.bit_depth = { 8, 4, 4 },
8062306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
8162306a36Sopenharmony_ci		.planes   = 3,
8262306a36Sopenharmony_ci		.buffers = 1,
8362306a36Sopenharmony_ci	},
8462306a36Sopenharmony_ci	{
8562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YVU420,
8662306a36Sopenharmony_ci		.vdownsampling = { 1, 2, 2 },
8762306a36Sopenharmony_ci		.bit_depth = { 8, 4, 4 },
8862306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
8962306a36Sopenharmony_ci		.planes   = 3,
9062306a36Sopenharmony_ci		.buffers = 1,
9162306a36Sopenharmony_ci	},
9262306a36Sopenharmony_ci	{
9362306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV12,
9462306a36Sopenharmony_ci		.vdownsampling = { 1, 2 },
9562306a36Sopenharmony_ci		.bit_depth = { 8, 8 },
9662306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
9762306a36Sopenharmony_ci		.planes   = 2,
9862306a36Sopenharmony_ci		.buffers = 1,
9962306a36Sopenharmony_ci	},
10062306a36Sopenharmony_ci	{
10162306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV21,
10262306a36Sopenharmony_ci		.vdownsampling = { 1, 2 },
10362306a36Sopenharmony_ci		.bit_depth = { 8, 8 },
10462306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
10562306a36Sopenharmony_ci		.planes   = 2,
10662306a36Sopenharmony_ci		.buffers = 1,
10762306a36Sopenharmony_ci	},
10862306a36Sopenharmony_ci	{
10962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV16,
11062306a36Sopenharmony_ci		.vdownsampling = { 1, 1 },
11162306a36Sopenharmony_ci		.bit_depth = { 8, 8 },
11262306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
11362306a36Sopenharmony_ci		.planes   = 2,
11462306a36Sopenharmony_ci		.buffers = 1,
11562306a36Sopenharmony_ci	},
11662306a36Sopenharmony_ci	{
11762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV61,
11862306a36Sopenharmony_ci		.vdownsampling = { 1, 1 },
11962306a36Sopenharmony_ci		.bit_depth = { 8, 8 },
12062306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
12162306a36Sopenharmony_ci		.planes   = 2,
12262306a36Sopenharmony_ci		.buffers = 1,
12362306a36Sopenharmony_ci	},
12462306a36Sopenharmony_ci	{
12562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV24,
12662306a36Sopenharmony_ci		.vdownsampling = { 1, 1 },
12762306a36Sopenharmony_ci		.bit_depth = { 8, 16 },
12862306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
12962306a36Sopenharmony_ci		.planes   = 2,
13062306a36Sopenharmony_ci		.buffers = 1,
13162306a36Sopenharmony_ci	},
13262306a36Sopenharmony_ci	{
13362306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV42,
13462306a36Sopenharmony_ci		.vdownsampling = { 1, 1 },
13562306a36Sopenharmony_ci		.bit_depth = { 8, 16 },
13662306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
13762306a36Sopenharmony_ci		.planes   = 2,
13862306a36Sopenharmony_ci		.buffers = 1,
13962306a36Sopenharmony_ci	},
14062306a36Sopenharmony_ci	{
14162306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUV555, /* uuuvvvvv ayyyyyuu */
14262306a36Sopenharmony_ci		.vdownsampling = { 1 },
14362306a36Sopenharmony_ci		.bit_depth = { 16 },
14462306a36Sopenharmony_ci		.planes   = 1,
14562306a36Sopenharmony_ci		.buffers = 1,
14662306a36Sopenharmony_ci		.alpha_mask = 0x8000,
14762306a36Sopenharmony_ci	},
14862306a36Sopenharmony_ci	{
14962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUV565, /* uuuvvvvv yyyyyuuu */
15062306a36Sopenharmony_ci		.vdownsampling = { 1 },
15162306a36Sopenharmony_ci		.bit_depth = { 16 },
15262306a36Sopenharmony_ci		.planes   = 1,
15362306a36Sopenharmony_ci		.buffers = 1,
15462306a36Sopenharmony_ci	},
15562306a36Sopenharmony_ci	{
15662306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUV444, /* uuuuvvvv aaaayyyy */
15762306a36Sopenharmony_ci		.vdownsampling = { 1 },
15862306a36Sopenharmony_ci		.bit_depth = { 16 },
15962306a36Sopenharmony_ci		.planes   = 1,
16062306a36Sopenharmony_ci		.buffers = 1,
16162306a36Sopenharmony_ci		.alpha_mask = 0xf000,
16262306a36Sopenharmony_ci	},
16362306a36Sopenharmony_ci	{
16462306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUV32, /* ayuv */
16562306a36Sopenharmony_ci		.vdownsampling = { 1 },
16662306a36Sopenharmony_ci		.bit_depth = { 32 },
16762306a36Sopenharmony_ci		.planes   = 1,
16862306a36Sopenharmony_ci		.buffers = 1,
16962306a36Sopenharmony_ci		.alpha_mask = 0x000000ff,
17062306a36Sopenharmony_ci	},
17162306a36Sopenharmony_ci	{
17262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_AYUV32,
17362306a36Sopenharmony_ci		.vdownsampling = { 1 },
17462306a36Sopenharmony_ci		.bit_depth = { 32 },
17562306a36Sopenharmony_ci		.planes   = 1,
17662306a36Sopenharmony_ci		.buffers = 1,
17762306a36Sopenharmony_ci		.alpha_mask = 0x000000ff,
17862306a36Sopenharmony_ci	},
17962306a36Sopenharmony_ci	{
18062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_XYUV32,
18162306a36Sopenharmony_ci		.vdownsampling = { 1 },
18262306a36Sopenharmony_ci		.bit_depth = { 32 },
18362306a36Sopenharmony_ci		.planes   = 1,
18462306a36Sopenharmony_ci		.buffers = 1,
18562306a36Sopenharmony_ci	},
18662306a36Sopenharmony_ci	{
18762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_VUYA32,
18862306a36Sopenharmony_ci		.vdownsampling = { 1 },
18962306a36Sopenharmony_ci		.bit_depth = { 32 },
19062306a36Sopenharmony_ci		.planes   = 1,
19162306a36Sopenharmony_ci		.buffers = 1,
19262306a36Sopenharmony_ci		.alpha_mask = 0xff000000,
19362306a36Sopenharmony_ci	},
19462306a36Sopenharmony_ci	{
19562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_VUYX32,
19662306a36Sopenharmony_ci		.vdownsampling = { 1 },
19762306a36Sopenharmony_ci		.bit_depth = { 32 },
19862306a36Sopenharmony_ci		.planes   = 1,
19962306a36Sopenharmony_ci		.buffers = 1,
20062306a36Sopenharmony_ci	},
20162306a36Sopenharmony_ci	{
20262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUVA32,
20362306a36Sopenharmony_ci		.vdownsampling = { 1 },
20462306a36Sopenharmony_ci		.bit_depth = { 32 },
20562306a36Sopenharmony_ci		.planes   = 1,
20662306a36Sopenharmony_ci		.buffers = 1,
20762306a36Sopenharmony_ci		.alpha_mask = 0xff000000,
20862306a36Sopenharmony_ci	},
20962306a36Sopenharmony_ci	{
21062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUVX32,
21162306a36Sopenharmony_ci		.vdownsampling = { 1 },
21262306a36Sopenharmony_ci		.bit_depth = { 32 },
21362306a36Sopenharmony_ci		.planes   = 1,
21462306a36Sopenharmony_ci		.buffers = 1,
21562306a36Sopenharmony_ci	},
21662306a36Sopenharmony_ci	{
21762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_GREY,
21862306a36Sopenharmony_ci		.vdownsampling = { 1 },
21962306a36Sopenharmony_ci		.bit_depth = { 8 },
22062306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_LUMA,
22162306a36Sopenharmony_ci		.planes   = 1,
22262306a36Sopenharmony_ci		.buffers = 1,
22362306a36Sopenharmony_ci	},
22462306a36Sopenharmony_ci	{
22562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_Y10,
22662306a36Sopenharmony_ci		.vdownsampling = { 1 },
22762306a36Sopenharmony_ci		.bit_depth = { 16 },
22862306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_LUMA,
22962306a36Sopenharmony_ci		.planes   = 1,
23062306a36Sopenharmony_ci		.buffers = 1,
23162306a36Sopenharmony_ci	},
23262306a36Sopenharmony_ci	{
23362306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_Y12,
23462306a36Sopenharmony_ci		.vdownsampling = { 1 },
23562306a36Sopenharmony_ci		.bit_depth = { 16 },
23662306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_LUMA,
23762306a36Sopenharmony_ci		.planes   = 1,
23862306a36Sopenharmony_ci		.buffers = 1,
23962306a36Sopenharmony_ci	},
24062306a36Sopenharmony_ci	{
24162306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_Y16,
24262306a36Sopenharmony_ci		.vdownsampling = { 1 },
24362306a36Sopenharmony_ci		.bit_depth = { 16 },
24462306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_LUMA,
24562306a36Sopenharmony_ci		.planes   = 1,
24662306a36Sopenharmony_ci		.buffers = 1,
24762306a36Sopenharmony_ci	},
24862306a36Sopenharmony_ci	{
24962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_Y16_BE,
25062306a36Sopenharmony_ci		.vdownsampling = { 1 },
25162306a36Sopenharmony_ci		.bit_depth = { 16 },
25262306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_LUMA,
25362306a36Sopenharmony_ci		.planes   = 1,
25462306a36Sopenharmony_ci		.buffers = 1,
25562306a36Sopenharmony_ci	},
25662306a36Sopenharmony_ci	{
25762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGB332, /* rrrgggbb */
25862306a36Sopenharmony_ci		.vdownsampling = { 1 },
25962306a36Sopenharmony_ci		.bit_depth = { 8 },
26062306a36Sopenharmony_ci		.planes   = 1,
26162306a36Sopenharmony_ci		.buffers = 1,
26262306a36Sopenharmony_ci	},
26362306a36Sopenharmony_ci	{
26462306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */
26562306a36Sopenharmony_ci		.vdownsampling = { 1 },
26662306a36Sopenharmony_ci		.bit_depth = { 16 },
26762306a36Sopenharmony_ci		.planes   = 1,
26862306a36Sopenharmony_ci		.buffers = 1,
26962306a36Sopenharmony_ci		.can_do_overlay = true,
27062306a36Sopenharmony_ci	},
27162306a36Sopenharmony_ci	{
27262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGB565X, /* rrrrrggg gggbbbbb */
27362306a36Sopenharmony_ci		.vdownsampling = { 1 },
27462306a36Sopenharmony_ci		.bit_depth = { 16 },
27562306a36Sopenharmony_ci		.planes   = 1,
27662306a36Sopenharmony_ci		.buffers = 1,
27762306a36Sopenharmony_ci		.can_do_overlay = true,
27862306a36Sopenharmony_ci	},
27962306a36Sopenharmony_ci	{
28062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGB444, /* ggggbbbb xxxxrrrr */
28162306a36Sopenharmony_ci		.vdownsampling = { 1 },
28262306a36Sopenharmony_ci		.bit_depth = { 16 },
28362306a36Sopenharmony_ci		.planes   = 1,
28462306a36Sopenharmony_ci		.buffers = 1,
28562306a36Sopenharmony_ci	},
28662306a36Sopenharmony_ci	{
28762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_XRGB444, /* ggggbbbb xxxxrrrr */
28862306a36Sopenharmony_ci		.vdownsampling = { 1 },
28962306a36Sopenharmony_ci		.bit_depth = { 16 },
29062306a36Sopenharmony_ci		.planes   = 1,
29162306a36Sopenharmony_ci		.buffers = 1,
29262306a36Sopenharmony_ci	},
29362306a36Sopenharmony_ci	{
29462306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_ARGB444, /* ggggbbbb aaaarrrr */
29562306a36Sopenharmony_ci		.vdownsampling = { 1 },
29662306a36Sopenharmony_ci		.bit_depth = { 16 },
29762306a36Sopenharmony_ci		.planes   = 1,
29862306a36Sopenharmony_ci		.buffers = 1,
29962306a36Sopenharmony_ci		.alpha_mask = 0x00f0,
30062306a36Sopenharmony_ci	},
30162306a36Sopenharmony_ci	{
30262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGBX444, /* bbbbxxxx rrrrgggg */
30362306a36Sopenharmony_ci		.vdownsampling = { 1 },
30462306a36Sopenharmony_ci		.bit_depth = { 16 },
30562306a36Sopenharmony_ci		.planes   = 1,
30662306a36Sopenharmony_ci		.buffers = 1,
30762306a36Sopenharmony_ci	},
30862306a36Sopenharmony_ci	{
30962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGBA444, /* bbbbaaaa rrrrgggg */
31062306a36Sopenharmony_ci		.vdownsampling = { 1 },
31162306a36Sopenharmony_ci		.bit_depth = { 16 },
31262306a36Sopenharmony_ci		.planes   = 1,
31362306a36Sopenharmony_ci		.buffers = 1,
31462306a36Sopenharmony_ci		.alpha_mask = 0x00f0,
31562306a36Sopenharmony_ci	},
31662306a36Sopenharmony_ci	{
31762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_XBGR444, /* ggggrrrr xxxxbbbb */
31862306a36Sopenharmony_ci		.vdownsampling = { 1 },
31962306a36Sopenharmony_ci		.bit_depth = { 16 },
32062306a36Sopenharmony_ci		.planes   = 1,
32162306a36Sopenharmony_ci		.buffers = 1,
32262306a36Sopenharmony_ci	},
32362306a36Sopenharmony_ci	{
32462306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_ABGR444, /* ggggrrrr aaaabbbb */
32562306a36Sopenharmony_ci		.vdownsampling = { 1 },
32662306a36Sopenharmony_ci		.bit_depth = { 16 },
32762306a36Sopenharmony_ci		.planes   = 1,
32862306a36Sopenharmony_ci		.buffers = 1,
32962306a36Sopenharmony_ci		.alpha_mask = 0x00f0,
33062306a36Sopenharmony_ci	},
33162306a36Sopenharmony_ci	{
33262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_BGRX444, /* rrrrxxxx bbbbgggg */
33362306a36Sopenharmony_ci		.vdownsampling = { 1 },
33462306a36Sopenharmony_ci		.bit_depth = { 16 },
33562306a36Sopenharmony_ci		.planes   = 1,
33662306a36Sopenharmony_ci		.buffers = 1,
33762306a36Sopenharmony_ci	},
33862306a36Sopenharmony_ci	{
33962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_BGRA444, /* rrrraaaa bbbbgggg  */
34062306a36Sopenharmony_ci		.vdownsampling = { 1 },
34162306a36Sopenharmony_ci		.bit_depth = { 16 },
34262306a36Sopenharmony_ci		.planes   = 1,
34362306a36Sopenharmony_ci		.buffers = 1,
34462306a36Sopenharmony_ci		.alpha_mask = 0x00f0,
34562306a36Sopenharmony_ci	},
34662306a36Sopenharmony_ci	{
34762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGB555, /* gggbbbbb xrrrrrgg */
34862306a36Sopenharmony_ci		.vdownsampling = { 1 },
34962306a36Sopenharmony_ci		.bit_depth = { 16 },
35062306a36Sopenharmony_ci		.planes   = 1,
35162306a36Sopenharmony_ci		.buffers = 1,
35262306a36Sopenharmony_ci		.can_do_overlay = true,
35362306a36Sopenharmony_ci	},
35462306a36Sopenharmony_ci	{
35562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_XRGB555, /* gggbbbbb xrrrrrgg */
35662306a36Sopenharmony_ci		.vdownsampling = { 1 },
35762306a36Sopenharmony_ci		.bit_depth = { 16 },
35862306a36Sopenharmony_ci		.planes   = 1,
35962306a36Sopenharmony_ci		.buffers = 1,
36062306a36Sopenharmony_ci		.can_do_overlay = true,
36162306a36Sopenharmony_ci	},
36262306a36Sopenharmony_ci	{
36362306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_ARGB555, /* gggbbbbb arrrrrgg */
36462306a36Sopenharmony_ci		.vdownsampling = { 1 },
36562306a36Sopenharmony_ci		.bit_depth = { 16 },
36662306a36Sopenharmony_ci		.planes   = 1,
36762306a36Sopenharmony_ci		.buffers = 1,
36862306a36Sopenharmony_ci		.can_do_overlay = true,
36962306a36Sopenharmony_ci		.alpha_mask = 0x8000,
37062306a36Sopenharmony_ci	},
37162306a36Sopenharmony_ci	{
37262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGBX555, /* ggbbbbbx rrrrrggg */
37362306a36Sopenharmony_ci		.vdownsampling = { 1 },
37462306a36Sopenharmony_ci		.bit_depth = { 16 },
37562306a36Sopenharmony_ci		.planes   = 1,
37662306a36Sopenharmony_ci		.buffers = 1,
37762306a36Sopenharmony_ci		.can_do_overlay = true,
37862306a36Sopenharmony_ci	},
37962306a36Sopenharmony_ci	{
38062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGBA555, /* ggbbbbba rrrrrggg */
38162306a36Sopenharmony_ci		.vdownsampling = { 1 },
38262306a36Sopenharmony_ci		.bit_depth = { 16 },
38362306a36Sopenharmony_ci		.planes   = 1,
38462306a36Sopenharmony_ci		.buffers = 1,
38562306a36Sopenharmony_ci		.can_do_overlay = true,
38662306a36Sopenharmony_ci		.alpha_mask = 0x8000,
38762306a36Sopenharmony_ci	},
38862306a36Sopenharmony_ci	{
38962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_XBGR555, /* gggrrrrr xbbbbbgg */
39062306a36Sopenharmony_ci		.vdownsampling = { 1 },
39162306a36Sopenharmony_ci		.bit_depth = { 16 },
39262306a36Sopenharmony_ci		.planes   = 1,
39362306a36Sopenharmony_ci		.buffers = 1,
39462306a36Sopenharmony_ci		.can_do_overlay = true,
39562306a36Sopenharmony_ci	},
39662306a36Sopenharmony_ci	{
39762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_ABGR555, /* gggrrrrr abbbbbgg */
39862306a36Sopenharmony_ci		.vdownsampling = { 1 },
39962306a36Sopenharmony_ci		.bit_depth = { 16 },
40062306a36Sopenharmony_ci		.planes   = 1,
40162306a36Sopenharmony_ci		.buffers = 1,
40262306a36Sopenharmony_ci		.can_do_overlay = true,
40362306a36Sopenharmony_ci		.alpha_mask = 0x8000,
40462306a36Sopenharmony_ci	},
40562306a36Sopenharmony_ci	{
40662306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_BGRX555, /* ggrrrrrx bbbbbggg */
40762306a36Sopenharmony_ci		.vdownsampling = { 1 },
40862306a36Sopenharmony_ci		.bit_depth = { 16 },
40962306a36Sopenharmony_ci		.planes   = 1,
41062306a36Sopenharmony_ci		.buffers = 1,
41162306a36Sopenharmony_ci		.can_do_overlay = true,
41262306a36Sopenharmony_ci	},
41362306a36Sopenharmony_ci	{
41462306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_BGRA555, /* ggrrrrra bbbbbggg */
41562306a36Sopenharmony_ci		.vdownsampling = { 1 },
41662306a36Sopenharmony_ci		.bit_depth = { 16 },
41762306a36Sopenharmony_ci		.planes   = 1,
41862306a36Sopenharmony_ci		.buffers = 1,
41962306a36Sopenharmony_ci		.can_do_overlay = true,
42062306a36Sopenharmony_ci		.alpha_mask = 0x8000,
42162306a36Sopenharmony_ci	},
42262306a36Sopenharmony_ci	{
42362306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGB555X, /* xrrrrrgg gggbbbbb */
42462306a36Sopenharmony_ci		.vdownsampling = { 1 },
42562306a36Sopenharmony_ci		.bit_depth = { 16 },
42662306a36Sopenharmony_ci		.planes   = 1,
42762306a36Sopenharmony_ci		.buffers = 1,
42862306a36Sopenharmony_ci	},
42962306a36Sopenharmony_ci	{
43062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_XRGB555X, /* xrrrrrgg gggbbbbb */
43162306a36Sopenharmony_ci		.vdownsampling = { 1 },
43262306a36Sopenharmony_ci		.bit_depth = { 16 },
43362306a36Sopenharmony_ci		.planes   = 1,
43462306a36Sopenharmony_ci		.buffers = 1,
43562306a36Sopenharmony_ci	},
43662306a36Sopenharmony_ci	{
43762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_ARGB555X, /* arrrrrgg gggbbbbb */
43862306a36Sopenharmony_ci		.vdownsampling = { 1 },
43962306a36Sopenharmony_ci		.bit_depth = { 16 },
44062306a36Sopenharmony_ci		.planes   = 1,
44162306a36Sopenharmony_ci		.buffers = 1,
44262306a36Sopenharmony_ci		.alpha_mask = 0x0080,
44362306a36Sopenharmony_ci	},
44462306a36Sopenharmony_ci	{
44562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGB24, /* rgb */
44662306a36Sopenharmony_ci		.vdownsampling = { 1 },
44762306a36Sopenharmony_ci		.bit_depth = { 24 },
44862306a36Sopenharmony_ci		.planes   = 1,
44962306a36Sopenharmony_ci		.buffers = 1,
45062306a36Sopenharmony_ci	},
45162306a36Sopenharmony_ci	{
45262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_BGR24, /* bgr */
45362306a36Sopenharmony_ci		.vdownsampling = { 1 },
45462306a36Sopenharmony_ci		.bit_depth = { 24 },
45562306a36Sopenharmony_ci		.planes   = 1,
45662306a36Sopenharmony_ci		.buffers = 1,
45762306a36Sopenharmony_ci	},
45862306a36Sopenharmony_ci	{
45962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_BGR666, /* bbbbbbgg ggggrrrr rrxxxxxx */
46062306a36Sopenharmony_ci		.vdownsampling = { 1 },
46162306a36Sopenharmony_ci		.bit_depth = { 32 },
46262306a36Sopenharmony_ci		.planes   = 1,
46362306a36Sopenharmony_ci		.buffers = 1,
46462306a36Sopenharmony_ci	},
46562306a36Sopenharmony_ci	{
46662306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGB32, /* xrgb */
46762306a36Sopenharmony_ci		.vdownsampling = { 1 },
46862306a36Sopenharmony_ci		.bit_depth = { 32 },
46962306a36Sopenharmony_ci		.planes   = 1,
47062306a36Sopenharmony_ci		.buffers = 1,
47162306a36Sopenharmony_ci	},
47262306a36Sopenharmony_ci	{
47362306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_BGR32, /* bgrx */
47462306a36Sopenharmony_ci		.vdownsampling = { 1 },
47562306a36Sopenharmony_ci		.bit_depth = { 32 },
47662306a36Sopenharmony_ci		.planes   = 1,
47762306a36Sopenharmony_ci		.buffers = 1,
47862306a36Sopenharmony_ci	},
47962306a36Sopenharmony_ci	{
48062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_XRGB32, /* xrgb */
48162306a36Sopenharmony_ci		.vdownsampling = { 1 },
48262306a36Sopenharmony_ci		.bit_depth = { 32 },
48362306a36Sopenharmony_ci		.planes   = 1,
48462306a36Sopenharmony_ci		.buffers = 1,
48562306a36Sopenharmony_ci	},
48662306a36Sopenharmony_ci	{
48762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_XBGR32, /* bgrx */
48862306a36Sopenharmony_ci		.vdownsampling = { 1 },
48962306a36Sopenharmony_ci		.bit_depth = { 32 },
49062306a36Sopenharmony_ci		.planes   = 1,
49162306a36Sopenharmony_ci		.buffers = 1,
49262306a36Sopenharmony_ci	},
49362306a36Sopenharmony_ci	{
49462306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_ARGB32, /* argb */
49562306a36Sopenharmony_ci		.vdownsampling = { 1 },
49662306a36Sopenharmony_ci		.bit_depth = { 32 },
49762306a36Sopenharmony_ci		.planes   = 1,
49862306a36Sopenharmony_ci		.buffers = 1,
49962306a36Sopenharmony_ci		.alpha_mask = 0x000000ff,
50062306a36Sopenharmony_ci	},
50162306a36Sopenharmony_ci	{
50262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_ABGR32, /* bgra */
50362306a36Sopenharmony_ci		.vdownsampling = { 1 },
50462306a36Sopenharmony_ci		.bit_depth = { 32 },
50562306a36Sopenharmony_ci		.planes   = 1,
50662306a36Sopenharmony_ci		.buffers = 1,
50762306a36Sopenharmony_ci		.alpha_mask = 0xff000000,
50862306a36Sopenharmony_ci	},
50962306a36Sopenharmony_ci	{
51062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGBX32, /* rgbx */
51162306a36Sopenharmony_ci		.vdownsampling = { 1 },
51262306a36Sopenharmony_ci		.bit_depth = { 32 },
51362306a36Sopenharmony_ci		.planes   = 1,
51462306a36Sopenharmony_ci		.buffers = 1,
51562306a36Sopenharmony_ci	},
51662306a36Sopenharmony_ci	{
51762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_BGRX32, /* xbgr */
51862306a36Sopenharmony_ci		.vdownsampling = { 1 },
51962306a36Sopenharmony_ci		.bit_depth = { 32 },
52062306a36Sopenharmony_ci		.planes   = 1,
52162306a36Sopenharmony_ci		.buffers = 1,
52262306a36Sopenharmony_ci	},
52362306a36Sopenharmony_ci	{
52462306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_RGBA32, /* rgba */
52562306a36Sopenharmony_ci		.vdownsampling = { 1 },
52662306a36Sopenharmony_ci		.bit_depth = { 32 },
52762306a36Sopenharmony_ci		.planes   = 1,
52862306a36Sopenharmony_ci		.buffers = 1,
52962306a36Sopenharmony_ci		.alpha_mask = 0x000000ff,
53062306a36Sopenharmony_ci	},
53162306a36Sopenharmony_ci	{
53262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_BGRA32, /* abgr */
53362306a36Sopenharmony_ci		.vdownsampling = { 1 },
53462306a36Sopenharmony_ci		.bit_depth = { 32 },
53562306a36Sopenharmony_ci		.planes   = 1,
53662306a36Sopenharmony_ci		.buffers = 1,
53762306a36Sopenharmony_ci		.alpha_mask = 0xff000000,
53862306a36Sopenharmony_ci	},
53962306a36Sopenharmony_ci	{
54062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SBGGR8, /* Bayer BG/GR */
54162306a36Sopenharmony_ci		.vdownsampling = { 1 },
54262306a36Sopenharmony_ci		.bit_depth = { 8 },
54362306a36Sopenharmony_ci		.planes   = 1,
54462306a36Sopenharmony_ci		.buffers = 1,
54562306a36Sopenharmony_ci	},
54662306a36Sopenharmony_ci	{
54762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SGBRG8, /* Bayer GB/RG */
54862306a36Sopenharmony_ci		.vdownsampling = { 1 },
54962306a36Sopenharmony_ci		.bit_depth = { 8 },
55062306a36Sopenharmony_ci		.planes   = 1,
55162306a36Sopenharmony_ci		.buffers = 1,
55262306a36Sopenharmony_ci	},
55362306a36Sopenharmony_ci	{
55462306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SGRBG8, /* Bayer GR/BG */
55562306a36Sopenharmony_ci		.vdownsampling = { 1 },
55662306a36Sopenharmony_ci		.bit_depth = { 8 },
55762306a36Sopenharmony_ci		.planes   = 1,
55862306a36Sopenharmony_ci		.buffers = 1,
55962306a36Sopenharmony_ci	},
56062306a36Sopenharmony_ci	{
56162306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SRGGB8, /* Bayer RG/GB */
56262306a36Sopenharmony_ci		.vdownsampling = { 1 },
56362306a36Sopenharmony_ci		.bit_depth = { 8 },
56462306a36Sopenharmony_ci		.planes   = 1,
56562306a36Sopenharmony_ci		.buffers = 1,
56662306a36Sopenharmony_ci	},
56762306a36Sopenharmony_ci	{
56862306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SBGGR10, /* Bayer BG/GR */
56962306a36Sopenharmony_ci		.vdownsampling = { 1 },
57062306a36Sopenharmony_ci		.bit_depth = { 16 },
57162306a36Sopenharmony_ci		.planes   = 1,
57262306a36Sopenharmony_ci		.buffers = 1,
57362306a36Sopenharmony_ci	},
57462306a36Sopenharmony_ci	{
57562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SGBRG10, /* Bayer GB/RG */
57662306a36Sopenharmony_ci		.vdownsampling = { 1 },
57762306a36Sopenharmony_ci		.bit_depth = { 16 },
57862306a36Sopenharmony_ci		.planes   = 1,
57962306a36Sopenharmony_ci		.buffers = 1,
58062306a36Sopenharmony_ci	},
58162306a36Sopenharmony_ci	{
58262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SGRBG10, /* Bayer GR/BG */
58362306a36Sopenharmony_ci		.vdownsampling = { 1 },
58462306a36Sopenharmony_ci		.bit_depth = { 16 },
58562306a36Sopenharmony_ci		.planes   = 1,
58662306a36Sopenharmony_ci		.buffers = 1,
58762306a36Sopenharmony_ci	},
58862306a36Sopenharmony_ci	{
58962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SRGGB10, /* Bayer RG/GB */
59062306a36Sopenharmony_ci		.vdownsampling = { 1 },
59162306a36Sopenharmony_ci		.bit_depth = { 16 },
59262306a36Sopenharmony_ci		.planes   = 1,
59362306a36Sopenharmony_ci		.buffers = 1,
59462306a36Sopenharmony_ci	},
59562306a36Sopenharmony_ci	{
59662306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SBGGR12, /* Bayer BG/GR */
59762306a36Sopenharmony_ci		.vdownsampling = { 1 },
59862306a36Sopenharmony_ci		.bit_depth = { 16 },
59962306a36Sopenharmony_ci		.planes   = 1,
60062306a36Sopenharmony_ci		.buffers = 1,
60162306a36Sopenharmony_ci	},
60262306a36Sopenharmony_ci	{
60362306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SGBRG12, /* Bayer GB/RG */
60462306a36Sopenharmony_ci		.vdownsampling = { 1 },
60562306a36Sopenharmony_ci		.bit_depth = { 16 },
60662306a36Sopenharmony_ci		.planes   = 1,
60762306a36Sopenharmony_ci		.buffers = 1,
60862306a36Sopenharmony_ci	},
60962306a36Sopenharmony_ci	{
61062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SGRBG12, /* Bayer GR/BG */
61162306a36Sopenharmony_ci		.vdownsampling = { 1 },
61262306a36Sopenharmony_ci		.bit_depth = { 16 },
61362306a36Sopenharmony_ci		.planes   = 1,
61462306a36Sopenharmony_ci		.buffers = 1,
61562306a36Sopenharmony_ci	},
61662306a36Sopenharmony_ci	{
61762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SRGGB12, /* Bayer RG/GB */
61862306a36Sopenharmony_ci		.vdownsampling = { 1 },
61962306a36Sopenharmony_ci		.bit_depth = { 16 },
62062306a36Sopenharmony_ci		.planes   = 1,
62162306a36Sopenharmony_ci		.buffers = 1,
62262306a36Sopenharmony_ci	},
62362306a36Sopenharmony_ci	{
62462306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SBGGR16, /* Bayer BG/GR */
62562306a36Sopenharmony_ci		.vdownsampling = { 1 },
62662306a36Sopenharmony_ci		.bit_depth = { 16 },
62762306a36Sopenharmony_ci		.planes   = 1,
62862306a36Sopenharmony_ci		.buffers = 1,
62962306a36Sopenharmony_ci	},
63062306a36Sopenharmony_ci	{
63162306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SGBRG16, /* Bayer GB/RG */
63262306a36Sopenharmony_ci		.vdownsampling = { 1 },
63362306a36Sopenharmony_ci		.bit_depth = { 16 },
63462306a36Sopenharmony_ci		.planes   = 1,
63562306a36Sopenharmony_ci		.buffers = 1,
63662306a36Sopenharmony_ci	},
63762306a36Sopenharmony_ci	{
63862306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SGRBG16, /* Bayer GR/BG */
63962306a36Sopenharmony_ci		.vdownsampling = { 1 },
64062306a36Sopenharmony_ci		.bit_depth = { 16 },
64162306a36Sopenharmony_ci		.planes   = 1,
64262306a36Sopenharmony_ci		.buffers = 1,
64362306a36Sopenharmony_ci	},
64462306a36Sopenharmony_ci	{
64562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_SRGGB16, /* Bayer RG/GB */
64662306a36Sopenharmony_ci		.vdownsampling = { 1 },
64762306a36Sopenharmony_ci		.bit_depth = { 16 },
64862306a36Sopenharmony_ci		.planes   = 1,
64962306a36Sopenharmony_ci		.buffers = 1,
65062306a36Sopenharmony_ci	},
65162306a36Sopenharmony_ci	{
65262306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_HSV24, /* HSV 24bits */
65362306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_HSV,
65462306a36Sopenharmony_ci		.vdownsampling = { 1 },
65562306a36Sopenharmony_ci		.bit_depth = { 24 },
65662306a36Sopenharmony_ci		.planes   = 1,
65762306a36Sopenharmony_ci		.buffers = 1,
65862306a36Sopenharmony_ci	},
65962306a36Sopenharmony_ci	{
66062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_HSV32, /* HSV 32bits */
66162306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_HSV,
66262306a36Sopenharmony_ci		.vdownsampling = { 1 },
66362306a36Sopenharmony_ci		.bit_depth = { 32 },
66462306a36Sopenharmony_ci		.planes   = 1,
66562306a36Sopenharmony_ci		.buffers = 1,
66662306a36Sopenharmony_ci	},
66762306a36Sopenharmony_ci
66862306a36Sopenharmony_ci	/* Multiplanar formats */
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci	{
67162306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV16M,
67262306a36Sopenharmony_ci		.vdownsampling = { 1, 1 },
67362306a36Sopenharmony_ci		.bit_depth = { 8, 8 },
67462306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
67562306a36Sopenharmony_ci		.planes   = 2,
67662306a36Sopenharmony_ci		.buffers = 2,
67762306a36Sopenharmony_ci		.data_offset = { PLANE0_DATA_OFFSET, 0 },
67862306a36Sopenharmony_ci	},
67962306a36Sopenharmony_ci	{
68062306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV61M,
68162306a36Sopenharmony_ci		.vdownsampling = { 1, 1 },
68262306a36Sopenharmony_ci		.bit_depth = { 8, 8 },
68362306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
68462306a36Sopenharmony_ci		.planes   = 2,
68562306a36Sopenharmony_ci		.buffers = 2,
68662306a36Sopenharmony_ci		.data_offset = { 0, PLANE0_DATA_OFFSET },
68762306a36Sopenharmony_ci	},
68862306a36Sopenharmony_ci	{
68962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUV420M,
69062306a36Sopenharmony_ci		.vdownsampling = { 1, 2, 2 },
69162306a36Sopenharmony_ci		.bit_depth = { 8, 4, 4 },
69262306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
69362306a36Sopenharmony_ci		.planes   = 3,
69462306a36Sopenharmony_ci		.buffers = 3,
69562306a36Sopenharmony_ci	},
69662306a36Sopenharmony_ci	{
69762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YVU420M,
69862306a36Sopenharmony_ci		.vdownsampling = { 1, 2, 2 },
69962306a36Sopenharmony_ci		.bit_depth = { 8, 4, 4 },
70062306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
70162306a36Sopenharmony_ci		.planes   = 3,
70262306a36Sopenharmony_ci		.buffers = 3,
70362306a36Sopenharmony_ci	},
70462306a36Sopenharmony_ci	{
70562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV12M,
70662306a36Sopenharmony_ci		.vdownsampling = { 1, 2 },
70762306a36Sopenharmony_ci		.bit_depth = { 8, 8 },
70862306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
70962306a36Sopenharmony_ci		.planes   = 2,
71062306a36Sopenharmony_ci		.buffers = 2,
71162306a36Sopenharmony_ci	},
71262306a36Sopenharmony_ci	{
71362306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_NV21M,
71462306a36Sopenharmony_ci		.vdownsampling = { 1, 2 },
71562306a36Sopenharmony_ci		.bit_depth = { 8, 8 },
71662306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
71762306a36Sopenharmony_ci		.planes   = 2,
71862306a36Sopenharmony_ci		.buffers = 2,
71962306a36Sopenharmony_ci	},
72062306a36Sopenharmony_ci	{
72162306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUV422M,
72262306a36Sopenharmony_ci		.vdownsampling = { 1, 1, 1 },
72362306a36Sopenharmony_ci		.bit_depth = { 8, 4, 4 },
72462306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
72562306a36Sopenharmony_ci		.planes   = 3,
72662306a36Sopenharmony_ci		.buffers = 3,
72762306a36Sopenharmony_ci	},
72862306a36Sopenharmony_ci	{
72962306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YVU422M,
73062306a36Sopenharmony_ci		.vdownsampling = { 1, 1, 1 },
73162306a36Sopenharmony_ci		.bit_depth = { 8, 4, 4 },
73262306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
73362306a36Sopenharmony_ci		.planes   = 3,
73462306a36Sopenharmony_ci		.buffers = 3,
73562306a36Sopenharmony_ci	},
73662306a36Sopenharmony_ci	{
73762306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YUV444M,
73862306a36Sopenharmony_ci		.vdownsampling = { 1, 1, 1 },
73962306a36Sopenharmony_ci		.bit_depth = { 8, 8, 8 },
74062306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
74162306a36Sopenharmony_ci		.planes   = 3,
74262306a36Sopenharmony_ci		.buffers = 3,
74362306a36Sopenharmony_ci	},
74462306a36Sopenharmony_ci	{
74562306a36Sopenharmony_ci		.fourcc   = V4L2_PIX_FMT_YVU444M,
74662306a36Sopenharmony_ci		.vdownsampling = { 1, 1, 1 },
74762306a36Sopenharmony_ci		.bit_depth = { 8, 8, 8 },
74862306a36Sopenharmony_ci		.color_enc = TGP_COLOR_ENC_YCBCR,
74962306a36Sopenharmony_ci		.planes   = 3,
75062306a36Sopenharmony_ci		.buffers = 3,
75162306a36Sopenharmony_ci	},
75262306a36Sopenharmony_ci};
75362306a36Sopenharmony_ci
75462306a36Sopenharmony_ci/* There are this many multiplanar formats in the list */
75562306a36Sopenharmony_ci#define VIVID_MPLANAR_FORMATS 10
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_ciconst struct vivid_fmt *vivid_get_format(struct vivid_dev *dev, u32 pixelformat)
75862306a36Sopenharmony_ci{
75962306a36Sopenharmony_ci	const struct vivid_fmt *fmt;
76062306a36Sopenharmony_ci	unsigned k;
76162306a36Sopenharmony_ci
76262306a36Sopenharmony_ci	for (k = 0; k < ARRAY_SIZE(vivid_formats); k++) {
76362306a36Sopenharmony_ci		fmt = &vivid_formats[k];
76462306a36Sopenharmony_ci		if (fmt->fourcc == pixelformat)
76562306a36Sopenharmony_ci			if (fmt->buffers == 1 || dev->multiplanar)
76662306a36Sopenharmony_ci				return fmt;
76762306a36Sopenharmony_ci	}
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_ci	return NULL;
77062306a36Sopenharmony_ci}
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_cibool vivid_vid_can_loop(struct vivid_dev *dev)
77362306a36Sopenharmony_ci{
77462306a36Sopenharmony_ci	if (dev->src_rect.width != dev->sink_rect.width ||
77562306a36Sopenharmony_ci	    dev->src_rect.height != dev->sink_rect.height)
77662306a36Sopenharmony_ci		return false;
77762306a36Sopenharmony_ci	if (dev->fmt_cap->fourcc != dev->fmt_out->fourcc)
77862306a36Sopenharmony_ci		return false;
77962306a36Sopenharmony_ci	if (dev->field_cap != dev->field_out)
78062306a36Sopenharmony_ci		return false;
78162306a36Sopenharmony_ci	/*
78262306a36Sopenharmony_ci	 * While this can be supported, it is just too much work
78362306a36Sopenharmony_ci	 * to actually implement.
78462306a36Sopenharmony_ci	 */
78562306a36Sopenharmony_ci	if (dev->field_cap == V4L2_FIELD_SEQ_TB ||
78662306a36Sopenharmony_ci	    dev->field_cap == V4L2_FIELD_SEQ_BT)
78762306a36Sopenharmony_ci		return false;
78862306a36Sopenharmony_ci	if (vivid_is_svid_cap(dev) && vivid_is_svid_out(dev)) {
78962306a36Sopenharmony_ci		if (!(dev->std_cap[dev->input] & V4L2_STD_525_60) !=
79062306a36Sopenharmony_ci		    !(dev->std_out & V4L2_STD_525_60))
79162306a36Sopenharmony_ci			return false;
79262306a36Sopenharmony_ci		return true;
79362306a36Sopenharmony_ci	}
79462306a36Sopenharmony_ci	if (vivid_is_hdmi_cap(dev) && vivid_is_hdmi_out(dev))
79562306a36Sopenharmony_ci		return true;
79662306a36Sopenharmony_ci	return false;
79762306a36Sopenharmony_ci}
79862306a36Sopenharmony_ci
79962306a36Sopenharmony_civoid vivid_send_source_change(struct vivid_dev *dev, unsigned type)
80062306a36Sopenharmony_ci{
80162306a36Sopenharmony_ci	struct v4l2_event ev = {
80262306a36Sopenharmony_ci		.type = V4L2_EVENT_SOURCE_CHANGE,
80362306a36Sopenharmony_ci		.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
80462306a36Sopenharmony_ci	};
80562306a36Sopenharmony_ci	unsigned i;
80662306a36Sopenharmony_ci
80762306a36Sopenharmony_ci	for (i = 0; i < dev->num_inputs; i++) {
80862306a36Sopenharmony_ci		ev.id = i;
80962306a36Sopenharmony_ci		if (dev->input_type[i] == type) {
81062306a36Sopenharmony_ci			if (video_is_registered(&dev->vid_cap_dev) && dev->has_vid_cap)
81162306a36Sopenharmony_ci				v4l2_event_queue(&dev->vid_cap_dev, &ev);
81262306a36Sopenharmony_ci			if (video_is_registered(&dev->vbi_cap_dev) && dev->has_vbi_cap)
81362306a36Sopenharmony_ci				v4l2_event_queue(&dev->vbi_cap_dev, &ev);
81462306a36Sopenharmony_ci		}
81562306a36Sopenharmony_ci	}
81662306a36Sopenharmony_ci}
81762306a36Sopenharmony_ci
81862306a36Sopenharmony_ci/*
81962306a36Sopenharmony_ci * Conversion function that converts a single-planar format to a
82062306a36Sopenharmony_ci * single-plane multiplanar format.
82162306a36Sopenharmony_ci */
82262306a36Sopenharmony_civoid fmt_sp2mp(const struct v4l2_format *sp_fmt, struct v4l2_format *mp_fmt)
82362306a36Sopenharmony_ci{
82462306a36Sopenharmony_ci	struct v4l2_pix_format_mplane *mp = &mp_fmt->fmt.pix_mp;
82562306a36Sopenharmony_ci	struct v4l2_plane_pix_format *ppix = &mp->plane_fmt[0];
82662306a36Sopenharmony_ci	const struct v4l2_pix_format *pix = &sp_fmt->fmt.pix;
82762306a36Sopenharmony_ci	bool is_out = sp_fmt->type == V4L2_BUF_TYPE_VIDEO_OUTPUT;
82862306a36Sopenharmony_ci
82962306a36Sopenharmony_ci	memset(mp->reserved, 0, sizeof(mp->reserved));
83062306a36Sopenharmony_ci	mp_fmt->type = is_out ? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE :
83162306a36Sopenharmony_ci			   V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
83262306a36Sopenharmony_ci	mp->width = pix->width;
83362306a36Sopenharmony_ci	mp->height = pix->height;
83462306a36Sopenharmony_ci	mp->pixelformat = pix->pixelformat;
83562306a36Sopenharmony_ci	mp->field = pix->field;
83662306a36Sopenharmony_ci	mp->colorspace = pix->colorspace;
83762306a36Sopenharmony_ci	mp->xfer_func = pix->xfer_func;
83862306a36Sopenharmony_ci	/* Also copies hsv_enc */
83962306a36Sopenharmony_ci	mp->ycbcr_enc = pix->ycbcr_enc;
84062306a36Sopenharmony_ci	mp->quantization = pix->quantization;
84162306a36Sopenharmony_ci	mp->num_planes = 1;
84262306a36Sopenharmony_ci	mp->flags = pix->flags;
84362306a36Sopenharmony_ci	ppix->sizeimage = pix->sizeimage;
84462306a36Sopenharmony_ci	ppix->bytesperline = pix->bytesperline;
84562306a36Sopenharmony_ci	memset(ppix->reserved, 0, sizeof(ppix->reserved));
84662306a36Sopenharmony_ci}
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_ciint fmt_sp2mp_func(struct file *file, void *priv,
84962306a36Sopenharmony_ci		struct v4l2_format *f, fmtfunc func)
85062306a36Sopenharmony_ci{
85162306a36Sopenharmony_ci	struct v4l2_format fmt;
85262306a36Sopenharmony_ci	struct v4l2_pix_format_mplane *mp = &fmt.fmt.pix_mp;
85362306a36Sopenharmony_ci	struct v4l2_plane_pix_format *ppix = &mp->plane_fmt[0];
85462306a36Sopenharmony_ci	struct v4l2_pix_format *pix = &f->fmt.pix;
85562306a36Sopenharmony_ci	int ret;
85662306a36Sopenharmony_ci
85762306a36Sopenharmony_ci	/* Converts to a mplane format */
85862306a36Sopenharmony_ci	fmt_sp2mp(f, &fmt);
85962306a36Sopenharmony_ci	/* Passes it to the generic mplane format function */
86062306a36Sopenharmony_ci	ret = func(file, priv, &fmt);
86162306a36Sopenharmony_ci	/* Copies back the mplane data to the single plane format */
86262306a36Sopenharmony_ci	pix->width = mp->width;
86362306a36Sopenharmony_ci	pix->height = mp->height;
86462306a36Sopenharmony_ci	pix->pixelformat = mp->pixelformat;
86562306a36Sopenharmony_ci	pix->field = mp->field;
86662306a36Sopenharmony_ci	pix->colorspace = mp->colorspace;
86762306a36Sopenharmony_ci	pix->xfer_func = mp->xfer_func;
86862306a36Sopenharmony_ci	/* Also copies hsv_enc */
86962306a36Sopenharmony_ci	pix->ycbcr_enc = mp->ycbcr_enc;
87062306a36Sopenharmony_ci	pix->quantization = mp->quantization;
87162306a36Sopenharmony_ci	pix->sizeimage = ppix->sizeimage;
87262306a36Sopenharmony_ci	pix->bytesperline = ppix->bytesperline;
87362306a36Sopenharmony_ci	pix->flags = mp->flags;
87462306a36Sopenharmony_ci	return ret;
87562306a36Sopenharmony_ci}
87662306a36Sopenharmony_ci
87762306a36Sopenharmony_ciint vivid_vid_adjust_sel(unsigned flags, struct v4l2_rect *r)
87862306a36Sopenharmony_ci{
87962306a36Sopenharmony_ci	unsigned w = r->width;
88062306a36Sopenharmony_ci	unsigned h = r->height;
88162306a36Sopenharmony_ci
88262306a36Sopenharmony_ci	/* sanitize w and h in case someone passes ~0 as the value */
88362306a36Sopenharmony_ci	w &= 0xffff;
88462306a36Sopenharmony_ci	h &= 0xffff;
88562306a36Sopenharmony_ci	if (!(flags & V4L2_SEL_FLAG_LE)) {
88662306a36Sopenharmony_ci		w++;
88762306a36Sopenharmony_ci		h++;
88862306a36Sopenharmony_ci		if (w < 2)
88962306a36Sopenharmony_ci			w = 2;
89062306a36Sopenharmony_ci		if (h < 2)
89162306a36Sopenharmony_ci			h = 2;
89262306a36Sopenharmony_ci	}
89362306a36Sopenharmony_ci	if (!(flags & V4L2_SEL_FLAG_GE)) {
89462306a36Sopenharmony_ci		if (w > MAX_WIDTH)
89562306a36Sopenharmony_ci			w = MAX_WIDTH;
89662306a36Sopenharmony_ci		if (h > MAX_HEIGHT)
89762306a36Sopenharmony_ci			h = MAX_HEIGHT;
89862306a36Sopenharmony_ci	}
89962306a36Sopenharmony_ci	w = w & ~1;
90062306a36Sopenharmony_ci	h = h & ~1;
90162306a36Sopenharmony_ci	if (w < 2 || h < 2)
90262306a36Sopenharmony_ci		return -ERANGE;
90362306a36Sopenharmony_ci	if (w > MAX_WIDTH || h > MAX_HEIGHT)
90462306a36Sopenharmony_ci		return -ERANGE;
90562306a36Sopenharmony_ci	if (r->top < 0)
90662306a36Sopenharmony_ci		r->top = 0;
90762306a36Sopenharmony_ci	if (r->left < 0)
90862306a36Sopenharmony_ci		r->left = 0;
90962306a36Sopenharmony_ci	/* sanitize left and top in case someone passes ~0 as the value */
91062306a36Sopenharmony_ci	r->left &= 0xfffe;
91162306a36Sopenharmony_ci	r->top &= 0xfffe;
91262306a36Sopenharmony_ci	if (r->left + w > MAX_WIDTH)
91362306a36Sopenharmony_ci		r->left = MAX_WIDTH - w;
91462306a36Sopenharmony_ci	if (r->top + h > MAX_HEIGHT)
91562306a36Sopenharmony_ci		r->top = MAX_HEIGHT - h;
91662306a36Sopenharmony_ci	if ((flags & (V4L2_SEL_FLAG_GE | V4L2_SEL_FLAG_LE)) ==
91762306a36Sopenharmony_ci			(V4L2_SEL_FLAG_GE | V4L2_SEL_FLAG_LE) &&
91862306a36Sopenharmony_ci	    (r->width != w || r->height != h))
91962306a36Sopenharmony_ci		return -ERANGE;
92062306a36Sopenharmony_ci	r->width = w;
92162306a36Sopenharmony_ci	r->height = h;
92262306a36Sopenharmony_ci	return 0;
92362306a36Sopenharmony_ci}
92462306a36Sopenharmony_ci
92562306a36Sopenharmony_ciint vivid_enum_fmt_vid(struct file *file, void  *priv,
92662306a36Sopenharmony_ci					struct v4l2_fmtdesc *f)
92762306a36Sopenharmony_ci{
92862306a36Sopenharmony_ci	struct vivid_dev *dev = video_drvdata(file);
92962306a36Sopenharmony_ci	const struct vivid_fmt *fmt;
93062306a36Sopenharmony_ci
93162306a36Sopenharmony_ci	if (f->index >= ARRAY_SIZE(vivid_formats) -
93262306a36Sopenharmony_ci	    (dev->multiplanar ? 0 : VIVID_MPLANAR_FORMATS))
93362306a36Sopenharmony_ci		return -EINVAL;
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci	fmt = &vivid_formats[f->index];
93662306a36Sopenharmony_ci
93762306a36Sopenharmony_ci	f->pixelformat = fmt->fourcc;
93862306a36Sopenharmony_ci
93962306a36Sopenharmony_ci	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
94062306a36Sopenharmony_ci	    f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
94162306a36Sopenharmony_ci		return 0;
94262306a36Sopenharmony_ci	/*
94362306a36Sopenharmony_ci	 * For capture devices, we support the CSC API.
94462306a36Sopenharmony_ci	 * We allow userspace to:
94562306a36Sopenharmony_ci	 * 1. set the colorspace
94662306a36Sopenharmony_ci	 * 2. set the xfer_func
94762306a36Sopenharmony_ci	 * 3. set the ycbcr_enc on YUV formats
94862306a36Sopenharmony_ci	 * 4. set the hsv_enc on HSV formats
94962306a36Sopenharmony_ci	 * 5. set the quantization on YUV and RGB formats
95062306a36Sopenharmony_ci	 */
95162306a36Sopenharmony_ci	f->flags |= V4L2_FMT_FLAG_CSC_COLORSPACE;
95262306a36Sopenharmony_ci	f->flags |= V4L2_FMT_FLAG_CSC_XFER_FUNC;
95362306a36Sopenharmony_ci
95462306a36Sopenharmony_ci	if (fmt->color_enc == TGP_COLOR_ENC_YCBCR) {
95562306a36Sopenharmony_ci		f->flags |= V4L2_FMT_FLAG_CSC_YCBCR_ENC;
95662306a36Sopenharmony_ci		f->flags |= V4L2_FMT_FLAG_CSC_QUANTIZATION;
95762306a36Sopenharmony_ci	} else if (fmt->color_enc == TGP_COLOR_ENC_HSV) {
95862306a36Sopenharmony_ci		f->flags |= V4L2_FMT_FLAG_CSC_HSV_ENC;
95962306a36Sopenharmony_ci	} else if (fmt->color_enc == TGP_COLOR_ENC_RGB) {
96062306a36Sopenharmony_ci		f->flags |= V4L2_FMT_FLAG_CSC_QUANTIZATION;
96162306a36Sopenharmony_ci	}
96262306a36Sopenharmony_ci
96362306a36Sopenharmony_ci	return 0;
96462306a36Sopenharmony_ci}
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_ciint vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
96762306a36Sopenharmony_ci{
96862306a36Sopenharmony_ci	struct vivid_dev *dev = video_drvdata(file);
96962306a36Sopenharmony_ci	struct video_device *vdev = video_devdata(file);
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci	if (vdev->vfl_dir == VFL_DIR_RX) {
97262306a36Sopenharmony_ci		if (!vivid_is_sdtv_cap(dev))
97362306a36Sopenharmony_ci			return -ENODATA;
97462306a36Sopenharmony_ci		*id = dev->std_cap[dev->input];
97562306a36Sopenharmony_ci	} else {
97662306a36Sopenharmony_ci		if (!vivid_is_svid_out(dev))
97762306a36Sopenharmony_ci			return -ENODATA;
97862306a36Sopenharmony_ci		*id = dev->std_out;
97962306a36Sopenharmony_ci	}
98062306a36Sopenharmony_ci	return 0;
98162306a36Sopenharmony_ci}
98262306a36Sopenharmony_ci
98362306a36Sopenharmony_ciint vidioc_g_dv_timings(struct file *file, void *_fh,
98462306a36Sopenharmony_ci				    struct v4l2_dv_timings *timings)
98562306a36Sopenharmony_ci{
98662306a36Sopenharmony_ci	struct vivid_dev *dev = video_drvdata(file);
98762306a36Sopenharmony_ci	struct video_device *vdev = video_devdata(file);
98862306a36Sopenharmony_ci
98962306a36Sopenharmony_ci	if (vdev->vfl_dir == VFL_DIR_RX) {
99062306a36Sopenharmony_ci		if (!vivid_is_hdmi_cap(dev))
99162306a36Sopenharmony_ci			return -ENODATA;
99262306a36Sopenharmony_ci		*timings = dev->dv_timings_cap[dev->input];
99362306a36Sopenharmony_ci	} else {
99462306a36Sopenharmony_ci		if (!vivid_is_hdmi_out(dev))
99562306a36Sopenharmony_ci			return -ENODATA;
99662306a36Sopenharmony_ci		*timings = dev->dv_timings_out;
99762306a36Sopenharmony_ci	}
99862306a36Sopenharmony_ci	return 0;
99962306a36Sopenharmony_ci}
100062306a36Sopenharmony_ci
100162306a36Sopenharmony_ciint vidioc_enum_dv_timings(struct file *file, void *_fh,
100262306a36Sopenharmony_ci				    struct v4l2_enum_dv_timings *timings)
100362306a36Sopenharmony_ci{
100462306a36Sopenharmony_ci	struct vivid_dev *dev = video_drvdata(file);
100562306a36Sopenharmony_ci	struct video_device *vdev = video_devdata(file);
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_ci	if (vdev->vfl_dir == VFL_DIR_RX) {
100862306a36Sopenharmony_ci		if (!vivid_is_hdmi_cap(dev))
100962306a36Sopenharmony_ci			return -ENODATA;
101062306a36Sopenharmony_ci	} else {
101162306a36Sopenharmony_ci		if (!vivid_is_hdmi_out(dev))
101262306a36Sopenharmony_ci			return -ENODATA;
101362306a36Sopenharmony_ci	}
101462306a36Sopenharmony_ci	return v4l2_enum_dv_timings_cap(timings, &vivid_dv_timings_cap,
101562306a36Sopenharmony_ci			NULL, NULL);
101662306a36Sopenharmony_ci}
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_ciint vidioc_dv_timings_cap(struct file *file, void *_fh,
101962306a36Sopenharmony_ci				    struct v4l2_dv_timings_cap *cap)
102062306a36Sopenharmony_ci{
102162306a36Sopenharmony_ci	struct vivid_dev *dev = video_drvdata(file);
102262306a36Sopenharmony_ci	struct video_device *vdev = video_devdata(file);
102362306a36Sopenharmony_ci
102462306a36Sopenharmony_ci	if (vdev->vfl_dir == VFL_DIR_RX) {
102562306a36Sopenharmony_ci		if (!vivid_is_hdmi_cap(dev))
102662306a36Sopenharmony_ci			return -ENODATA;
102762306a36Sopenharmony_ci	} else {
102862306a36Sopenharmony_ci		if (!vivid_is_hdmi_out(dev))
102962306a36Sopenharmony_ci			return -ENODATA;
103062306a36Sopenharmony_ci	}
103162306a36Sopenharmony_ci	*cap = vivid_dv_timings_cap;
103262306a36Sopenharmony_ci	return 0;
103362306a36Sopenharmony_ci}
103462306a36Sopenharmony_ci
103562306a36Sopenharmony_ciint vidioc_g_edid(struct file *file, void *_fh,
103662306a36Sopenharmony_ci			 struct v4l2_edid *edid)
103762306a36Sopenharmony_ci{
103862306a36Sopenharmony_ci	struct vivid_dev *dev = video_drvdata(file);
103962306a36Sopenharmony_ci	struct video_device *vdev = video_devdata(file);
104062306a36Sopenharmony_ci	struct cec_adapter *adap;
104162306a36Sopenharmony_ci
104262306a36Sopenharmony_ci	memset(edid->reserved, 0, sizeof(edid->reserved));
104362306a36Sopenharmony_ci	if (vdev->vfl_dir == VFL_DIR_RX) {
104462306a36Sopenharmony_ci		if (edid->pad >= dev->num_inputs)
104562306a36Sopenharmony_ci			return -EINVAL;
104662306a36Sopenharmony_ci		if (dev->input_type[edid->pad] != HDMI)
104762306a36Sopenharmony_ci			return -EINVAL;
104862306a36Sopenharmony_ci		adap = dev->cec_rx_adap;
104962306a36Sopenharmony_ci	} else {
105062306a36Sopenharmony_ci		unsigned int bus_idx;
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_ci		if (edid->pad >= dev->num_outputs)
105362306a36Sopenharmony_ci			return -EINVAL;
105462306a36Sopenharmony_ci		if (dev->output_type[edid->pad] != HDMI)
105562306a36Sopenharmony_ci			return -EINVAL;
105662306a36Sopenharmony_ci		if (!dev->display_present[edid->pad])
105762306a36Sopenharmony_ci			return -ENODATA;
105862306a36Sopenharmony_ci		bus_idx = dev->cec_output2bus_map[edid->pad];
105962306a36Sopenharmony_ci		adap = dev->cec_tx_adap[bus_idx];
106062306a36Sopenharmony_ci	}
106162306a36Sopenharmony_ci	if (edid->start_block == 0 && edid->blocks == 0) {
106262306a36Sopenharmony_ci		edid->blocks = dev->edid_blocks;
106362306a36Sopenharmony_ci		return 0;
106462306a36Sopenharmony_ci	}
106562306a36Sopenharmony_ci	if (dev->edid_blocks == 0)
106662306a36Sopenharmony_ci		return -ENODATA;
106762306a36Sopenharmony_ci	if (edid->start_block >= dev->edid_blocks)
106862306a36Sopenharmony_ci		return -EINVAL;
106962306a36Sopenharmony_ci	if (edid->blocks > dev->edid_blocks - edid->start_block)
107062306a36Sopenharmony_ci		edid->blocks = dev->edid_blocks - edid->start_block;
107162306a36Sopenharmony_ci	if (adap)
107262306a36Sopenharmony_ci		v4l2_set_edid_phys_addr(dev->edid, dev->edid_blocks * 128, adap->phys_addr);
107362306a36Sopenharmony_ci	memcpy(edid->edid, dev->edid + edid->start_block * 128, edid->blocks * 128);
107462306a36Sopenharmony_ci	return 0;
107562306a36Sopenharmony_ci}
1076