media: common: saa7146: allow S_STD(G_STD)
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Thu, 2 Mar 2023 11:37:38 +0000 (11:37 +0000)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Sat, 15 Apr 2023 07:54:35 +0000 (08:54 +0100)
If the requested TV standard is identical to the current
TV standard, then return 0, even when the vb2 queues are
busy.

This fixes a V4L2 compliance issue.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/common/saa7146/saa7146_video.c

index 65045f7..aa1e55c 100644 (file)
@@ -463,14 +463,19 @@ static int vidioc_s_std(struct file *file, void *fh, v4l2_std_id id)
 
        DEB_EE("VIDIOC_S_STD\n");
 
+       for (i = 0; i < dev->ext_vv_data->num_stds; i++)
+               if (id & dev->ext_vv_data->stds[i].id)
+                       break;
+
+       if (i != dev->ext_vv_data->num_stds &&
+           vv->standard == &dev->ext_vv_data->stds[i])
+               return 0;
+
        if (vb2_is_busy(&vv->video_dmaq.q) || vb2_is_busy(&vv->vbi_dmaq.q)) {
                DEB_D("cannot change video standard while streaming capture is active\n");
                return -EBUSY;
        }
 
-       for (i = 0; i < dev->ext_vv_data->num_stds; i++)
-               if (id & dev->ext_vv_data->stds[i].id)
-                       break;
        if (i != dev->ext_vv_data->num_stds) {
                vv->standard = &dev->ext_vv_data->stds[i];
                if (NULL != dev->ext_vv_data->std_callback)