V4L/DVB (9876): gspca - main: Allow subdrivers to handle v4l2_streamparm requests.
authorJim Paris <jim@jtan.com>
Wed, 10 Dec 2008 09:02:42 +0000 (06:02 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 30 Dec 2008 11:39:01 +0000 (09:39 -0200)
Add get_streamparm and set_streamparm operations so subdrivers can
get/set stream parameters such as framerate.

Signed-off-by: Jim Paris <jim@jtan.com>
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/gspca.c
drivers/media/video/gspca/gspca.h

index a5c21ca959d8339c63cd7b576850f12f7226863b..76cfb096e4f8558b0e69a990e318f496f2067cdf 100644 (file)
@@ -1327,6 +1327,17 @@ static int vidioc_g_parm(struct file *filp, void *priv,
        memset(parm, 0, sizeof *parm);
        parm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        parm->parm.capture.readbuffers = gspca_dev->nbufread;
+
+       if (gspca_dev->sd_desc->get_streamparm) {
+               int ret;
+
+               if (mutex_lock_interruptible(&gspca_dev->usb_lock))
+                       return -ERESTARTSYS;
+               ret = gspca_dev->sd_desc->get_streamparm(gspca_dev, parm);
+               mutex_unlock(&gspca_dev->usb_lock);
+               return ret;
+       }
+
        return 0;
 }
 
@@ -1341,6 +1352,17 @@ static int vidioc_s_parm(struct file *filp, void *priv,
                parm->parm.capture.readbuffers = gspca_dev->nbufread;
        else
                gspca_dev->nbufread = n;
+
+       if (gspca_dev->sd_desc->set_streamparm) {
+               int ret;
+
+               if (mutex_lock_interruptible(&gspca_dev->usb_lock))
+                       return -ERESTARTSYS;
+               ret = gspca_dev->sd_desc->set_streamparm(gspca_dev, parm);
+               mutex_unlock(&gspca_dev->usb_lock);
+               return ret;
+       }
+
        return 0;
 }
 
index 15db13296b830a3f4ebc3ef0ce5680e9cff322cc..79cef31a5e337a9ef663568d7897cd9860d2841e 100644 (file)
@@ -74,6 +74,8 @@ typedef void (*cam_v_op) (struct gspca_dev *);
 typedef int (*cam_cf_op) (struct gspca_dev *, const struct usb_device_id *);
 typedef int (*cam_jpg_op) (struct gspca_dev *,
                                struct v4l2_jpegcompression *);
+typedef int (*cam_streamparm_op) (struct gspca_dev *,
+                                 struct v4l2_streamparm *);
 typedef int (*cam_qmnu_op) (struct gspca_dev *,
                        struct v4l2_querymenu *);
 typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev,
@@ -106,6 +108,8 @@ struct sd_desc {
        cam_jpg_op get_jcomp;
        cam_jpg_op set_jcomp;
        cam_qmnu_op querymenu;
+       cam_streamparm_op get_streamparm;
+       cam_streamparm_op set_streamparm;
 };
 
 /* packet types when moving from iso buf to frame buf */