1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
200a2430fSAndrzej Pietrasiewicz #ifndef _UVC_QUEUE_H_
300a2430fSAndrzej Pietrasiewicz #define _UVC_QUEUE_H_
400a2430fSAndrzej Pietrasiewicz
5284eb166SLaurent Pinchart #include <linux/list.h>
600a2430fSAndrzej Pietrasiewicz #include <linux/poll.h>
7284eb166SLaurent Pinchart #include <linux/spinlock.h>
8284eb166SLaurent Pinchart
9c139990eSJunghak Sung #include <media/videobuf2-v4l2.h>
1000a2430fSAndrzej Pietrasiewicz
11284eb166SLaurent Pinchart struct file;
12284eb166SLaurent Pinchart struct mutex;
13284eb166SLaurent Pinchart
1400a2430fSAndrzej Pietrasiewicz /* Maximum frame size in bytes, for sanity checking. */
1500a2430fSAndrzej Pietrasiewicz #define UVC_MAX_FRAME_SIZE (16*1024*1024)
1600a2430fSAndrzej Pietrasiewicz /* Maximum number of video buffers. */
1700a2430fSAndrzej Pietrasiewicz #define UVC_MAX_VIDEO_BUFFERS 32
1800a2430fSAndrzej Pietrasiewicz
1900a2430fSAndrzej Pietrasiewicz /* ------------------------------------------------------------------------
2000a2430fSAndrzej Pietrasiewicz * Structures.
2100a2430fSAndrzej Pietrasiewicz */
2200a2430fSAndrzej Pietrasiewicz
2300a2430fSAndrzej Pietrasiewicz enum uvc_buffer_state {
2400a2430fSAndrzej Pietrasiewicz UVC_BUF_STATE_IDLE = 0,
2500a2430fSAndrzej Pietrasiewicz UVC_BUF_STATE_QUEUED = 1,
2600a2430fSAndrzej Pietrasiewicz UVC_BUF_STATE_ACTIVE = 2,
2700a2430fSAndrzej Pietrasiewicz UVC_BUF_STATE_DONE = 3,
2800a2430fSAndrzej Pietrasiewicz UVC_BUF_STATE_ERROR = 4,
2900a2430fSAndrzej Pietrasiewicz };
3000a2430fSAndrzej Pietrasiewicz
3100a2430fSAndrzej Pietrasiewicz struct uvc_buffer {
322d700715SJunghak Sung struct vb2_v4l2_buffer buf;
3300a2430fSAndrzej Pietrasiewicz struct list_head queue;
3400a2430fSAndrzej Pietrasiewicz
3500a2430fSAndrzej Pietrasiewicz enum uvc_buffer_state state;
3600a2430fSAndrzej Pietrasiewicz void *mem;
37e81e7f9aSMichael Grzeschik struct sg_table *sgt;
38e81e7f9aSMichael Grzeschik struct scatterlist *sg;
39e81e7f9aSMichael Grzeschik unsigned int offset;
4000a2430fSAndrzej Pietrasiewicz unsigned int length;
4100a2430fSAndrzej Pietrasiewicz unsigned int bytesused;
42*98ad0329SMichael Grzeschik /* req_payload_size: only used with isoc */
43*98ad0329SMichael Grzeschik unsigned int req_payload_size;
4400a2430fSAndrzej Pietrasiewicz };
4500a2430fSAndrzej Pietrasiewicz
4600a2430fSAndrzej Pietrasiewicz #define UVC_QUEUE_DISCONNECTED (1 << 0)
4700a2430fSAndrzej Pietrasiewicz #define UVC_QUEUE_DROP_INCOMPLETE (1 << 1)
4800a2430fSAndrzej Pietrasiewicz
4900a2430fSAndrzej Pietrasiewicz struct uvc_video_queue {
5000a2430fSAndrzej Pietrasiewicz struct vb2_queue queue;
5100a2430fSAndrzej Pietrasiewicz
5200a2430fSAndrzej Pietrasiewicz unsigned int flags;
5300a2430fSAndrzej Pietrasiewicz __u32 sequence;
5400a2430fSAndrzej Pietrasiewicz
5500a2430fSAndrzej Pietrasiewicz unsigned int buf_used;
5600a2430fSAndrzej Pietrasiewicz
57e81e7f9aSMichael Grzeschik bool use_sg;
58e81e7f9aSMichael Grzeschik
5900a2430fSAndrzej Pietrasiewicz spinlock_t irqlock; /* Protects flags and irqqueue */
6000a2430fSAndrzej Pietrasiewicz struct list_head irqqueue;
6100a2430fSAndrzej Pietrasiewicz };
6200a2430fSAndrzej Pietrasiewicz
uvc_queue_streaming(struct uvc_video_queue * queue)6300a2430fSAndrzej Pietrasiewicz static inline int uvc_queue_streaming(struct uvc_video_queue *queue)
6400a2430fSAndrzej Pietrasiewicz {
6500a2430fSAndrzej Pietrasiewicz return vb2_is_streaming(&queue->queue);
6600a2430fSAndrzej Pietrasiewicz }
6700a2430fSAndrzej Pietrasiewicz
68e81e7f9aSMichael Grzeschik int uvcg_queue_init(struct uvc_video_queue *queue, struct device *dev, enum v4l2_buf_type type,
69d8e96c4bSHans Verkuil struct mutex *lock);
703a83c16eSAndrzej Pietrasiewicz
713a83c16eSAndrzej Pietrasiewicz void uvcg_free_buffers(struct uvc_video_queue *queue);
723a83c16eSAndrzej Pietrasiewicz
733a83c16eSAndrzej Pietrasiewicz int uvcg_alloc_buffers(struct uvc_video_queue *queue,
743a83c16eSAndrzej Pietrasiewicz struct v4l2_requestbuffers *rb);
753a83c16eSAndrzej Pietrasiewicz
763a83c16eSAndrzej Pietrasiewicz int uvcg_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf);
773a83c16eSAndrzej Pietrasiewicz
783a83c16eSAndrzej Pietrasiewicz int uvcg_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf);
793a83c16eSAndrzej Pietrasiewicz
803a83c16eSAndrzej Pietrasiewicz int uvcg_dequeue_buffer(struct uvc_video_queue *queue,
813a83c16eSAndrzej Pietrasiewicz struct v4l2_buffer *buf, int nonblocking);
823a83c16eSAndrzej Pietrasiewicz
83c23e0cb8SAl Viro __poll_t uvcg_queue_poll(struct uvc_video_queue *queue,
843a83c16eSAndrzej Pietrasiewicz struct file *file, poll_table *wait);
853a83c16eSAndrzej Pietrasiewicz
863a83c16eSAndrzej Pietrasiewicz int uvcg_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma);
873a83c16eSAndrzej Pietrasiewicz
883a83c16eSAndrzej Pietrasiewicz #ifndef CONFIG_MMU
893a83c16eSAndrzej Pietrasiewicz unsigned long uvcg_queue_get_unmapped_area(struct uvc_video_queue *queue,
903a83c16eSAndrzej Pietrasiewicz unsigned long pgoff);
913a83c16eSAndrzej Pietrasiewicz #endif /* CONFIG_MMU */
923a83c16eSAndrzej Pietrasiewicz
933a83c16eSAndrzej Pietrasiewicz void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect);
943a83c16eSAndrzej Pietrasiewicz
953a83c16eSAndrzej Pietrasiewicz int uvcg_queue_enable(struct uvc_video_queue *queue, int enable);
963a83c16eSAndrzej Pietrasiewicz
9761aa709cSMichael Grzeschik void uvcg_complete_buffer(struct uvc_video_queue *queue,
983a83c16eSAndrzej Pietrasiewicz struct uvc_buffer *buf);
993a83c16eSAndrzej Pietrasiewicz
1003a83c16eSAndrzej Pietrasiewicz struct uvc_buffer *uvcg_queue_head(struct uvc_video_queue *queue);
1013a83c16eSAndrzej Pietrasiewicz
10200a2430fSAndrzej Pietrasiewicz #endif /* _UVC_QUEUE_H_ */
10300a2430fSAndrzej Pietrasiewicz
104