aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/soc_camera.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c
index a22fcd0ff8b..21a8aa586da 100644
--- a/drivers/media/video/soc_camera.c
+++ b/drivers/media/video/soc_camera.c
@@ -517,8 +517,8 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
mutex_lock(&icf->vb_vidq.vb_lock);
- if (videobuf_queue_is_busy(&icf->vb_vidq)) {
- dev_err(&icd->dev, "S_FMT denied: queue busy\n");
+ if (icf->vb_vidq.bufs[0]) {
+ dev_err(&icd->dev, "S_FMT denied: queue initialised\n");
ret = -EBUSY;
goto unlock;
}
@@ -768,6 +768,15 @@ static int soc_camera_s_crop(struct file *file, void *fh,
/* Cropping is allowed during a running capture, guard consistency */
mutex_lock(&icf->vb_vidq.vb_lock);
+ /* Prohibit window size change with initialised buffers */
+ if (icf->vb_vidq.bufs[0] && (rect.width != icd->rect_current.width ||
+ rect.height != icd->rect_current.height)) {
+ dev_err(&icd->dev,
+ "S_CROP denied: queue initialised and sizes differ\n");
+ ret = -EBUSY;
+ goto unlock;
+ }
+
if (rect.width > icd->rect_max.width)
rect.width = icd->rect_max.width;
@@ -792,6 +801,7 @@ static int soc_camera_s_crop(struct file *file, void *fh,
if (!ret)
icd->rect_current = rect;
+unlock:
mutex_unlock(&icf->vb_vidq.vb_lock);
return ret;