OSDN Git Service

media: gspca: fix g/s_parm handling
authorHans Verkuil <hans.verkuil@cisco.com>
Sat, 12 May 2018 14:44:01 +0000 (10:44 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 28 May 2018 20:02:45 +0000 (16:02 -0400)
Fix v4l2-compliance error: s_parm never set V4L2_CAP_TIMEPERFRAME.
Also various g/s_parm-related cleanups.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/usb/gspca/gspca.c
drivers/media/usb/gspca/ov534.c
drivers/media/usb/gspca/topro.c

index ff229d3..a727996 100644 (file)
@@ -1256,14 +1256,15 @@ static int vidioc_g_parm(struct file *filp, void *priv,
 {
        struct gspca_dev *gspca_dev = video_drvdata(filp);
 
-       parm->parm.capture.readbuffers = 2;
+       parm->parm.capture.readbuffers = gspca_dev->queue.min_buffers_needed;
 
-       if (gspca_dev->sd_desc->get_streamparm) {
-               gspca_dev->usb_err = 0;
-               gspca_dev->sd_desc->get_streamparm(gspca_dev, parm);
-               return gspca_dev->usb_err;
-       }
-       return 0;
+       if (!gspca_dev->sd_desc->get_streamparm)
+               return 0;
+
+       parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
+       gspca_dev->usb_err = 0;
+       gspca_dev->sd_desc->get_streamparm(gspca_dev, parm);
+       return gspca_dev->usb_err;
 }
 
 static int vidioc_s_parm(struct file *filp, void *priv,
@@ -1271,15 +1272,17 @@ static int vidioc_s_parm(struct file *filp, void *priv,
 {
        struct gspca_dev *gspca_dev = video_drvdata(filp);
 
-       parm->parm.capture.readbuffers = 2;
+       parm->parm.capture.readbuffers = gspca_dev->queue.min_buffers_needed;
 
-       if (gspca_dev->sd_desc->set_streamparm) {
-               gspca_dev->usb_err = 0;
-               gspca_dev->sd_desc->set_streamparm(gspca_dev, parm);
-               return gspca_dev->usb_err;
+       if (!gspca_dev->sd_desc->set_streamparm) {
+               parm->parm.capture.capability = 0;
+               return 0;
        }
 
-       return 0;
+       parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
+       gspca_dev->usb_err = 0;
+       gspca_dev->sd_desc->set_streamparm(gspca_dev, parm);
+       return gspca_dev->usb_err;
 }
 
 static int gspca_queue_setup(struct vb2_queue *vq,
index f293921..d06dc07 100644 (file)
@@ -1476,7 +1476,6 @@ static void sd_get_streamparm(struct gspca_dev *gspca_dev,
        struct v4l2_fract *tpf = &cp->timeperframe;
        struct sd *sd = (struct sd *) gspca_dev;
 
-       cp->capability |= V4L2_CAP_TIMEPERFRAME;
        tpf->numerator = 1;
        tpf->denominator = sd->frame_rate;
 }
index 82e2be1..6f3ec03 100644 (file)
@@ -4780,7 +4780,6 @@ static void sd_get_streamparm(struct gspca_dev *gspca_dev,
        struct v4l2_fract *tpf = &cp->timeperframe;
        int fr, i;
 
-       cp->capability |= V4L2_CAP_TIMEPERFRAME;
        tpf->numerator = 1;
        i = get_fr_idx(gspca_dev);
        if (i & 0x80) {