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