From 7ad4c09866b459f1acdae7e5d707b3391bd85bfd Mon Sep 17 00:00:00 2001 From: Praveen AC Date: Mon, 30 Sep 2024 19:25:52 +0000 Subject: [PATCH] [t23x][camera]: Fix VIDIOC_G/S_PARM v4l2-compliance test fail. Implemented VIDIOC_G/S_PARM ioctl calls to fix v4l2-compliance test fail. Bug 4807063 Change-Id: Ia03b161b5659c710976084f277064a44d10aec15 Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3221436 (cherry picked from commit c3b8c1cd3e3e9baa32343eaeb73944dfde434bc7) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3262767 Reviewed-by: Amulya Yarlagadda Tested-by: Brad Griffis GVS: buildbot_gerritrpt Reviewed-by: Brad Griffis --- .../platform/tegra/camera/tegracam_v4l2.c | 17 +++++++++++++- .../media/platform/tegra/camera/vi/channel.c | 22 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/tegra/camera/tegracam_v4l2.c b/drivers/media/platform/tegra/camera/tegracam_v4l2.c index 7441a401..28ef43fd 100644 --- a/drivers/media/platform/tegra/camera/tegracam_v4l2.c +++ b/drivers/media/platform/tegra/camera/tegracam_v4l2.c @@ -2,7 +2,7 @@ /* * tegracam_v4l2 - tegra camera framework for v4l2 support * - * Copyright (c) 2018-2022, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2018-2024, NVIDIA CORPORATION. All rights reserved. */ #include #include @@ -112,9 +112,24 @@ static int v4l2sd_g_input_status(struct v4l2_subdev *sd, u32 *status) return 0; } +static int cam_g_frame_interval(struct v4l2_subdev *sd, struct v4l2_subdev_frame_interval *ival) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + struct camera_common_data *s_data = to_camera_common_data(&client->dev); + + if (!s_data) + return -EINVAL; + + ival->interval.denominator = s_data->frmfmt[s_data->mode_prop_idx].framerates[0]; + ival->interval.numerator = 1; + return 0; +} + static struct v4l2_subdev_video_ops v4l2sd_video_ops = { .s_stream = v4l2sd_stream, .g_input_status = v4l2sd_g_input_status, + .g_frame_interval = cam_g_frame_interval, + .s_frame_interval = cam_g_frame_interval, }; static struct v4l2_subdev_core_ops v4l2sd_core_ops = { diff --git a/drivers/media/platform/tegra/camera/vi/channel.c b/drivers/media/platform/tegra/camera/vi/channel.c index 6f98c645..46ecdb17 100644 --- a/drivers/media/platform/tegra/camera/vi/channel.c +++ b/drivers/media/platform/tegra/camera/vi/channel.c @@ -2281,10 +2281,32 @@ static long tegra_channel_default_ioctl(struct file *file, void *fh, return ret; } +/* Implemented vidioc_s_parm and vidioc_g_parm ioctl to support multiple frame + * rates */ +static int tegra_channel_s_parm(struct file *file, void *fh, + struct v4l2_streamparm *a) +{ + struct tegra_channel *chan = video_drvdata(file); + struct v4l2_subdev *sd = chan->subdev_on_csi; + + return v4l2_s_parm_cap(chan->video, sd, a); +} + +static int tegra_channel_g_parm(struct file *file, void *fh, + struct v4l2_streamparm *a) +{ + struct tegra_channel *chan = video_drvdata(file); + struct v4l2_subdev *sd = chan->subdev_on_csi; + + return v4l2_g_parm_cap(chan->video, sd, a); +} + static const struct v4l2_ioctl_ops tegra_channel_ioctl_ops = { .vidioc_querycap = tegra_channel_querycap, .vidioc_enum_framesizes = tegra_channel_enum_framesizes, .vidioc_enum_frameintervals = tegra_channel_enum_frameintervals, + .vidioc_s_parm = tegra_channel_s_parm, + .vidioc_g_parm = tegra_channel_g_parm, .vidioc_enum_fmt_vid_cap = tegra_channel_enum_format, .vidioc_g_fmt_vid_cap = tegra_channel_get_format, .vidioc_s_fmt_vid_cap = tegra_channel_set_format,