diff --git a/drivers/media/platform/tegra/camera/tegracam_v4l2.c b/drivers/media/platform/tegra/camera/tegracam_v4l2.c index 7441a401..5a52a9de 100644 --- a/drivers/media/platform/tegra/camera/tegracam_v4l2.c +++ b/drivers/media/platform/tegra/camera/tegracam_v4l2.c @@ -1,8 +1,7 @@ -// SPDX-License-Identifier: GPL-2.0 +// SPDX-License-Identifier: GPL-2.0-only +// SPDX-FileCopyrightText: Copyright (c) 2018-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. /* * tegracam_v4l2 - tegra camera framework for v4l2 support - * - * Copyright (c) 2018-2022, NVIDIA CORPORATION. All rights reserved. */ #include #include @@ -112,6 +111,21 @@ 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_state *sd_state, + 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, diff --git a/drivers/media/platform/tegra/camera/vi/channel.c b/drivers/media/platform/tegra/camera/vi/channel.c index 5d365eea..6bd3f937 100644 --- a/drivers/media/platform/tegra/camera/vi/channel.c +++ b/drivers/media/platform/tegra/camera/vi/channel.c @@ -2347,10 +2347,34 @@ 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,