xref: /OK3568_Linux_fs/kernel/drivers/media/usb/stkwebcam/stk-webcam.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * stk-webcam.h : Driver for Syntek 1125 USB webcam controller
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2006 Nicolas VIVIEN
6*4882a593Smuzhiyun  * Copyright 2007-2008 Jaime Velasco Juan <jsagarribay@gmail.com>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef STKWEBCAM_H
10*4882a593Smuzhiyun #define STKWEBCAM_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/usb.h>
13*4882a593Smuzhiyun #include <media/v4l2-device.h>
14*4882a593Smuzhiyun #include <media/v4l2-ctrls.h>
15*4882a593Smuzhiyun #include <media/v4l2-common.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define DRIVER_VERSION		"v0.0.1"
18*4882a593Smuzhiyun #define DRIVER_VERSION_NUM	0x000001
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define MAX_ISO_BUFS		3
21*4882a593Smuzhiyun #define ISO_FRAMES_PER_DESC	16
22*4882a593Smuzhiyun #define ISO_MAX_FRAME_SIZE	3 * 1024
23*4882a593Smuzhiyun #define ISO_BUFFER_SIZE		(ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE)
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun struct stk_iso_buf {
26*4882a593Smuzhiyun 	void *data;
27*4882a593Smuzhiyun 	int length;
28*4882a593Smuzhiyun 	int read;
29*4882a593Smuzhiyun 	struct urb *urb;
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /* Streaming IO buffers */
33*4882a593Smuzhiyun struct stk_sio_buffer {
34*4882a593Smuzhiyun 	struct v4l2_buffer v4lbuf;
35*4882a593Smuzhiyun 	char *buffer;
36*4882a593Smuzhiyun 	int mapcount;
37*4882a593Smuzhiyun 	struct stk_camera *dev;
38*4882a593Smuzhiyun 	struct list_head list;
39*4882a593Smuzhiyun };
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun enum stk_mode {MODE_VGA, MODE_SXGA, MODE_CIF, MODE_QVGA, MODE_QCIF};
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun struct stk_video {
44*4882a593Smuzhiyun 	enum stk_mode mode;
45*4882a593Smuzhiyun 	__u32 palette;
46*4882a593Smuzhiyun 	int hflip;
47*4882a593Smuzhiyun 	int vflip;
48*4882a593Smuzhiyun };
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun enum stk_status {
51*4882a593Smuzhiyun 	S_PRESENT = 1,
52*4882a593Smuzhiyun 	S_INITIALISED = 2,
53*4882a593Smuzhiyun 	S_MEMALLOCD = 4,
54*4882a593Smuzhiyun 	S_STREAMING = 8,
55*4882a593Smuzhiyun };
56*4882a593Smuzhiyun #define is_present(dev)		((dev)->status & S_PRESENT)
57*4882a593Smuzhiyun #define is_initialised(dev)	((dev)->status & S_INITIALISED)
58*4882a593Smuzhiyun #define is_streaming(dev)	((dev)->status & S_STREAMING)
59*4882a593Smuzhiyun #define is_memallocd(dev)	((dev)->status & S_MEMALLOCD)
60*4882a593Smuzhiyun #define set_present(dev)	((dev)->status = S_PRESENT)
61*4882a593Smuzhiyun #define unset_present(dev)	((dev)->status &= \
62*4882a593Smuzhiyun 					~(S_PRESENT|S_INITIALISED|S_STREAMING))
63*4882a593Smuzhiyun #define set_initialised(dev)	((dev)->status |= S_INITIALISED)
64*4882a593Smuzhiyun #define unset_initialised(dev)	((dev)->status &= ~S_INITIALISED)
65*4882a593Smuzhiyun #define set_memallocd(dev)	((dev)->status |= S_MEMALLOCD)
66*4882a593Smuzhiyun #define unset_memallocd(dev)	((dev)->status &= ~S_MEMALLOCD)
67*4882a593Smuzhiyun #define set_streaming(dev)	((dev)->status |= S_STREAMING)
68*4882a593Smuzhiyun #define unset_streaming(dev)	((dev)->status &= ~S_STREAMING)
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun struct regval {
71*4882a593Smuzhiyun 	unsigned reg;
72*4882a593Smuzhiyun 	unsigned val;
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun struct stk_camera {
76*4882a593Smuzhiyun 	struct v4l2_device v4l2_dev;
77*4882a593Smuzhiyun 	struct v4l2_ctrl_handler hdl;
78*4882a593Smuzhiyun 	struct video_device vdev;
79*4882a593Smuzhiyun 	struct usb_device *udev;
80*4882a593Smuzhiyun 	struct usb_interface *interface;
81*4882a593Smuzhiyun 	int webcam_model;
82*4882a593Smuzhiyun 	struct file *owner;
83*4882a593Smuzhiyun 	struct mutex lock;
84*4882a593Smuzhiyun 	int first_init;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	u8 isoc_ep;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	/* Not sure if this is right */
89*4882a593Smuzhiyun 	atomic_t urbs_used;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	struct stk_video vsettings;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	enum stk_status status;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	spinlock_t spinlock;
96*4882a593Smuzhiyun 	wait_queue_head_t wait_frame;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	struct stk_iso_buf *isobufs;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	int frame_size;
101*4882a593Smuzhiyun 	/* Streaming buffers */
102*4882a593Smuzhiyun 	int reading;
103*4882a593Smuzhiyun 	unsigned int n_sbufs;
104*4882a593Smuzhiyun 	struct stk_sio_buffer *sio_bufs;
105*4882a593Smuzhiyun 	struct list_head sio_avail;
106*4882a593Smuzhiyun 	struct list_head sio_full;
107*4882a593Smuzhiyun 	unsigned sequence;
108*4882a593Smuzhiyun };
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #define vdev_to_camera(d) container_of(d, struct stk_camera, vdev)
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun int stk_camera_write_reg(struct stk_camera *, u16, u8);
113*4882a593Smuzhiyun int stk_camera_read_reg(struct stk_camera *, u16, u8 *);
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun int stk_sensor_init(struct stk_camera *);
116*4882a593Smuzhiyun int stk_sensor_configure(struct stk_camera *);
117*4882a593Smuzhiyun int stk_sensor_sleep(struct stk_camera *dev);
118*4882a593Smuzhiyun int stk_sensor_wakeup(struct stk_camera *dev);
119*4882a593Smuzhiyun int stk_sensor_set_brightness(struct stk_camera *dev, int br);
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #endif
122