diff options
-rw-r--r-- | drivers/media/v4l2-core/videobuf2-core.c | 24 | ||||
-rw-r--r-- | include/media/videobuf2-core.h | 1 |
2 files changed, 25 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c index 349e659d75fb..7c4489c42365 100644 --- a/drivers/media/v4l2-core/videobuf2-core.c +++ b/drivers/media/v4l2-core/videobuf2-core.c | |||
@@ -1200,6 +1200,30 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state) | |||
1200 | EXPORT_SYMBOL_GPL(vb2_buffer_done); | 1200 | EXPORT_SYMBOL_GPL(vb2_buffer_done); |
1201 | 1201 | ||
1202 | /** | 1202 | /** |
1203 | * vb2_discard_done() - discard all buffers marked as DONE | ||
1204 | * @q: videobuf2 queue | ||
1205 | * | ||
1206 | * This function is intended to be used with suspend/resume operations. It | ||
1207 | * discards all 'done' buffers as they would be too old to be requested after | ||
1208 | * resume. | ||
1209 | * | ||
1210 | * Drivers must stop the hardware and synchronize with interrupt handlers and/or | ||
1211 | * delayed works before calling this function to make sure no buffer will be | ||
1212 | * touched by the driver and/or hardware. | ||
1213 | */ | ||
1214 | void vb2_discard_done(struct vb2_queue *q) | ||
1215 | { | ||
1216 | struct vb2_buffer *vb; | ||
1217 | unsigned long flags; | ||
1218 | |||
1219 | spin_lock_irqsave(&q->done_lock, flags); | ||
1220 | list_for_each_entry(vb, &q->done_list, done_entry) | ||
1221 | vb->state = VB2_BUF_STATE_ERROR; | ||
1222 | spin_unlock_irqrestore(&q->done_lock, flags); | ||
1223 | } | ||
1224 | EXPORT_SYMBOL_GPL(vb2_discard_done); | ||
1225 | |||
1226 | /** | ||
1203 | * __fill_vb2_buffer() - fill a vb2_buffer with information provided in a | 1227 | * __fill_vb2_buffer() - fill a vb2_buffer with information provided in a |
1204 | * v4l2_buffer by the userspace. The caller has already verified that struct | 1228 | * v4l2_buffer by the userspace. The caller has already verified that struct |
1205 | * v4l2_buffer has a valid number of planes. | 1229 | * v4l2_buffer has a valid number of planes. |
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index bca25dc53f9d..8fab6fa0dbfb 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h | |||
@@ -432,6 +432,7 @@ void *vb2_plane_vaddr(struct vb2_buffer *vb, unsigned int plane_no); | |||
432 | void *vb2_plane_cookie(struct vb2_buffer *vb, unsigned int plane_no); | 432 | void *vb2_plane_cookie(struct vb2_buffer *vb, unsigned int plane_no); |
433 | 433 | ||
434 | void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state); | 434 | void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state); |
435 | void vb2_discard_done(struct vb2_queue *q); | ||
435 | int vb2_wait_for_all_buffers(struct vb2_queue *q); | 436 | int vb2_wait_for_all_buffers(struct vb2_queue *q); |
436 | 437 | ||
437 | int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b); | 438 | int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b); |