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,