]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: vivid: add vivid_update_reduced_fps()
authorHans Verkuil <hverkuil+cisco@kernel.org>
Wed, 20 May 2026 07:30:44 +0000 (09:30 +0200)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Wed, 20 May 2026 14:00:39 +0000 (16:00 +0200)
Don't call vivid_update_format_cap() when switching to/from reduced fps
for HDMI inputs: that will also reset the format, which is overkill for
this.

Make a new vivid_update_reduced_fps() function that just updates the
dev->timeperframe_vid_cap.

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Fixes: c79aa6aeadb0 ("[media] vivid-capture: add control for reduced frame rate")
Cc: stable@vger.kernel.org
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/test-drivers/vivid/vivid-ctrls.c
drivers/media/test-drivers/vivid/vivid-vid-cap.c
drivers/media/test-drivers/vivid/vivid-vid-cap.h

index f94c15ff84f78faff220a314b6298495d6bd12bf..1077445f577260a87dbb9fc9d7446bb57ef93fc5 100644 (file)
@@ -609,7 +609,8 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
                break;
        case VIVID_CID_REDUCED_FPS:
                dev->reduced_fps = ctrl->val;
-               vivid_update_format_cap(dev, true);
+               if (dev->input_type[dev->input] == HDMI)
+                       vivid_update_reduced_fps(dev);
                break;
        case VIVID_CID_HAS_CROP_CAP:
                dev->has_crop_cap = ctrl->val;
index b95f06a9b5ae91408e161c505159707a4c5e7eae..76e0b161c049af7ba40d36c589a486e427c31b53 100644 (file)
@@ -364,6 +364,24 @@ static enum tpg_pixel_aspect vivid_get_pixel_aspect(const struct vivid_dev *dev)
        return TPG_PIXEL_ASPECT_SQUARE;
 }
 
+void vivid_update_reduced_fps(struct vivid_dev *dev)
+{
+       struct v4l2_bt_timings *bt = &dev->dv_timings_cap[dev->input].bt;
+       unsigned int size = V4L2_DV_BT_FRAME_WIDTH(bt) * V4L2_DV_BT_FRAME_HEIGHT(bt);
+       u64 pixelclock;
+
+       if (dev->reduced_fps && can_reduce_fps(bt)) {
+               pixelclock = div_u64(bt->pixelclock * 1000, 1001);
+               bt->flags |= V4L2_DV_FL_REDUCED_FPS;
+       } else {
+               pixelclock = bt->pixelclock;
+               bt->flags &= ~V4L2_DV_FL_REDUCED_FPS;
+       }
+       dev->timeperframe_vid_cap = (struct v4l2_fract) {
+               size / 100, (u32)pixelclock / 100
+       };
+}
+
 /*
  * Called whenever the format has to be reset which can occur when
  * changing inputs, standard, timings, etc.
@@ -372,8 +390,6 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls)
 {
        struct v4l2_bt_timings *bt = &dev->dv_timings_cap[dev->input].bt;
        u32 dims[V4L2_CTRL_MAX_DIMS] = {};
-       unsigned size;
-       u64 pixelclock;
 
        switch (dev->input_type[dev->input]) {
        case WEBCAM:
@@ -402,17 +418,7 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls)
        case HDMI:
                dev->src_rect.width = bt->width;
                dev->src_rect.height = bt->height;
-               size = V4L2_DV_BT_FRAME_WIDTH(bt) * V4L2_DV_BT_FRAME_HEIGHT(bt);
-               if (dev->reduced_fps && can_reduce_fps(bt)) {
-                       pixelclock = div_u64(bt->pixelclock * 1000, 1001);
-                       bt->flags |= V4L2_DV_FL_REDUCED_FPS;
-               } else {
-                       pixelclock = bt->pixelclock;
-                       bt->flags &= ~V4L2_DV_FL_REDUCED_FPS;
-               }
-               dev->timeperframe_vid_cap = (struct v4l2_fract) {
-                       size / 100, (u32)pixelclock / 100
-               };
+               vivid_update_reduced_fps(dev);
                if (bt->interlaced)
                        dev->field_cap = V4L2_FIELD_ALTERNATE;
                else
index 38a99f7e038eaa13477d5ce8ff7d4497b557f905..d08a85927510f1eaeeaec47b905d6e9ada3f9812 100644 (file)
@@ -9,6 +9,7 @@
 #define _VIVID_VID_CAP_H_
 
 void vivid_update_quality(struct vivid_dev *dev);
+void vivid_update_reduced_fps(struct vivid_dev *dev);
 void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls);
 void vivid_update_outputs(struct vivid_dev *dev);
 void vivid_update_connected_outputs(struct vivid_dev *dev);