}
 
 /* Need to hold qlock before calling */
-static void return_all_buffers(struct rvin_dev *vin,
-                              enum vb2_buffer_state state)
+static void return_unused_buffers(struct rvin_dev *vin,
+                                 enum vb2_buffer_state state)
 {
        struct rvin_buffer *buf, *node;
-       struct vb2_v4l2_buffer *freed[HW_BUFFER_NUM];
-       unsigned int i, n;
-
-       for (i = 0; i < HW_BUFFER_NUM; i++) {
-               freed[i] = vin->buf_hw[i].buffer;
-               vin->buf_hw[i].buffer = NULL;
-
-               for (n = 0; n < i; n++) {
-                       if (freed[i] == freed[n]) {
-                               freed[i] = NULL;
-                               break;
-                       }
-               }
-
-               if (freed[i])
-                       vb2_buffer_done(&freed[i]->vb2_buf, state);
-       }
 
        list_for_each_entry_safe(buf, node, &vin->buf_list, list) {
                vb2_buffer_done(&buf->vb.vb2_buf, state);
                                          &vin->scratch_phys, GFP_KERNEL);
        if (!vin->scratch) {
                spin_lock_irqsave(&vin->qlock, flags);
-               return_all_buffers(vin, VB2_BUF_STATE_QUEUED);
+               return_unused_buffers(vin, VB2_BUF_STATE_QUEUED);
                spin_unlock_irqrestore(&vin->qlock, flags);
                vin_err(vin, "Failed to allocate scratch buffer\n");
                return -ENOMEM;
        ret = rvin_set_stream(vin, 1);
        if (ret) {
                spin_lock_irqsave(&vin->qlock, flags);
-               return_all_buffers(vin, VB2_BUF_STATE_QUEUED);
+               return_unused_buffers(vin, VB2_BUF_STATE_QUEUED);
                spin_unlock_irqrestore(&vin->qlock, flags);
                goto out;
        }
 
        ret = rvin_capture_start(vin);
        if (ret) {
-               return_all_buffers(vin, VB2_BUF_STATE_QUEUED);
+               return_unused_buffers(vin, VB2_BUF_STATE_QUEUED);
                rvin_set_stream(vin, 0);
        }
 
                vin->state = STOPPED;
        }
 
-       /* Release all active buffers */
-       return_all_buffers(vin, VB2_BUF_STATE_ERROR);
+       /* Return all unused buffers. */
+       return_unused_buffers(vin, VB2_BUF_STATE_ERROR);
 
        spin_unlock_irqrestore(&vin->qlock, flags);