summaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/soc_camera/soc_camera.c
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2015-06-15 08:33:38 -0300
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-08-11 09:52:46 -0300
commit9f317de424dfb57d8c3d3152ace24904bc402810 (patch)
treeded085a538e2bff2d60ff3a91801100ca4349da3 /drivers/media/platform/soc_camera/soc_camera.c
parenteb01b1bca9ac7644f178384a594881f2b3433773 (diff)
[media] soc_camera: compliance fixes
- 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>
Diffstat (limited to 'drivers/media/platform/soc_camera/soc_camera.c')
-rw-r--r--drivers/media/platform/soc_camera/soc_camera.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/media/platform/soc_camera/soc_camera.c b/drivers/media/platform/soc_camera/soc_camera.c
index 5f1e5a8cbab4..6ce65762f556 100644
--- a/drivers/media/platform/soc_camera/soc_camera.c
+++ b/drivers/media/platform/soc_camera/soc_camera.c
@@ -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,