Lines Matching refs:queue
24 * Video buffers queue management.
30 * the videobuf2 queue operations by serializing calls to videobuf2 and a
31 * spinlock to protect the IRQ queue that holds the buffers to be processed by
36 uvc_queue_to_stream(struct uvc_video_queue *queue)
38 return container_of(queue, struct uvc_streaming, queue);
49 * This function must be called with the queue spinlock held.
51 static void uvc_queue_return_buffers(struct uvc_video_queue *queue,
58 while (!list_empty(&queue->irqqueue)) {
59 struct uvc_buffer *buf = list_first_entry(&queue->irqqueue,
61 queue);
62 list_del(&buf->queue);
69 * videobuf2 queue operations
76 struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
86 stream = uvc_queue_to_stream(queue);
107 struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
116 if (unlikely(queue->flags & UVC_QUEUE_DISCONNECTED))
134 struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
138 spin_lock_irqsave(&queue->irqlock, flags);
139 if (likely(!(queue->flags & UVC_QUEUE_DISCONNECTED))) {
141 list_add_tail(&buf->queue, &queue->irqqueue);
150 spin_unlock_irqrestore(&queue->irqlock, flags);
156 struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
157 struct uvc_streaming *stream = uvc_queue_to_stream(queue);
166 struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
167 struct uvc_streaming *stream = uvc_queue_to_stream(queue);
172 queue->buf_used = 0;
178 spin_lock_irq(&queue->irqlock);
179 uvc_queue_return_buffers(queue, UVC_BUF_STATE_QUEUED);
180 spin_unlock_irq(&queue->irqlock);
187 struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
192 uvc_video_stop_streaming(uvc_queue_to_stream(queue));
194 spin_lock_irq(&queue->irqlock);
195 uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR);
196 spin_unlock_irq(&queue->irqlock);
219 int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
224 queue->queue.type = type;
225 queue->queue.io_modes = VB2_MMAP | VB2_USERPTR;
226 queue->queue.drv_priv = queue;
227 queue->queue.buf_struct_size = sizeof(struct uvc_buffer);
228 queue->queue.mem_ops = &vb2_vmalloc_memops;
229 queue->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
231 queue->queue.lock = &queue->mutex;
235 queue->queue.ops = &uvc_meta_queue_qops;
238 queue->queue.io_modes |= VB2_DMABUF;
239 queue->queue.ops = &uvc_queue_qops;
243 ret = vb2_queue_init(&queue->queue);
247 mutex_init(&queue->mutex);
248 spin_lock_init(&queue->irqlock);
249 INIT_LIST_HEAD(&queue->irqqueue);
250 queue->flags = drop_corrupted ? UVC_QUEUE_DROP_CORRUPTED : 0;
255 void uvc_queue_release(struct uvc_video_queue *queue)
257 mutex_lock(&queue->mutex);
258 vb2_queue_release(&queue->queue);
259 mutex_unlock(&queue->mutex);
263 * V4L2 queue operations
266 int uvc_request_buffers(struct uvc_video_queue *queue,
271 mutex_lock(&queue->mutex);
272 ret = vb2_reqbufs(&queue->queue, rb);
273 mutex_unlock(&queue->mutex);
278 int uvc_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
282 mutex_lock(&queue->mutex);
283 ret = vb2_querybuf(&queue->queue, buf);
284 mutex_unlock(&queue->mutex);
289 int uvc_create_buffers(struct uvc_video_queue *queue,
294 mutex_lock(&queue->mutex);
295 ret = vb2_create_bufs(&queue->queue, cb);
296 mutex_unlock(&queue->mutex);
301 int uvc_queue_buffer(struct uvc_video_queue *queue,
306 mutex_lock(&queue->mutex);
307 ret = vb2_qbuf(&queue->queue, mdev, buf);
308 mutex_unlock(&queue->mutex);
313 int uvc_export_buffer(struct uvc_video_queue *queue,
318 mutex_lock(&queue->mutex);
319 ret = vb2_expbuf(&queue->queue, exp);
320 mutex_unlock(&queue->mutex);
325 int uvc_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf,
330 mutex_lock(&queue->mutex);
331 ret = vb2_dqbuf(&queue->queue, buf, nonblocking);
332 mutex_unlock(&queue->mutex);
337 int uvc_queue_streamon(struct uvc_video_queue *queue, enum v4l2_buf_type type)
341 mutex_lock(&queue->mutex);
342 ret = vb2_streamon(&queue->queue, type);
343 mutex_unlock(&queue->mutex);
348 int uvc_queue_streamoff(struct uvc_video_queue *queue, enum v4l2_buf_type type)
352 mutex_lock(&queue->mutex);
353 ret = vb2_streamoff(&queue->queue, type);
354 mutex_unlock(&queue->mutex);
359 int uvc_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma)
361 return vb2_mmap(&queue->queue, vma);
365 unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue,
368 return vb2_get_unmapped_area(&queue->queue, 0, 0, pgoff, 0);
372 __poll_t uvc_queue_poll(struct uvc_video_queue *queue, struct file *file,
377 mutex_lock(&queue->mutex);
378 ret = vb2_poll(&queue->queue, file, wait);
379 mutex_unlock(&queue->mutex);
391 int uvc_queue_allocated(struct uvc_video_queue *queue)
395 mutex_lock(&queue->mutex);
396 allocated = vb2_is_busy(&queue->queue);
397 mutex_unlock(&queue->mutex);
403 * Cancel the video buffers queue.
405 * Cancelling the queue marks all buffers on the irq queue as erroneous,
406 * wakes them up and removes them from the queue.
414 void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect)
418 spin_lock_irqsave(&queue->irqlock, flags);
419 uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR);
424 * state outside the queue code.
427 queue->flags |= UVC_QUEUE_DISCONNECTED;
428 spin_unlock_irqrestore(&queue->irqlock, flags);
435 * remains on the queue until the EOF marker.
438 __uvc_queue_get_current_buffer(struct uvc_video_queue *queue)
440 if (list_empty(&queue->irqqueue))
443 return list_first_entry(&queue->irqqueue, struct uvc_buffer, queue);
446 struct uvc_buffer *uvc_queue_get_current_buffer(struct uvc_video_queue *queue)
451 spin_lock_irqsave(&queue->irqlock, flags);
452 nextbuf = __uvc_queue_get_current_buffer(queue);
453 spin_unlock_irqrestore(&queue->irqlock, flags);
461 * Reuse a buffer through our internal queue without the need to 'prepare'.
465 static void uvc_queue_buffer_requeue(struct uvc_video_queue *queue,
480 struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
482 if ((queue->flags & UVC_QUEUE_DROP_CORRUPTED) && buf->error) {
483 uvc_queue_buffer_requeue(queue, buf);
502 * Remove this buffer from the queue. Lifetime will persist while async actions
506 struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue,
512 spin_lock_irqsave(&queue->irqlock, flags);
513 list_del(&buf->queue);
514 nextbuf = __uvc_queue_get_current_buffer(queue);
515 spin_unlock_irqrestore(&queue->irqlock, flags);