fimc-is: Release all buffers in sensor video node stop_streaming() callback
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Fri, 20 Apr 2018 10:32:08 +0000 (12:32 +0200)
committerJunghoon Kim <jhoon20.kim@samsung.com>
Thu, 14 Feb 2019 05:57:29 +0000 (14:57 +0900)
Any buffer owned by a driver should be released in videobuf2 stop_streaming()
callback. This change allows to avoid warnings from videobuf2 when closing
video device nodes.

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

index e474c49..c46a38e 100644 (file)
@@ -793,10 +793,10 @@ static int fimc_is_sen_start_streaming(struct vb2_queue *q,
 
 static void fimc_is_sen_stop_streaming(struct vb2_queue *q)
 {
-       int ret = 0;
        struct fimc_is_video_ctx *vctx = q->drv_priv;
        struct fimc_is_queue *queue;
        struct fimc_is_device_sensor *device;
+       int i;
 
        BUG_ON(!vctx);
 
@@ -809,10 +809,20 @@ static void fimc_is_sen_stop_streaming(struct vb2_queue *q)
                clear_bit(FIMC_IS_QUEUE_STREAM_ON, &queue->state);
                clear_bit(FIMC_IS_QUEUE_BUFFER_READY, &queue->state);
                clear_bit(FIMC_IS_QUEUE_BUFFER_PREPARED, &queue->state);
-               ret = fimc_is_sensor_back_stop(device);
+
+               fimc_is_sensor_back_stop(device);
        } else {
                err("already stream off");
        }
+
+       /*
+        * Any buffers still owned by the driver will be released with the
+        * VB2_BUF_STATE_ERROR flag set.
+        */
+       for (i = 0; i < q->num_buffers; i++) {
+               if (q->bufs[i]->state == VB2_BUF_STATE_ACTIVE)
+                       vb2_buffer_done(q->bufs[i], VB2_BUF_STATE_ERROR);
+       }
 }
 
 static void fimc_is_sen_buffer_queue(struct vb2_buffer *vb)