[PATCH v1 06/10] media: tegra-video: vi: Adjust pad assignment logic

From: Svyatoslav Ryhel

Date: Fri Nov 13 2026 - 15:47:29 EST


The VI driver does not populate the pad entry in v4l2_subdev_*_enum
structures that contain it. Leaving it unpopulated assumes that the source
pad will always have index 0, which may not be true for more complex
sensor drivers.

To resolve this, assign the pad value in v4l2_subdev_*_enum using the
source pad index obtained via media_get_pad_index() from the source
subdev.

Signed-off-by: Svyatoslav Ryhel <clamor95@xxxxxxxxx>
---
.../media/platform/nvidia/tegra-video/vi.c | 30 +++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/nvidia/tegra-video/vi.c b/drivers/media/platform/nvidia/tegra-video/vi.c
index 5c649e3162fe3..0228a11013b05 100644
--- a/drivers/media/platform/nvidia/tegra-video/vi.c
+++ b/drivers/media/platform/nvidia/tegra-video/vi.c
@@ -348,6 +348,9 @@ static int tegra_channel_enum_framesizes(struct file *file, void *fh,
fse.code = fmtinfo->code;

subdev = tegra_channel_get_remote_source_subdev(chan);
+ fse.pad = media_get_pad_index(&subdev->entity, MEDIA_PAD_FL_SOURCE,
+ PAD_SIGNAL_DEFAULT);
+
ret = v4l2_subdev_call(subdev, pad, enum_frame_size, NULL, &fse);
if (ret)
return ret;
@@ -380,6 +383,9 @@ static int tegra_channel_enum_frameintervals(struct file *file, void *fh,
fie.code = fmtinfo->code;

subdev = tegra_channel_get_remote_source_subdev(chan);
+ fie.pad = media_get_pad_index(&subdev->entity, MEDIA_PAD_FL_SOURCE,
+ PAD_SIGNAL_DEFAULT);
+
ret = v4l2_subdev_call(subdev, pad, enum_frame_interval, NULL, &fie);
if (ret)
return ret;
@@ -465,7 +471,9 @@ static int __tegra_channel_try_format(struct tegra_vi_channel *chan,
}

pix->field = V4L2_FIELD_NONE;
- fmt.pad = 0;
+ fmt.pad = media_get_pad_index(&subdev->entity, MEDIA_PAD_FL_SOURCE,
+ PAD_SIGNAL_DEFAULT);
+
v4l2_fill_mbus_format(&fmt.format, pix, fmtinfo->code);

/*
@@ -540,9 +548,11 @@ static int tegra_channel_set_format(struct file *file, void *fh,

fmtinfo = tegra_get_format_by_fourcc(chan->vi, pix->pixelformat);

- fmt.pad = 0;
v4l2_fill_mbus_format(&fmt.format, pix, fmtinfo->code);
subdev = tegra_channel_get_remote_source_subdev(chan);
+ fmt.pad = media_get_pad_index(&subdev->entity, MEDIA_PAD_FL_SOURCE,
+ PAD_SIGNAL_DEFAULT);
+
ret = v4l2_subdev_call(subdev, pad, set_fmt, NULL, NULL, &fmt);
if (ret < 0)
return ret;
@@ -570,6 +580,9 @@ static int tegra_channel_set_subdev_active_fmt(struct tegra_vi_channel *chan)
* is corresponding match in the Tegra supported video formats.
*/
subdev = tegra_channel_get_remote_source_subdev(chan);
+ fmt.pad = media_get_pad_index(&subdev->entity, MEDIA_PAD_FL_SOURCE,
+ PAD_SIGNAL_DEFAULT);
+
ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt);
if (ret)
return ret;
@@ -614,6 +627,7 @@ static int tegra_channel_g_selection(struct file *file, void *priv,
.which = V4L2_SUBDEV_FORMAT_ACTIVE,
.target = sel->target,
};
+ u32 pad;
int ret;

subdev = tegra_channel_get_remote_source_subdev(chan);
@@ -622,6 +636,12 @@ static int tegra_channel_g_selection(struct file *file, void *priv,

if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
+
+ pad = media_get_pad_index(&subdev->entity, MEDIA_PAD_FL_SOURCE,
+ PAD_SIGNAL_DEFAULT);
+ fmt.pad = pad;
+ sdsel.pad = pad;
+
/*
* Try the get selection operation and fallback to get format if not
* implemented.
@@ -667,6 +687,9 @@ static int tegra_channel_s_selection(struct file *file, void *fh,
if (vb2_is_busy(&chan->queue))
return -EBUSY;

+ sdsel.pad = media_get_pad_index(&subdev->entity, MEDIA_PAD_FL_SOURCE,
+ PAD_SIGNAL_DEFAULT);
+
ret = v4l2_subdev_call(subdev, pad, set_selection, NULL, NULL, &sdsel);
if (!ret) {
sel->r = sdsel.r;
@@ -1041,6 +1064,9 @@ static int vi_fmts_bitmap_init(struct tegra_vi_channel *chan)
* supported video formats.
*/
subdev = tegra_channel_get_remote_source_subdev(chan);
+ code.pad = media_get_pad_index(&subdev->entity, MEDIA_PAD_FL_SOURCE,
+ PAD_SIGNAL_DEFAULT);
+
while (1) {
ret = v4l2_subdev_call(subdev, pad, enum_mbus_code,
NULL, &code);
--
2.53.0