|
@@ -715,6 +715,7 @@ static void __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b)
|
|
break;
|
|
break;
|
|
case VB2_BUF_STATE_PREPARING:
|
|
case VB2_BUF_STATE_PREPARING:
|
|
case VB2_BUF_STATE_DEQUEUED:
|
|
case VB2_BUF_STATE_DEQUEUED:
|
|
|
|
+ case VB2_BUF_STATE_REQUEUEING:
|
|
/* nothing */
|
|
/* nothing */
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -1182,7 +1183,8 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|
|
|
|
|
if (WARN_ON(state != VB2_BUF_STATE_DONE &&
|
|
if (WARN_ON(state != VB2_BUF_STATE_DONE &&
|
|
state != VB2_BUF_STATE_ERROR &&
|
|
state != VB2_BUF_STATE_ERROR &&
|
|
- state != VB2_BUF_STATE_QUEUED))
|
|
|
|
|
|
+ state != VB2_BUF_STATE_QUEUED &&
|
|
|
|
+ state != VB2_BUF_STATE_REQUEUEING))
|
|
state = VB2_BUF_STATE_ERROR;
|
|
state = VB2_BUF_STATE_ERROR;
|
|
|
|
|
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
@@ -1199,22 +1201,30 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|
for (plane = 0; plane < vb->num_planes; ++plane)
|
|
for (plane = 0; plane < vb->num_planes; ++plane)
|
|
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
|
|
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
|
|
|
|
|
|
- /* Add the buffer to the done buffers list */
|
|
|
|
spin_lock_irqsave(&q->done_lock, flags);
|
|
spin_lock_irqsave(&q->done_lock, flags);
|
|
- vb->state = state;
|
|
|
|
- if (state != VB2_BUF_STATE_QUEUED)
|
|
|
|
|
|
+ if (state == VB2_BUF_STATE_QUEUED ||
|
|
|
|
+ state == VB2_BUF_STATE_REQUEUEING) {
|
|
|
|
+ vb->state = VB2_BUF_STATE_QUEUED;
|
|
|
|
+ } else {
|
|
|
|
+ /* Add the buffer to the done buffers list */
|
|
list_add_tail(&vb->done_entry, &q->done_list);
|
|
list_add_tail(&vb->done_entry, &q->done_list);
|
|
|
|
+ vb->state = state;
|
|
|
|
+ }
|
|
atomic_dec(&q->owned_by_drv_count);
|
|
atomic_dec(&q->owned_by_drv_count);
|
|
spin_unlock_irqrestore(&q->done_lock, flags);
|
|
spin_unlock_irqrestore(&q->done_lock, flags);
|
|
|
|
|
|
- if (state == VB2_BUF_STATE_QUEUED) {
|
|
|
|
|
|
+ switch (state) {
|
|
|
|
+ case VB2_BUF_STATE_QUEUED:
|
|
|
|
+ return;
|
|
|
|
+ case VB2_BUF_STATE_REQUEUEING:
|
|
if (q->start_streaming_called)
|
|
if (q->start_streaming_called)
|
|
__enqueue_in_driver(vb);
|
|
__enqueue_in_driver(vb);
|
|
return;
|
|
return;
|
|
|
|
+ default:
|
|
|
|
+ /* Inform any processes that may be waiting for buffers */
|
|
|
|
+ wake_up(&q->done_wq);
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
-
|
|
|
|
- /* Inform any processes that may be waiting for buffers */
|
|
|
|
- wake_up(&q->done_wq);
|
|
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(vb2_buffer_done);
|
|
EXPORT_SYMBOL_GPL(vb2_buffer_done);
|
|
|
|
|