fimc-is: Release all buffers in fimc_is_queue_stop_streaming()
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Thu, 19 Apr 2018 11:58:43 +0000 (13:58 +0200)
committerInki Dae <inki.dae@samsung.com>
Mon, 3 Dec 2018 00:56:49 +0000 (09:56 +0900)
Any buffer owned by the driver should be released in videobuf2 stop_streaming()
callback. This change allows to avoid warnings from videobuf2 when closing
video device nodes.

Change-Id: Idd2f3157ab5c0326c39e8d9160514ad6102301b6
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
drivers/media/platform/exynos/fimc-is/fimc-is-video.c

index 885841bc7cc92636cb1f53dd8a1d501d617faac2..4a4956cf507576bbf4aaeec1139fabcc73ae5062 100644 (file)
@@ -733,7 +733,8 @@ int fimc_is_queue_stop_streaming(struct fimc_is_queue *queue,
        struct fimc_is_subdev *subdev,
        struct fimc_is_video_ctx *vctx)
 {
-       int ret = 0;
+       struct vb2_queue *vbq = queue->vbq;
+       int ret, i;
 
        BUG_ON(!queue);
        BUG_ON(!device);
@@ -759,6 +760,15 @@ p_err:
        clear_bit(FIMC_IS_QUEUE_BUFFER_READY, &queue->state);
        clear_bit(FIMC_IS_QUEUE_BUFFER_PREPARED, &queue->state);
 
+       /*
+        * Any buffers still owned by the driver will be released with the
+        * VB2_BUF_STATE_ERROR flag set.
+        */
+       for (i = 0; i < vbq->num_buffers; i++) {
+               if (vbq->bufs[i]->state == VB2_BUF_STATE_ACTIVE)
+                       vb2_buffer_done(vbq->bufs[i], VB2_BUF_STATE_ERROR);
+       }
+
        return ret;
 }