[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>
This commit is contained in:
Lad, Prabhakar 2015-03-08 11:40:38 -03:00 committed by Mauro Carvalho Chehab
parent b4e81b2378
commit 6692871a7c
1 changed files with 13 additions and 3 deletions

View File

@ -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 bcap_device *bcap_dev = vb2_get_drv_priv(vq);
struct ppi_if *ppi = bcap_dev->ppi; struct ppi_if *ppi = bcap_dev->ppi;
struct bcap_buffer *buf, *tmp;
struct ppi_params params; struct ppi_params params;
int ret; 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); ret = v4l2_subdev_call(bcap_dev->sd, video, s_stream, 1);
if (ret && (ret != -ENOIOCTLCMD)) { if (ret && (ret != -ENOIOCTLCMD)) {
v4l2_err(&bcap_dev->v4l2_dev, "stream on failed in subdev\n"); v4l2_err(&bcap_dev->v4l2_dev, "stream on failed in subdev\n");
return ret; goto err;
} }
/* set ppi params */ /* set ppi params */
@ -391,7 +392,7 @@ static int bcap_start_streaming(struct vb2_queue *vq, unsigned int count)
if (ret < 0) { if (ret < 0) {
v4l2_err(&bcap_dev->v4l2_dev, v4l2_err(&bcap_dev->v4l2_dev,
"Error in setting ppi params\n"); "Error in setting ppi params\n");
return ret; goto err;
} }
/* attach ppi DMA irq handler */ /* attach ppi DMA irq handler */
@ -399,12 +400,21 @@ static int bcap_start_streaming(struct vb2_queue *vq, unsigned int count)
if (ret < 0) { if (ret < 0) {
v4l2_err(&bcap_dev->v4l2_dev, v4l2_err(&bcap_dev->v4l2_dev,
"Error in attaching interrupt handler\n"); "Error in attaching interrupt handler\n");
return ret; goto err;
} }
reinit_completion(&bcap_dev->comp); reinit_completion(&bcap_dev->comp);
bcap_dev->stop = false; bcap_dev->stop = false;
return 0; 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) static void bcap_stop_streaming(struct vb2_queue *vq)