diff options
author | Lad, Prabhakar <prabhakar.csengg@gmail.com> | 2015-03-08 10:40:38 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-04-02 17:11:09 -0400 |
commit | 6692871a7c898ff05b33e58f1eab3ec1975bc894 (patch) | |
tree | dec6e090f4a6535d2fc0ef46583a6e64cf9dd515 | |
parent | b4e81b23788448c2ed9f4b8a3e3fdeb013a4a8f6 (diff) |
[media] media: blackfin: bfin_capture: release buffers in case start_streaming() call back fails
this patch adds support to release the buffer by calling
vb2_buffer_done(), with state marked as VB2_BUF_STATE_QUEUED
if start_streaming() call back fails.
Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com>
Tested-by: Scott Jiang <scott.jiang.linux@gmail.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/platform/blackfin/bfin_capture.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/media/platform/blackfin/bfin_capture.c b/drivers/media/platform/blackfin/bfin_capture.c index c6d8b95b91ff..2c720bc4cb8f 100644 --- a/drivers/media/platform/blackfin/bfin_capture.c +++ b/drivers/media/platform/blackfin/bfin_capture.c | |||
@@ -345,6 +345,7 @@ static int bcap_start_streaming(struct vb2_queue *vq, unsigned int count) | |||
345 | { | 345 | { |
346 | struct bcap_device *bcap_dev = vb2_get_drv_priv(vq); | 346 | struct bcap_device *bcap_dev = vb2_get_drv_priv(vq); |
347 | struct ppi_if *ppi = bcap_dev->ppi; | 347 | struct ppi_if *ppi = bcap_dev->ppi; |
348 | struct bcap_buffer *buf, *tmp; | ||
348 | struct ppi_params params; | 349 | struct ppi_params params; |
349 | int ret; | 350 | int ret; |
350 | 351 | ||
@@ -352,7 +353,7 @@ static int bcap_start_streaming(struct vb2_queue *vq, unsigned int count) | |||
352 | ret = v4l2_subdev_call(bcap_dev->sd, video, s_stream, 1); | 353 | ret = v4l2_subdev_call(bcap_dev->sd, video, s_stream, 1); |
353 | if (ret && (ret != -ENOIOCTLCMD)) { | 354 | if (ret && (ret != -ENOIOCTLCMD)) { |
354 | v4l2_err(&bcap_dev->v4l2_dev, "stream on failed in subdev\n"); | 355 | v4l2_err(&bcap_dev->v4l2_dev, "stream on failed in subdev\n"); |
355 | return ret; | 356 | goto err; |
356 | } | 357 | } |
357 | 358 | ||
358 | /* set ppi params */ | 359 | /* set ppi params */ |
@@ -391,7 +392,7 @@ static int bcap_start_streaming(struct vb2_queue *vq, unsigned int count) | |||
391 | if (ret < 0) { | 392 | if (ret < 0) { |
392 | v4l2_err(&bcap_dev->v4l2_dev, | 393 | v4l2_err(&bcap_dev->v4l2_dev, |
393 | "Error in setting ppi params\n"); | 394 | "Error in setting ppi params\n"); |
394 | return ret; | 395 | goto err; |
395 | } | 396 | } |
396 | 397 | ||
397 | /* attach ppi DMA irq handler */ | 398 | /* attach ppi DMA irq handler */ |
@@ -399,12 +400,21 @@ static int bcap_start_streaming(struct vb2_queue *vq, unsigned int count) | |||
399 | if (ret < 0) { | 400 | if (ret < 0) { |
400 | v4l2_err(&bcap_dev->v4l2_dev, | 401 | v4l2_err(&bcap_dev->v4l2_dev, |
401 | "Error in attaching interrupt handler\n"); | 402 | "Error in attaching interrupt handler\n"); |
402 | return ret; | 403 | goto err; |
403 | } | 404 | } |
404 | 405 | ||
405 | reinit_completion(&bcap_dev->comp); | 406 | reinit_completion(&bcap_dev->comp); |
406 | bcap_dev->stop = false; | 407 | bcap_dev->stop = false; |
408 | |||
407 | return 0; | 409 | return 0; |
410 | |||
411 | err: | ||
412 | list_for_each_entry_safe(buf, tmp, &bcap_dev->dma_queue, list) { | ||
413 | list_del(&buf->list); | ||
414 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED); | ||
415 | } | ||
416 | |||
417 | return ret; | ||
408 | } | 418 | } |
409 | 419 | ||
410 | static void bcap_stop_streaming(struct vb2_queue *vq) | 420 | static void bcap_stop_streaming(struct vb2_queue *vq) |