Lines Matching refs:q
36 #define call_memop(q, op, args...) \ argument
37 (((q)->mem_ops->op) ? \
38 ((q)->mem_ops->op(args)) : 0)
40 #define call_qop(q, op, args...) \ argument
41 (((q)->ops->op) ? ((q)->ops->op(args)) : 0)
53 struct vb2_queue *q = vb->vb2_queue; in __vb2_buf_mem_alloc() local
62 unsigned long size = PAGE_ALIGN(q->plane_sizes[plane]); in __vb2_buf_mem_alloc()
64 mem_priv = call_memop(q, alloc, q->alloc_ctx[plane], in __vb2_buf_mem_alloc()
65 size, q->gfp_flags); in __vb2_buf_mem_alloc()
71 vb->v4l2_planes[plane].length = q->plane_sizes[plane]; in __vb2_buf_mem_alloc()
78 call_memop(q, put, vb->planes[plane - 1].mem_priv); in __vb2_buf_mem_alloc()
90 struct vb2_queue *q = vb->vb2_queue; in __vb2_buf_mem_free() local
94 call_memop(q, put, vb->planes[plane].mem_priv); in __vb2_buf_mem_free()
107 struct vb2_queue *q = vb->vb2_queue; in __vb2_buf_userptr_put() local
112 call_memop(q, put_userptr, vb->planes[plane].mem_priv); in __vb2_buf_userptr_put()
121 static void __vb2_plane_dmabuf_put(struct vb2_queue *q, struct vb2_plane *p) in __vb2_plane_dmabuf_put() argument
127 call_memop(q, unmap_dmabuf, p->mem_priv); in __vb2_plane_dmabuf_put()
129 call_memop(q, detach_dmabuf, p->mem_priv); in __vb2_plane_dmabuf_put()
140 struct vb2_queue *q = vb->vb2_queue; in __vb2_buf_dmabuf_put() local
144 __vb2_plane_dmabuf_put(q, &vb->planes[plane]); in __vb2_buf_dmabuf_put()
151 static void __setup_offsets(struct vb2_queue *q, unsigned int n) in __setup_offsets() argument
157 if (q->num_buffers) { in __setup_offsets()
159 vb = q->bufs[q->num_buffers - 1]; in __setup_offsets()
166 for (buffer = q->num_buffers; buffer < q->num_buffers + n; ++buffer) { in __setup_offsets()
167 vb = q->bufs[buffer]; in __setup_offsets()
172 vb->v4l2_planes[plane].length = q->plane_sizes[plane]; in __setup_offsets()
191 static int __vb2_queue_alloc(struct vb2_queue *q, enum v4l2_memory memory, in __vb2_queue_alloc() argument
200 vb = kzalloc(q->buf_struct_size, GFP_KERNEL); in __vb2_queue_alloc()
207 if (V4L2_TYPE_IS_MULTIPLANAR(q->type)) in __vb2_queue_alloc()
211 vb->vb2_queue = q; in __vb2_queue_alloc()
213 vb->v4l2_buf.index = q->num_buffers + buffer; in __vb2_queue_alloc()
214 vb->v4l2_buf.type = q->type; in __vb2_queue_alloc()
231 ret = call_qop(q, buf_init, vb); in __vb2_queue_alloc()
241 q->bufs[q->num_buffers + buffer] = vb; in __vb2_queue_alloc()
244 __setup_offsets(q, buffer); in __vb2_queue_alloc()
255 static void __vb2_free_mem(struct vb2_queue *q, unsigned int buffers) in __vb2_free_mem() argument
260 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_free_mem()
262 vb = q->bufs[buffer]; in __vb2_free_mem()
267 if (q->memory == V4L2_MEMORY_MMAP) in __vb2_free_mem()
269 else if (q->memory == V4L2_MEMORY_DMABUF) in __vb2_free_mem()
281 static void __vb2_queue_free(struct vb2_queue *q, unsigned int buffers) in __vb2_queue_free() argument
286 if (q->ops->buf_cleanup) { in __vb2_queue_free()
287 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_queue_free()
289 if (NULL == q->bufs[buffer]) in __vb2_queue_free()
291 q->ops->buf_cleanup(q->bufs[buffer]); in __vb2_queue_free()
296 __vb2_free_mem(q, buffers); in __vb2_queue_free()
299 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_queue_free()
301 kfree(q->bufs[buffer]); in __vb2_queue_free()
302 q->bufs[buffer] = NULL; in __vb2_queue_free()
305 q->num_buffers -= buffers; in __vb2_queue_free()
306 if (!q->num_buffers) in __vb2_queue_free()
307 q->memory = 0; in __vb2_queue_free()
308 INIT_LIST_HEAD(&q->queued_list); in __vb2_queue_free()
340 static bool __buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb) in __buffer_in_use() argument
351 if (mem_priv && call_memop(q, num_users, mem_priv) > 1) in __buffer_in_use()
361 static bool __buffers_in_use(struct vb2_queue *q) in __buffers_in_use() argument
364 for (buffer = 0; buffer < q->num_buffers; ++buffer) { in __buffers_in_use()
365 if (__buffer_in_use(q, q->bufs[buffer])) in __buffers_in_use()
377 struct vb2_queue *q = vb->vb2_queue; in __fill_v4l2_buffer() local
384 if (V4L2_TYPE_IS_MULTIPLANAR(q->type)) { in __fill_v4l2_buffer()
399 if (q->memory == V4L2_MEMORY_MMAP) in __fill_v4l2_buffer()
401 else if (q->memory == V4L2_MEMORY_USERPTR) in __fill_v4l2_buffer()
403 else if (q->memory == V4L2_MEMORY_DMABUF) in __fill_v4l2_buffer()
411 b->flags |= q->timestamp_type; in __fill_v4l2_buffer()
432 if (__buffer_in_use(q, vb)) in __fill_v4l2_buffer()
449 int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b) in vb2_querybuf() argument
454 if (b->type != q->type) { in vb2_querybuf()
459 if (b->index >= q->num_buffers) { in vb2_querybuf()
463 vb = q->bufs[b->index]; in vb2_querybuf()
475 static int __verify_userptr_ops(struct vb2_queue *q) in __verify_userptr_ops() argument
477 if (!(q->io_modes & VB2_USERPTR) || !q->mem_ops->get_userptr || in __verify_userptr_ops()
478 !q->mem_ops->put_userptr) in __verify_userptr_ops()
488 static int __verify_mmap_ops(struct vb2_queue *q) in __verify_mmap_ops() argument
490 if (!(q->io_modes & VB2_MMAP) || !q->mem_ops->alloc || in __verify_mmap_ops()
491 !q->mem_ops->put || !q->mem_ops->mmap) in __verify_mmap_ops()
501 static int __verify_dmabuf_ops(struct vb2_queue *q) in __verify_dmabuf_ops() argument
503 if (!(q->io_modes & VB2_DMABUF) || !q->mem_ops->attach_dmabuf || in __verify_dmabuf_ops()
504 !q->mem_ops->detach_dmabuf || !q->mem_ops->map_dmabuf || in __verify_dmabuf_ops()
505 !q->mem_ops->unmap_dmabuf) in __verify_dmabuf_ops()
515 static int __verify_memory_type(struct vb2_queue *q, in __verify_memory_type() argument
524 if (type != q->type) { in __verify_memory_type()
533 if (memory == V4L2_MEMORY_MMAP && __verify_mmap_ops(q)) { in __verify_memory_type()
538 if (memory == V4L2_MEMORY_USERPTR && __verify_userptr_ops(q)) { in __verify_memory_type()
543 if (memory == V4L2_MEMORY_DMABUF && __verify_dmabuf_ops(q)) { in __verify_memory_type()
553 if (q->fileio) { in __verify_memory_type()
583 static int __reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req) in __reqbufs() argument
588 if (q->streaming) { in __reqbufs()
593 if (req->count == 0 || q->num_buffers != 0 || q->memory != req->memory) { in __reqbufs()
598 if (q->memory == V4L2_MEMORY_MMAP && __buffers_in_use(q)) { in __reqbufs()
603 __vb2_queue_free(q, q->num_buffers); in __reqbufs()
617 memset(q->plane_sizes, 0, sizeof(q->plane_sizes)); in __reqbufs()
618 memset(q->alloc_ctx, 0, sizeof(q->alloc_ctx)); in __reqbufs()
619 q->memory = req->memory; in __reqbufs()
625 ret = call_qop(q, queue_setup, q, NULL, &num_buffers, &num_planes, in __reqbufs()
626 q->plane_sizes, q->alloc_ctx); in __reqbufs()
631 ret = __vb2_queue_alloc(q, req->memory, num_buffers, num_planes); in __reqbufs()
645 ret = call_qop(q, queue_setup, q, NULL, &num_buffers, in __reqbufs()
646 &num_planes, q->plane_sizes, q->alloc_ctx); in __reqbufs()
657 q->num_buffers = allocated_buffers; in __reqbufs()
660 __vb2_queue_free(q, allocated_buffers); in __reqbufs()
679 int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req) in vb2_reqbufs() argument
681 int ret = __verify_memory_type(q, req->memory, req->type); in vb2_reqbufs()
683 return ret ? ret : __reqbufs(q, req); in vb2_reqbufs()
702 static int __create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create) in __create_bufs() argument
707 if (q->num_buffers == VIDEO_MAX_FRAME) { in __create_bufs()
713 if (!q->num_buffers) { in __create_bufs()
714 memset(q->plane_sizes, 0, sizeof(q->plane_sizes)); in __create_bufs()
715 memset(q->alloc_ctx, 0, sizeof(q->alloc_ctx)); in __create_bufs()
716 q->memory = create->memory; in __create_bufs()
719 num_buffers = min(create->count, VIDEO_MAX_FRAME - q->num_buffers); in __create_bufs()
725 ret = call_qop(q, queue_setup, q, &create->format, &num_buffers, in __create_bufs()
726 &num_planes, q->plane_sizes, q->alloc_ctx); in __create_bufs()
731 ret = __vb2_queue_alloc(q, create->memory, num_buffers, in __create_bufs()
750 ret = call_qop(q, queue_setup, q, &create->format, &num_buffers, in __create_bufs()
751 &num_planes, q->plane_sizes, q->alloc_ctx); in __create_bufs()
762 q->num_buffers += allocated_buffers; in __create_bufs()
765 __vb2_queue_free(q, allocated_buffers); in __create_bufs()
785 int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create) in vb2_create_bufs() argument
787 int ret = __verify_memory_type(q, create->memory, create->format.type); in vb2_create_bufs()
789 create->index = q->num_buffers; in vb2_create_bufs()
792 return ret ? ret : __create_bufs(q, create); in vb2_create_bufs()
806 struct vb2_queue *q = vb->vb2_queue; in vb2_plane_vaddr() local
811 return call_memop(q, vaddr, vb->planes[plane_no].mem_priv); in vb2_plane_vaddr()
829 struct vb2_queue *q = vb->vb2_queue; in vb2_plane_cookie() local
834 return call_memop(q, cookie, vb->planes[plane_no].mem_priv); in vb2_plane_cookie()
852 struct vb2_queue *q = vb->vb2_queue; in vb2_buffer_done() local
867 call_memop(q, finish, vb->planes[plane].mem_priv); in vb2_buffer_done()
870 spin_lock_irqsave(&q->done_lock, flags); in vb2_buffer_done()
872 list_add_tail(&vb->done_entry, &q->done_list); in vb2_buffer_done()
873 atomic_dec(&q->queued_count); in vb2_buffer_done()
874 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_buffer_done()
877 wake_up(&q->done_wq); in vb2_buffer_done()
960 struct vb2_queue *q = vb->vb2_queue; in __qbuf_userptr() local
964 int write = !V4L2_TYPE_IS_OUTPUT(q->type); in __qbuf_userptr()
980 if (planes[plane].length < q->plane_sizes[plane]) { in __qbuf_userptr()
987 call_memop(q, put_userptr, vb->planes[plane].mem_priv); in __qbuf_userptr()
994 mem_priv = call_memop(q, get_userptr, q->alloc_ctx[plane], in __qbuf_userptr()
1010 ret = call_qop(q, buf_init, vb); in __qbuf_userptr()
1028 call_memop(q, put_userptr, vb->planes[plane].mem_priv); in __qbuf_userptr()
1052 struct vb2_queue *q = vb->vb2_queue; in __qbuf_dmabuf() local
1056 int write = !V4L2_TYPE_IS_OUTPUT(q->type); in __qbuf_dmabuf()
1076 q->plane_sizes[plane]) { in __qbuf_dmabuf()
1091 __vb2_plane_dmabuf_put(q, &vb->planes[plane]); in __qbuf_dmabuf()
1095 mem_priv = call_memop(q, attach_dmabuf, q->alloc_ctx[plane], in __qbuf_dmabuf()
1113 ret = call_memop(q, map_dmabuf, vb->planes[plane].mem_priv); in __qbuf_dmabuf()
1126 ret = call_qop(q, buf_init, vb); in __qbuf_dmabuf()
1152 struct vb2_queue *q = vb->vb2_queue; in __enqueue_in_driver() local
1156 atomic_inc(&q->queued_count); in __enqueue_in_driver()
1160 call_memop(q, prepare, vb->planes[plane].mem_priv); in __enqueue_in_driver()
1162 q->ops->buf_queue(vb); in __enqueue_in_driver()
1167 struct vb2_queue *q = vb->vb2_queue; in __buf_prepare() local
1170 switch (q->memory) { in __buf_prepare()
1186 ret = call_qop(q, buf_prepare, vb); in __buf_prepare()
1210 int vb2_prepare_buf(struct vb2_queue *q, struct v4l2_buffer *b) in vb2_prepare_buf() argument
1215 if (q->fileio) { in vb2_prepare_buf()
1220 if (b->type != q->type) { in vb2_prepare_buf()
1225 if (b->index >= q->num_buffers) { in vb2_prepare_buf()
1230 vb = q->bufs[b->index]; in vb2_prepare_buf()
1237 if (b->memory != q->memory) { in vb2_prepare_buf()
1276 int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b) in vb2_qbuf() argument
1298 if (q->memory == V4L2_MEMORY_USERPTR) { in vb2_qbuf()
1300 call_qop(q, wait_prepare, q); in vb2_qbuf()
1302 call_qop(q, wait_finish, q); in vb2_qbuf()
1305 if (q->fileio) { in vb2_qbuf()
1311 if (b->type != q->type) { in vb2_qbuf()
1317 if (b->index >= q->num_buffers) { in vb2_qbuf()
1323 vb = q->bufs[b->index]; in vb2_qbuf()
1331 if (b->memory != q->memory) { in vb2_qbuf()
1357 list_add_tail(&vb->queued_entry, &q->queued_list); in vb2_qbuf()
1364 if (q->streaming) in vb2_qbuf()
1384 static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking) in __vb2_wait_for_done_vb() argument
1398 if (!q->streaming) { in __vb2_wait_for_done_vb()
1403 if (!list_empty(&q->done_list)) { in __vb2_wait_for_done_vb()
1421 call_qop(q, wait_prepare, q); in __vb2_wait_for_done_vb()
1427 ret = wait_event_interruptible(q->done_wq, in __vb2_wait_for_done_vb()
1428 !list_empty(&q->done_list) || !q->streaming); in __vb2_wait_for_done_vb()
1434 call_qop(q, wait_finish, q); in __vb2_wait_for_done_vb()
1448 static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, in __vb2_get_done_vb() argument
1457 ret = __vb2_wait_for_done_vb(q, nonblocking); in __vb2_get_done_vb()
1465 spin_lock_irqsave(&q->done_lock, flags); in __vb2_get_done_vb()
1466 *vb = list_first_entry(&q->done_list, struct vb2_buffer, done_entry); in __vb2_get_done_vb()
1474 spin_unlock_irqrestore(&q->done_lock, flags); in __vb2_get_done_vb()
1488 int vb2_wait_for_all_buffers(struct vb2_queue *q) in vb2_wait_for_all_buffers() argument
1490 if (!q->streaming) { in vb2_wait_for_all_buffers()
1495 wait_event(q->done_wq, !atomic_read(&q->queued_count)); in vb2_wait_for_all_buffers()
1505 struct vb2_queue *q = vb->vb2_queue; in __vb2_dqbuf() local
1515 if (q->memory == V4L2_MEMORY_DMABUF) in __vb2_dqbuf()
1519 call_memop(q, unmap_dmabuf, vb->planes[i].mem_priv); in __vb2_dqbuf()
1545 int vb2_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking) in vb2_dqbuf() argument
1550 if (q->fileio) { in vb2_dqbuf()
1555 if (b->type != q->type) { in vb2_dqbuf()
1559 ret = __vb2_get_done_vb(q, &vb, b, nonblocking); in vb2_dqbuf()
1563 ret = call_qop(q, buf_finish, vb); in vb2_dqbuf()
1601 static void __vb2_queue_cancel(struct vb2_queue *q) in __vb2_queue_cancel() argument
1609 if (q->streaming) in __vb2_queue_cancel()
1610 call_qop(q, stop_streaming, q); in __vb2_queue_cancel()
1611 q->streaming = 0; in __vb2_queue_cancel()
1616 INIT_LIST_HEAD(&q->queued_list); in __vb2_queue_cancel()
1621 INIT_LIST_HEAD(&q->done_list); in __vb2_queue_cancel()
1622 atomic_set(&q->queued_count, 0); in __vb2_queue_cancel()
1623 wake_up_all(&q->done_wq); in __vb2_queue_cancel()
1628 for (i = 0; i < q->num_buffers; ++i) in __vb2_queue_cancel()
1629 __vb2_dqbuf(q->bufs[i]); in __vb2_queue_cancel()
1645 int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type) in vb2_streamon() argument
1650 if (q->fileio) { in vb2_streamon()
1655 if (type != q->type) { in vb2_streamon()
1660 if (q->streaming) { in vb2_streamon()
1669 list_for_each_entry(vb, &q->queued_list, queued_entry) in vb2_streamon()
1675 ret = call_qop(q, start_streaming, q, atomic_read(&q->queued_count)); in vb2_streamon()
1678 __vb2_queue_cancel(q); in vb2_streamon()
1682 q->streaming = 1; in vb2_streamon()
1705 int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type) in vb2_streamoff() argument
1707 if (q->fileio) { in vb2_streamoff()
1712 if (type != q->type) { in vb2_streamoff()
1717 if (!q->streaming) { in vb2_streamoff()
1726 __vb2_queue_cancel(q); in vb2_streamoff()
1736 static int __find_plane_by_offset(struct vb2_queue *q, unsigned long off, in __find_plane_by_offset() argument
1747 for (buffer = 0; buffer < q->num_buffers; ++buffer) { in __find_plane_by_offset()
1748 vb = q->bufs[buffer]; in __find_plane_by_offset()
1771 int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb) in vb2_expbuf() argument
1778 if (q->memory != V4L2_MEMORY_MMAP) { in vb2_expbuf()
1783 if (!q->mem_ops->get_dmabuf) { in vb2_expbuf()
1793 if (eb->type != q->type) { in vb2_expbuf()
1798 if (eb->index >= q->num_buffers) { in vb2_expbuf()
1803 vb = q->bufs[eb->index]; in vb2_expbuf()
1812 dbuf = call_memop(q, get_dmabuf, vb_plane->mem_priv); in vb2_expbuf()
1854 int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma) in vb2_mmap() argument
1862 if (q->memory != V4L2_MEMORY_MMAP) { in vb2_mmap()
1874 if (V4L2_TYPE_IS_OUTPUT(q->type)) { in vb2_mmap()
1889 ret = __find_plane_by_offset(q, off, &buffer, &plane); in vb2_mmap()
1893 vb = q->bufs[buffer]; in vb2_mmap()
1907 ret = call_memop(q, mmap, vb->planes[plane].mem_priv, vma); in vb2_mmap()
1917 unsigned long vb2_get_unmapped_area(struct vb2_queue *q, in vb2_get_unmapped_area() argument
1928 if (q->memory != V4L2_MEMORY_MMAP) { in vb2_get_unmapped_area()
1936 ret = __find_plane_by_offset(q, off, &buffer, &plane); in vb2_get_unmapped_area()
1940 vb = q->bufs[buffer]; in vb2_get_unmapped_area()
1947 static int __vb2_init_fileio(struct vb2_queue *q, int read);
1948 static int __vb2_cleanup_fileio(struct vb2_queue *q);
1969 unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) in vb2_poll() argument
1986 if (!V4L2_TYPE_IS_OUTPUT(q->type) && !(req_events & (POLLIN | POLLRDNORM))) in vb2_poll()
1988 if (V4L2_TYPE_IS_OUTPUT(q->type) && !(req_events & (POLLOUT | POLLWRNORM))) in vb2_poll()
1994 if (q->num_buffers == 0 && q->fileio == NULL) { in vb2_poll()
1995 if (!V4L2_TYPE_IS_OUTPUT(q->type) && (q->io_modes & VB2_READ) && in vb2_poll()
1997 if (__vb2_init_fileio(q, 1)) in vb2_poll()
2000 if (V4L2_TYPE_IS_OUTPUT(q->type) && (q->io_modes & VB2_WRITE) && in vb2_poll()
2002 if (__vb2_init_fileio(q, 0)) in vb2_poll()
2014 if (list_empty(&q->queued_list)) in vb2_poll()
2017 if (list_empty(&q->done_list)) in vb2_poll()
2018 poll_wait(file, &q->done_wq, wait); in vb2_poll()
2023 spin_lock_irqsave(&q->done_lock, flags); in vb2_poll()
2024 if (!list_empty(&q->done_list)) in vb2_poll()
2025 vb = list_first_entry(&q->done_list, struct vb2_buffer, in vb2_poll()
2027 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_poll()
2031 return (V4L2_TYPE_IS_OUTPUT(q->type)) ? in vb2_poll()
2050 int vb2_queue_init(struct vb2_queue *q) in vb2_queue_init() argument
2055 if (WARN_ON(!q) || in vb2_queue_init()
2056 WARN_ON(!q->ops) || in vb2_queue_init()
2057 WARN_ON(!q->mem_ops) || in vb2_queue_init()
2058 WARN_ON(!q->type) || in vb2_queue_init()
2059 WARN_ON(!q->io_modes) || in vb2_queue_init()
2060 WARN_ON(!q->ops->queue_setup) || in vb2_queue_init()
2061 WARN_ON(!q->ops->buf_queue) || in vb2_queue_init()
2062 WARN_ON(q->timestamp_type & ~V4L2_BUF_FLAG_TIMESTAMP_MASK)) in vb2_queue_init()
2066 WARN_ON(q->timestamp_type == V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN); in vb2_queue_init()
2068 INIT_LIST_HEAD(&q->queued_list); in vb2_queue_init()
2069 INIT_LIST_HEAD(&q->done_list); in vb2_queue_init()
2070 spin_lock_init(&q->done_lock); in vb2_queue_init()
2071 init_waitqueue_head(&q->done_wq); in vb2_queue_init()
2073 if (q->buf_struct_size == 0) in vb2_queue_init()
2074 q->buf_struct_size = sizeof(struct vb2_buffer); in vb2_queue_init()
2088 void vb2_queue_release(struct vb2_queue *q) in vb2_queue_release() argument
2090 __vb2_cleanup_fileio(q); in vb2_queue_release()
2091 __vb2_queue_cancel(q); in vb2_queue_release()
2092 __vb2_queue_free(q, q->num_buffers); in vb2_queue_release()
2133 static int __vb2_init_fileio(struct vb2_queue *q, int read) in __vb2_init_fileio() argument
2142 if ((read && !(q->io_modes & VB2_READ)) || in __vb2_init_fileio()
2143 (!read && !(q->io_modes & VB2_WRITE))) in __vb2_init_fileio()
2149 if (!q->mem_ops->vaddr) in __vb2_init_fileio()
2155 if (q->streaming || q->num_buffers > 0) in __vb2_init_fileio()
2164 (read) ? "read" : "write", count, q->io_flags); in __vb2_init_fileio()
2170 fileio->flags = q->io_flags; in __vb2_init_fileio()
2178 fileio->req.type = q->type; in __vb2_init_fileio()
2179 ret = vb2_reqbufs(q, &fileio->req); in __vb2_init_fileio()
2187 if (q->bufs[0]->num_planes != 1) { in __vb2_init_fileio()
2195 for (i = 0; i < q->num_buffers; i++) { in __vb2_init_fileio()
2196 fileio->bufs[i].vaddr = vb2_plane_vaddr(q->bufs[i], 0); in __vb2_init_fileio()
2199 fileio->bufs[i].size = vb2_plane_size(q->bufs[i], 0); in __vb2_init_fileio()
2209 for (i = 0; i < q->num_buffers; i++) { in __vb2_init_fileio()
2212 b->type = q->type; in __vb2_init_fileio()
2213 b->memory = q->memory; in __vb2_init_fileio()
2215 ret = vb2_qbuf(q, b); in __vb2_init_fileio()
2224 ret = vb2_streamon(q, q->type); in __vb2_init_fileio()
2229 q->fileio = fileio; in __vb2_init_fileio()
2235 vb2_reqbufs(q, &fileio->req); in __vb2_init_fileio()
2246 static int __vb2_cleanup_fileio(struct vb2_queue *q) in __vb2_cleanup_fileio() argument
2248 struct vb2_fileio_data *fileio = q->fileio; in __vb2_cleanup_fileio()
2255 q->fileio = NULL; in __vb2_cleanup_fileio()
2257 vb2_streamoff(q, q->type); in __vb2_cleanup_fileio()
2259 vb2_reqbufs(q, &fileio->req); in __vb2_cleanup_fileio()
2275 static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_t count, in __vb2_perform_fileio() argument
2292 if (!q->fileio) { in __vb2_perform_fileio()
2293 ret = __vb2_init_fileio(q, read); in __vb2_perform_fileio()
2298 fileio = q->fileio; in __vb2_perform_fileio()
2304 q->fileio = NULL; in __vb2_perform_fileio()
2319 fileio->b.type = q->type; in __vb2_perform_fileio()
2320 fileio->b.memory = q->memory; in __vb2_perform_fileio()
2322 ret = vb2_dqbuf(q, &fileio->b, nonblock); in __vb2_perform_fileio()
2331 vb = q->bufs[index]; in __vb2_perform_fileio()
2379 q->fileio = fileio; in __vb2_perform_fileio()
2380 return __vb2_cleanup_fileio(q); in __vb2_perform_fileio()
2387 fileio->b.type = q->type; in __vb2_perform_fileio()
2388 fileio->b.memory = q->memory; in __vb2_perform_fileio()
2391 ret = vb2_qbuf(q, &fileio->b); in __vb2_perform_fileio()
2401 buf->size = q->bufs[0]->v4l2_planes[0].length; in __vb2_perform_fileio()
2407 fileio->index = (index + 1) % q->num_buffers; in __vb2_perform_fileio()
2412 if (!read && !q->streaming) { in __vb2_perform_fileio()
2413 ret = vb2_streamon(q, q->type); in __vb2_perform_fileio()
2428 q->fileio = fileio; in __vb2_perform_fileio()
2432 size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count, in vb2_read() argument
2435 return __vb2_perform_fileio(q, data, count, ppos, nonblocking, 1); in vb2_read()
2439 size_t vb2_write(struct vb2_queue *q, char __user *data, size_t count, in vb2_write() argument
2442 return __vb2_perform_fileio(q, data, count, ppos, nonblocking, 0); in vb2_write()
2643 struct vb2_queue *q = vdev->queue; in vb2_fop_poll() local
2644 struct mutex *lock = q->lock ? q->lock : vdev->lock; in vb2_fop_poll()
2652 if (q->num_buffers == 0 && q->fileio == NULL) { in vb2_fop_poll()
2653 if (!V4L2_TYPE_IS_OUTPUT(q->type) && (q->io_modes & VB2_READ) && in vb2_fop_poll()
2656 else if (V4L2_TYPE_IS_OUTPUT(q->type) && (q->io_modes & VB2_WRITE) && in vb2_fop_poll()
2668 fileio = q->fileio; in vb2_fop_poll()
2673 if (must_lock && !fileio && q->fileio) in vb2_fop_poll()
2674 q->owner = file->private_data; in vb2_fop_poll()