| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef _UVC_QUEUE_H_ | |
| #define _UVC_QUEUE_H_ | |
| #include <linux/list.h> | |
| #include <linux/poll.h> | |
| #include <linux/spinlock.h> | |
| #include <media/videobuf2-v4l2.h> | |
| struct file; | |
| struct mutex; | |
| /* Maximum frame size in bytes, for sanity checking. */ | |
| #define UVC_MAX_FRAME_SIZE (16*1024*1024) | |
| /* Maximum number of video buffers. */ | |
| #define UVC_MAX_VIDEO_BUFFERS 32 | |
| /* ------------------------------------------------------------------------ | |
| * Structures. | |
| */ | |
| enum uvc_buffer_state { | |
| UVC_BUF_STATE_IDLE = 0, | |
| UVC_BUF_STATE_QUEUED = 1, | |
| UVC_BUF_STATE_ACTIVE = 2, | |
| UVC_BUF_STATE_DONE = 3, | |
| UVC_BUF_STATE_ERROR = 4, | |
| }; | |
| struct uvc_buffer { | |
| struct vb2_v4l2_buffer buf; | |
| struct list_head queue; | |
| enum uvc_buffer_state state; | |
| void *mem; | |
| struct sg_table *sgt; | |
| struct scatterlist *sg; | |
| unsigned int offset; | |
| unsigned int length; | |
| unsigned int bytesused; | |
| /* req_payload_size: only used with isoc */ | |
| unsigned int req_payload_size; | |
| }; | |
| #define UVC_QUEUE_DISCONNECTED (1 << 0) | |
| #define UVC_QUEUE_DROP_INCOMPLETE (1 << 1) | |
| struct uvc_video_queue { | |
| struct vb2_queue queue; | |
| unsigned int flags; | |
| __u32 sequence; | |
| unsigned int buf_used; | |
| bool use_sg; | |
| spinlock_t irqlock; /* Protects flags and irqqueue */ | |
| struct list_head irqqueue; | |
| }; | |
| static inline int uvc_queue_streaming(struct uvc_video_queue *queue) | |
| { | |
| return vb2_is_streaming(&queue->queue); | |
| } | |
| int uvcg_queue_init(struct uvc_video_queue *queue, struct device *dev, enum v4l2_buf_type type, | |
| struct mutex *lock); | |
| void uvcg_free_buffers(struct uvc_video_queue *queue); | |
| int uvcg_alloc_buffers(struct uvc_video_queue *queue, | |
| struct v4l2_requestbuffers *rb); | |
| int uvcg_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf); | |
| int uvcg_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf); | |
| int uvcg_dequeue_buffer(struct uvc_video_queue *queue, | |
| struct v4l2_buffer *buf, int nonblocking); | |
| __poll_t uvcg_queue_poll(struct uvc_video_queue *queue, | |
| struct file *file, poll_table *wait); | |
| int uvcg_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma); | |
| #ifndef CONFIG_MMU | |
| unsigned long uvcg_queue_get_unmapped_area(struct uvc_video_queue *queue, | |
| unsigned long pgoff); | |
| #endif /* CONFIG_MMU */ | |
| void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect); | |
| int uvcg_queue_enable(struct uvc_video_queue *queue, int enable); | |
| void uvcg_complete_buffer(struct uvc_video_queue *queue, | |
| struct uvc_buffer *buf); | |
| struct uvc_buffer *uvcg_queue_head(struct uvc_video_queue *queue); | |
| #endif /* _UVC_QUEUE_H_ */ | |