summaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/vsp1
diff options
context:
space:
mode:
authorLaurent Pinchart2014-06-23 21:57:22 +0200
committerMauro Carvalho Chehab2014-07-17 17:44:49 +0200
commit9df04e9d9ac6982d16a8a042c8274410ed29fb0e (patch)
tree3358b1a78c6bbbb9a6e850b29912733faae5989c /drivers/media/platform/vsp1
parent[media] v4l: vsp1: Fix routing cleanup when stopping the stream (diff)
downloadkernel-qcow2-linux-9df04e9d9ac6982d16a8a042c8274410ed29fb0e.tar.gz
kernel-qcow2-linux-9df04e9d9ac6982d16a8a042c8274410ed29fb0e.tar.xz
kernel-qcow2-linux-9df04e9d9ac6982d16a8a042c8274410ed29fb0e.zip
[media] v4l: vsp1: Release buffers at stream stop
videobuf2 expects no buffer to be owned by the driver when the stop_stream queue operation returns. As the vsp1 driver fails to do so, a warning is generated at stream top time. Fix this by releasing all buffers queued on the IRQ queue in the stop_stream operation handler and marking them as erroneous. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/platform/vsp1')
-rw-r--r--drivers/media/platform/vsp1/vsp1_video.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/media/platform/vsp1/vsp1_video.c b/drivers/media/platform/vsp1/vsp1_video.c
index c717e288d0ee..9bb156cd3c9e 100644
--- a/drivers/media/platform/vsp1/vsp1_video.c
+++ b/drivers/media/platform/vsp1/vsp1_video.c
@@ -742,6 +742,7 @@ static void vsp1_video_stop_streaming(struct vb2_queue *vq)
{
struct vsp1_video *video = vb2_get_drv_priv(vq);
struct vsp1_pipeline *pipe = to_vsp1_pipeline(&video->video.entity);
+ struct vsp1_video_buffer *buffer;
unsigned long flags;
int ret;
@@ -759,6 +760,8 @@ static void vsp1_video_stop_streaming(struct vb2_queue *vq)
/* Remove all buffers from the IRQ queue. */
spin_lock_irqsave(&video->irqlock, flags);
+ list_for_each_entry(buffer, &video->irqqueue, queue)
+ vb2_buffer_done(&buffer->buf, VB2_BUF_STATE_ERROR);
INIT_LIST_HEAD(&video->irqqueue);
spin_unlock_irqrestore(&video->irqlock, flags);
}