From: "Lad, Prabhakar" <prabhakar.cse...@gmail.com>

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.cse...@gmail.com>
Acked-by: Scott Jiang <scott.jiang.li...@gmail.com>
Tested-by: Scott Jiang <scott.jiang.li...@gmail.com>
---
 drivers/media/platform/blackfin/bfin_capture.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/media/platform/blackfin/bfin_capture.c 
b/drivers/media/platform/blackfin/bfin_capture.c
index c6d8b95..2c720bc 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)
 {
        struct bcap_device *bcap_dev = vb2_get_drv_priv(vq);
        struct ppi_if *ppi = bcap_dev->ppi;
+       struct bcap_buffer *buf, *tmp;
        struct ppi_params params;
        int ret;
 
@@ -352,7 +353,7 @@ static int bcap_start_streaming(struct vb2_queue *vq, 
unsigned int count)
        ret = v4l2_subdev_call(bcap_dev->sd, video, s_stream, 1);
        if (ret && (ret != -ENOIOCTLCMD)) {
                v4l2_err(&bcap_dev->v4l2_dev, "stream on failed in subdev\n");
-               return ret;
+               goto err;
        }
 
        /* set ppi params */
@@ -391,7 +392,7 @@ static int bcap_start_streaming(struct vb2_queue *vq, 
unsigned int count)
        if (ret < 0) {
                v4l2_err(&bcap_dev->v4l2_dev,
                                "Error in setting ppi params\n");
-               return ret;
+               goto err;
        }
 
        /* attach ppi DMA irq handler */
@@ -399,12 +400,21 @@ static int bcap_start_streaming(struct vb2_queue *vq, 
unsigned int count)
        if (ret < 0) {
                v4l2_err(&bcap_dev->v4l2_dev,
                                "Error in attaching interrupt handler\n");
-               return ret;
+               goto err;
        }
 
        reinit_completion(&bcap_dev->comp);
        bcap_dev->stop = false;
+
        return 0;
+
+err:
+       list_for_each_entry_safe(buf, tmp, &bcap_dev->dma_queue, list) {
+               list_del(&buf->list);
+               vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED);
+       }
+
+       return ret;
 }
 
 static void bcap_stop_streaming(struct vb2_queue *vq)
-- 
2.1.0

--
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