When in webcam mode the STD API shouldn't be implemented.

When changing the standard the resolution wasn't updated, and there was no
check against streaming-in-progress.

Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>
Signed-off-by: Devin Heitmueller <dheitmuel...@kernellabs.com>
---
 drivers/media/usb/em28xx/em28xx-video.c |   25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/drivers/media/usb/em28xx/em28xx-video.c 
b/drivers/media/usb/em28xx/em28xx-video.c
index 7c09b55..ae713a0 100644
--- a/drivers/media/usb/em28xx/em28xx-video.c
+++ b/drivers/media/usb/em28xx/em28xx-video.c
@@ -909,6 +909,8 @@ static int vidioc_g_std(struct file *file, void *priv, 
v4l2_std_id *norm)
        struct em28xx      *dev = fh->dev;
        int                rc;
 
+       if (dev->board.is_webcam)
+               return -ENOTTY;
        rc = check_dev(dev);
        if (rc < 0)
                return rc;
@@ -924,6 +926,8 @@ static int vidioc_querystd(struct file *file, void *priv, 
v4l2_std_id *norm)
        struct em28xx      *dev = fh->dev;
        int                rc;
 
+       if (dev->board.is_webcam)
+               return -ENOTTY;
        rc = check_dev(dev);
        if (rc < 0)
                return rc;
@@ -940,15 +944,24 @@ static int vidioc_s_std(struct file *file, void *priv, 
v4l2_std_id *norm)
        struct v4l2_format f;
        int                rc;
 
+       if (dev->board.is_webcam)
+               return -ENOTTY;
+       if (*norm == dev->norm)
+               return 0;
        rc = check_dev(dev);
        if (rc < 0)
                return rc;
 
+       if (videobuf_queue_is_busy(&fh->vb_vidq)) {
+               em28xx_errdev("%s queue busy\n", __func__);
+               return -EBUSY;
+       }
+
        dev->norm = *norm;
 
        /* Adjusts width/height, if needed */
-       f.fmt.pix.width = dev->width;
-       f.fmt.pix.height = dev->height;
+       f.fmt.pix.width = 720;
+       f.fmt.pix.height = (*norm & V4L2_STD_525_60) ? 480 : 576;
        vidioc_try_fmt_vid_cap(file, priv, &f);
 
        /* set new image size */
@@ -1034,6 +1047,9 @@ static int vidioc_enum_input(struct file *file, void 
*priv,
                i->type = V4L2_INPUT_TYPE_TUNER;
 
        i->std = dev->vdev->tvnorms;
+       /* webcams do not have the STD API */
+       if (dev->board.is_webcam)
+               i->capabilities = 0;
 
        return 0;
 }
@@ -2059,7 +2075,6 @@ static const struct video_device em28xx_video_template = {
        .ioctl_ops                  = &video_ioctl_ops,
 
        .tvnorms                    = V4L2_STD_ALL,
-       .current_norm               = V4L2_STD_PAL,
 };
 
 static const struct v4l2_file_operations radio_fops = {
@@ -2109,6 +2124,8 @@ static struct video_device *em28xx_vdev_init(struct 
em28xx *dev,
        vfd->debug      = video_debug;
        vfd->lock       = &dev->lock;
        set_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags);
+       if (dev->board.is_webcam)
+               vfd->tvnorms = 0;
 
        snprintf(vfd->name, sizeof(vfd->name), "%s %s",
                 dev->name, type_name);
@@ -2127,7 +2144,7 @@ int em28xx_register_analog_devices(struct em28xx *dev)
                dev->name, EM28XX_VERSION);
 
        /* set default norm */
-       dev->norm = em28xx_video_template.current_norm;
+       dev->norm = V4L2_STD_PAL;
        v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, dev->norm);
        dev->interlaced = EM28XX_INTERLACED_DEFAULT;
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to