[media] soc_camera: compliance fixes
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 15 Jun 2015 11:33:38 +0000 (08:33 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 11 Aug 2015 12:52:46 +0000 (09:52 -0300)
- REQBUFS(0) will stop streaming, free buffers and release the file ownership.
- Return ENOTTY for create_bufs for a vb1 driver
- Return EBUSY if there is a different streaming owner and set the new owner on
  success.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/soc_camera/soc_camera.c

index 5f1e5a8..6ce6576 100644 (file)
@@ -384,9 +384,8 @@ static int soc_camera_reqbufs(struct file *file, void *priv,
                ret = vb2_reqbufs(&icd->vb2_vidq, p);
        }
 
-       if (!ret && !icd->streamer)
-               icd->streamer = file;
-
+       if (!ret)
+               icd->streamer = p->count ? file : NULL;
        return ret;
 }
 
@@ -443,12 +442,19 @@ static int soc_camera_create_bufs(struct file *file, void *priv,
 {
        struct soc_camera_device *icd = file->private_data;
        struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
+       int ret;
 
        /* videobuf2 only */
        if (ici->ops->init_videobuf)
-               return -EINVAL;
-       else
-               return vb2_create_bufs(&icd->vb2_vidq, create);
+               return -ENOTTY;
+
+       if (icd->streamer && icd->streamer != file)
+               return -EBUSY;
+
+       ret = vb2_create_bufs(&icd->vb2_vidq, create);
+       if (!ret)
+               icd->streamer = file;
+       return ret;
 }
 
 static int soc_camera_prepare_buf(struct file *file, void *priv,