xref: /OK3568_Linux_fs/kernel/drivers/media/usb/tm6000/tm6000.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * tm6000.h - driver for TM5600/TM6000/TM6010 USB video capture devices
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2006-2007 Mauro Carvalho Chehab <mchehab@kernel.org>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (c) 2007 Michel Ludwig <michel.ludwig@gmail.com>
8*4882a593Smuzhiyun  *	- DVB-T support
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/videodev2.h>
12*4882a593Smuzhiyun #include <media/v4l2-common.h>
13*4882a593Smuzhiyun #include <media/videobuf-vmalloc.h>
14*4882a593Smuzhiyun #include "tm6000-usb-isoc.h"
15*4882a593Smuzhiyun #include <linux/i2c.h>
16*4882a593Smuzhiyun #include <linux/mutex.h>
17*4882a593Smuzhiyun #include <media/v4l2-device.h>
18*4882a593Smuzhiyun #include <media/v4l2-ctrls.h>
19*4882a593Smuzhiyun #include <media/v4l2-fh.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include <linux/dvb/frontend.h>
22*4882a593Smuzhiyun #include <media/dvb_demux.h>
23*4882a593Smuzhiyun #include <media/dvb_frontend.h>
24*4882a593Smuzhiyun #include <media/dmxdev.h>
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /* Inputs */
27*4882a593Smuzhiyun enum tm6000_itype {
28*4882a593Smuzhiyun 	TM6000_INPUT_TV	= 1,
29*4882a593Smuzhiyun 	TM6000_INPUT_COMPOSITE1,
30*4882a593Smuzhiyun 	TM6000_INPUT_COMPOSITE2,
31*4882a593Smuzhiyun 	TM6000_INPUT_SVIDEO,
32*4882a593Smuzhiyun 	TM6000_INPUT_DVB,
33*4882a593Smuzhiyun 	TM6000_INPUT_RADIO,
34*4882a593Smuzhiyun };
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun enum tm6000_mux {
37*4882a593Smuzhiyun 	TM6000_VMUX_VIDEO_A = 1,
38*4882a593Smuzhiyun 	TM6000_VMUX_VIDEO_B,
39*4882a593Smuzhiyun 	TM6000_VMUX_VIDEO_AB,
40*4882a593Smuzhiyun 	TM6000_AMUX_ADC1,
41*4882a593Smuzhiyun 	TM6000_AMUX_ADC2,
42*4882a593Smuzhiyun 	TM6000_AMUX_SIF1,
43*4882a593Smuzhiyun 	TM6000_AMUX_SIF2,
44*4882a593Smuzhiyun 	TM6000_AMUX_I2S,
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun enum tm6000_devtype {
48*4882a593Smuzhiyun 	TM6000 = 0,
49*4882a593Smuzhiyun 	TM5600,
50*4882a593Smuzhiyun 	TM6010,
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun struct tm6000_input {
54*4882a593Smuzhiyun 	enum tm6000_itype	type;
55*4882a593Smuzhiyun 	enum tm6000_mux		vmux;
56*4882a593Smuzhiyun 	enum tm6000_mux		amux;
57*4882a593Smuzhiyun 	unsigned int		v_gpio;
58*4882a593Smuzhiyun 	unsigned int		a_gpio;
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /* ------------------------------------------------------------------
62*4882a593Smuzhiyun  *	Basic structures
63*4882a593Smuzhiyun  * ------------------------------------------------------------------
64*4882a593Smuzhiyun  */
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun struct tm6000_fmt {
67*4882a593Smuzhiyun 	u32   fourcc;          /* v4l2 format id */
68*4882a593Smuzhiyun 	int   depth;
69*4882a593Smuzhiyun };
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* buffer for one video frame */
72*4882a593Smuzhiyun struct tm6000_buffer {
73*4882a593Smuzhiyun 	/* common v4l buffer stuff -- must be first */
74*4882a593Smuzhiyun 	struct videobuf_buffer vb;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	struct tm6000_fmt      *fmt;
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun struct tm6000_dmaqueue {
80*4882a593Smuzhiyun 	struct list_head       active;
81*4882a593Smuzhiyun 	struct list_head       queued;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	/* thread for generating video stream*/
84*4882a593Smuzhiyun 	struct task_struct         *kthread;
85*4882a593Smuzhiyun 	wait_queue_head_t          wq;
86*4882a593Smuzhiyun 	/* Counters to control fps rate */
87*4882a593Smuzhiyun 	int                        frame;
88*4882a593Smuzhiyun 	int                        ini_jiffies;
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* device states */
92*4882a593Smuzhiyun enum tm6000_core_state {
93*4882a593Smuzhiyun 	DEV_INITIALIZED   = 0x01,
94*4882a593Smuzhiyun 	DEV_DISCONNECTED  = 0x02,
95*4882a593Smuzhiyun 	DEV_MISCONFIGURED = 0x04,
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /* io methods */
99*4882a593Smuzhiyun enum tm6000_io_method {
100*4882a593Smuzhiyun 	IO_NONE,
101*4882a593Smuzhiyun 	IO_READ,
102*4882a593Smuzhiyun 	IO_MMAP,
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun enum tm6000_mode {
106*4882a593Smuzhiyun 	TM6000_MODE_UNKNOWN = 0,
107*4882a593Smuzhiyun 	TM6000_MODE_ANALOG,
108*4882a593Smuzhiyun 	TM6000_MODE_DIGITAL,
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun struct tm6000_gpio {
112*4882a593Smuzhiyun 	int		tuner_reset;
113*4882a593Smuzhiyun 	int		tuner_on;
114*4882a593Smuzhiyun 	int		demod_reset;
115*4882a593Smuzhiyun 	int		demod_on;
116*4882a593Smuzhiyun 	int		power_led;
117*4882a593Smuzhiyun 	int		dvb_led;
118*4882a593Smuzhiyun 	int		ir;
119*4882a593Smuzhiyun };
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun struct tm6000_capabilities {
122*4882a593Smuzhiyun 	unsigned int    has_tuner:1;
123*4882a593Smuzhiyun 	unsigned int    has_tda9874:1;
124*4882a593Smuzhiyun 	unsigned int    has_dvb:1;
125*4882a593Smuzhiyun 	unsigned int    has_zl10353:1;
126*4882a593Smuzhiyun 	unsigned int    has_eeprom:1;
127*4882a593Smuzhiyun 	unsigned int    has_remote:1;
128*4882a593Smuzhiyun 	unsigned int    has_radio:1;
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun struct tm6000_dvb {
132*4882a593Smuzhiyun 	struct dvb_adapter	adapter;
133*4882a593Smuzhiyun 	struct dvb_demux	demux;
134*4882a593Smuzhiyun 	struct dvb_frontend	*frontend;
135*4882a593Smuzhiyun 	struct dmxdev		dmxdev;
136*4882a593Smuzhiyun 	unsigned int		streams;
137*4882a593Smuzhiyun 	struct urb		*bulk_urb;
138*4882a593Smuzhiyun 	struct mutex		mutex;
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun struct snd_tm6000_card {
142*4882a593Smuzhiyun 	struct snd_card			*card;
143*4882a593Smuzhiyun 	spinlock_t			reg_lock;
144*4882a593Smuzhiyun 	struct tm6000_core		*core;
145*4882a593Smuzhiyun 	struct snd_pcm_substream	*substream;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	/* temporary data for buffer fill processing */
148*4882a593Smuzhiyun 	unsigned			buf_pos;
149*4882a593Smuzhiyun 	unsigned			period_pos;
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun struct tm6000_endpoint {
153*4882a593Smuzhiyun 	struct usb_host_endpoint	*endp;
154*4882a593Smuzhiyun 	__u8				bInterfaceNumber;
155*4882a593Smuzhiyun 	__u8				bAlternateSetting;
156*4882a593Smuzhiyun 	unsigned			maxsize;
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun #define TM6000_QUIRK_NO_USB_DELAY (1 << 0)
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun struct tm6000_core {
162*4882a593Smuzhiyun 	/* generic device properties */
163*4882a593Smuzhiyun 	char				name[30];	/* name (including minor) of the device */
164*4882a593Smuzhiyun 	int				model;		/* index in the device_data struct */
165*4882a593Smuzhiyun 	int				devno;		/* marks the number of this device */
166*4882a593Smuzhiyun 	enum tm6000_devtype		dev_type;	/* type of device */
167*4882a593Smuzhiyun 	unsigned char			eedata[256];	/* Eeprom data */
168*4882a593Smuzhiyun 	unsigned			eedata_size;	/* Size of the eeprom info */
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	v4l2_std_id                     norm;           /* Current norm */
171*4882a593Smuzhiyun 	int				width, height;	/* Selected resolution */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	enum tm6000_core_state		state;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	/* Device Capabilities*/
176*4882a593Smuzhiyun 	struct tm6000_capabilities	caps;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	/* Used to load alsa/dvb */
179*4882a593Smuzhiyun 	struct work_struct		request_module_wk;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	/* Tuner configuration */
182*4882a593Smuzhiyun 	int				tuner_type;		/* type of the tuner */
183*4882a593Smuzhiyun 	int				tuner_addr;		/* tuner address */
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	struct tm6000_gpio		gpio;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	char				*ir_codes;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	__u8				radio;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	/* Demodulator configuration */
192*4882a593Smuzhiyun 	int				demod_addr;	/* demodulator address */
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	int				audio_bitrate;
195*4882a593Smuzhiyun 	/* i2c i/o */
196*4882a593Smuzhiyun 	struct i2c_adapter		i2c_adap;
197*4882a593Smuzhiyun 	struct i2c_client		i2c_client;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	/* extension */
201*4882a593Smuzhiyun 	struct list_head		devlist;
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	/* video for linux */
204*4882a593Smuzhiyun 	int				users;
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	/* various device info */
207*4882a593Smuzhiyun 	struct tm6000_fh		*resources;	/* Points to fh that is streaming */
208*4882a593Smuzhiyun 	bool				is_res_read;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	struct video_device		vfd;
211*4882a593Smuzhiyun 	struct video_device		radio_dev;
212*4882a593Smuzhiyun 	struct tm6000_dmaqueue		vidq;
213*4882a593Smuzhiyun 	struct v4l2_device		v4l2_dev;
214*4882a593Smuzhiyun 	struct v4l2_ctrl_handler	ctrl_handler;
215*4882a593Smuzhiyun 	struct v4l2_ctrl_handler	radio_ctrl_handler;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	int				input;
218*4882a593Smuzhiyun 	struct tm6000_input		vinput[3];	/* video input */
219*4882a593Smuzhiyun 	struct tm6000_input		rinput;		/* radio input */
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	int				freq;
222*4882a593Smuzhiyun 	unsigned int			fourcc;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	enum tm6000_mode		mode;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	int				ctl_mute;             /* audio */
227*4882a593Smuzhiyun 	int				ctl_volume;
228*4882a593Smuzhiyun 	int				amode;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	/* DVB-T support */
231*4882a593Smuzhiyun 	struct tm6000_dvb		*dvb;
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	/* audio support */
234*4882a593Smuzhiyun 	struct snd_tm6000_card		*adev;
235*4882a593Smuzhiyun 	struct work_struct		wq_trigger;   /* Trigger to start/stop audio for alsa module */
236*4882a593Smuzhiyun 	atomic_t			stream_started;  /* stream should be running if true */
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	struct tm6000_IR		*ir;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	/* locks */
241*4882a593Smuzhiyun 	struct mutex			lock;
242*4882a593Smuzhiyun 	struct mutex			usb_lock;
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	/* usb transfer */
245*4882a593Smuzhiyun 	struct usb_device		*udev;		/* the usb device */
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	struct tm6000_endpoint		bulk_in, bulk_out, isoc_in, isoc_out;
248*4882a593Smuzhiyun 	struct tm6000_endpoint		int_in, int_out;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	/* scaler!=0 if scaler is active*/
251*4882a593Smuzhiyun 	int				scaler;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 		/* Isoc control struct */
254*4882a593Smuzhiyun 	struct usb_isoc_ctl          isoc_ctl;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	spinlock_t                   slock;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	/* urb dma buffers */
259*4882a593Smuzhiyun 	char				**urb_buffer;
260*4882a593Smuzhiyun 	dma_addr_t			*urb_dma;
261*4882a593Smuzhiyun 	unsigned int			urb_size;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	unsigned long quirks;
264*4882a593Smuzhiyun };
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun enum tm6000_ops_type {
267*4882a593Smuzhiyun 	TM6000_AUDIO = 0x10,
268*4882a593Smuzhiyun 	TM6000_DVB = 0x20,
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun struct tm6000_ops {
272*4882a593Smuzhiyun 	struct list_head	next;
273*4882a593Smuzhiyun 	char			*name;
274*4882a593Smuzhiyun 	enum tm6000_ops_type	type;
275*4882a593Smuzhiyun 	int (*init)(struct tm6000_core *);
276*4882a593Smuzhiyun 	int (*fini)(struct tm6000_core *);
277*4882a593Smuzhiyun 	int (*fillbuf)(struct tm6000_core *, char *buf, int size);
278*4882a593Smuzhiyun };
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun struct tm6000_fh {
281*4882a593Smuzhiyun 	struct v4l2_fh		     fh;
282*4882a593Smuzhiyun 	struct tm6000_core           *dev;
283*4882a593Smuzhiyun 	unsigned int                 radio;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 	/* video capture */
286*4882a593Smuzhiyun 	struct tm6000_fmt            *fmt;
287*4882a593Smuzhiyun 	unsigned int                 width, height;
288*4882a593Smuzhiyun 	struct videobuf_queue        vb_vidq;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	enum v4l2_buf_type           type;
291*4882a593Smuzhiyun };
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun #define TM6000_STD	(V4L2_STD_PAL|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|    \
294*4882a593Smuzhiyun 			V4L2_STD_PAL_M|V4L2_STD_PAL_60|V4L2_STD_NTSC_M| \
295*4882a593Smuzhiyun 			V4L2_STD_NTSC_M_JP|V4L2_STD_SECAM)
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun /* In tm6000-cards.c */
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun int tm6000_tuner_callback(void *ptr, int component, int command, int arg);
300*4882a593Smuzhiyun int tm6000_xc5000_callback(void *ptr, int component, int command, int arg);
301*4882a593Smuzhiyun int tm6000_cards_setup(struct tm6000_core *dev);
302*4882a593Smuzhiyun void tm6000_flash_led(struct tm6000_core *dev, u8 state);
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun /* In tm6000-core.c */
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun int tm6000_read_write_usb(struct tm6000_core *dev, u8 reqtype, u8 req,
307*4882a593Smuzhiyun 			   u16 value, u16 index, u8 *buf, u16 len);
308*4882a593Smuzhiyun int tm6000_get_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index);
309*4882a593Smuzhiyun int tm6000_get_reg16(struct tm6000_core *dev, u8 req, u16 value, u16 index);
310*4882a593Smuzhiyun int tm6000_get_reg32(struct tm6000_core *dev, u8 req, u16 value, u16 index);
311*4882a593Smuzhiyun int tm6000_set_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index);
312*4882a593Smuzhiyun int tm6000_set_reg_mask(struct tm6000_core *dev, u8 req, u16 value,
313*4882a593Smuzhiyun 						u16 index, u16 mask);
314*4882a593Smuzhiyun int tm6000_i2c_reset(struct tm6000_core *dev, u16 tsleep);
315*4882a593Smuzhiyun int tm6000_init(struct tm6000_core *dev);
316*4882a593Smuzhiyun int tm6000_reset(struct tm6000_core *dev);
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun int tm6000_init_analog_mode(struct tm6000_core *dev);
319*4882a593Smuzhiyun int tm6000_init_digital_mode(struct tm6000_core *dev);
320*4882a593Smuzhiyun int tm6000_set_audio_bitrate(struct tm6000_core *dev, int bitrate);
321*4882a593Smuzhiyun int tm6000_set_audio_rinput(struct tm6000_core *dev);
322*4882a593Smuzhiyun int tm6000_tvaudio_set_mute(struct tm6000_core *dev, u8 mute);
323*4882a593Smuzhiyun void tm6000_set_volume(struct tm6000_core *dev, int vol);
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun int tm6000_v4l2_register(struct tm6000_core *dev);
326*4882a593Smuzhiyun int tm6000_v4l2_unregister(struct tm6000_core *dev);
327*4882a593Smuzhiyun int tm6000_v4l2_exit(void);
328*4882a593Smuzhiyun void tm6000_set_fourcc_format(struct tm6000_core *dev);
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun void tm6000_remove_from_devlist(struct tm6000_core *dev);
331*4882a593Smuzhiyun void tm6000_add_into_devlist(struct tm6000_core *dev);
332*4882a593Smuzhiyun int tm6000_register_extension(struct tm6000_ops *ops);
333*4882a593Smuzhiyun void tm6000_unregister_extension(struct tm6000_ops *ops);
334*4882a593Smuzhiyun void tm6000_init_extension(struct tm6000_core *dev);
335*4882a593Smuzhiyun void tm6000_close_extension(struct tm6000_core *dev);
336*4882a593Smuzhiyun int tm6000_call_fillbuf(struct tm6000_core *dev, enum tm6000_ops_type type,
337*4882a593Smuzhiyun 			char *buf, int size);
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun /* In tm6000-stds.c */
341*4882a593Smuzhiyun void tm6000_get_std_res(struct tm6000_core *dev);
342*4882a593Smuzhiyun int tm6000_set_standard(struct tm6000_core *dev);
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun /* In tm6000-i2c.c */
345*4882a593Smuzhiyun int tm6000_i2c_register(struct tm6000_core *dev);
346*4882a593Smuzhiyun int tm6000_i2c_unregister(struct tm6000_core *dev);
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun /* In tm6000-queue.c */
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun int tm6000_v4l2_mmap(struct file *filp, struct vm_area_struct *vma);
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun int tm6000_vidioc_streamon(struct file *file, void *priv,
353*4882a593Smuzhiyun 			   enum v4l2_buf_type i);
354*4882a593Smuzhiyun int tm6000_vidioc_streamoff(struct file *file, void *priv,
355*4882a593Smuzhiyun 			    enum v4l2_buf_type i);
356*4882a593Smuzhiyun int tm6000_vidioc_reqbufs(struct file *file, void *priv,
357*4882a593Smuzhiyun 			  struct v4l2_requestbuffers *rb);
358*4882a593Smuzhiyun int tm6000_vidioc_querybuf(struct file *file, void *priv,
359*4882a593Smuzhiyun 			   struct v4l2_buffer *b);
360*4882a593Smuzhiyun int tm6000_vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b);
361*4882a593Smuzhiyun int tm6000_vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b);
362*4882a593Smuzhiyun ssize_t tm6000_v4l2_read(struct file *filp, char __user * buf, size_t count,
363*4882a593Smuzhiyun 			 loff_t *f_pos);
364*4882a593Smuzhiyun unsigned int tm6000_v4l2_poll(struct file *file,
365*4882a593Smuzhiyun 			      struct poll_table_struct *wait);
366*4882a593Smuzhiyun int tm6000_queue_init(struct tm6000_core *dev);
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun /* In tm6000-alsa.c */
369*4882a593Smuzhiyun /*int tm6000_audio_init(struct tm6000_core *dev, int idx);*/
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun /* In tm6000-input.c */
372*4882a593Smuzhiyun int tm6000_ir_init(struct tm6000_core *dev);
373*4882a593Smuzhiyun int tm6000_ir_fini(struct tm6000_core *dev);
374*4882a593Smuzhiyun void tm6000_ir_wait(struct tm6000_core *dev, u8 state);
375*4882a593Smuzhiyun int tm6000_ir_int_start(struct tm6000_core *dev);
376*4882a593Smuzhiyun void tm6000_ir_int_stop(struct tm6000_core *dev);
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun /* Debug stuff */
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun extern int tm6000_debug;
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun #define dprintk(dev, level, fmt, arg...) do {\
383*4882a593Smuzhiyun 	if (tm6000_debug & level) \
384*4882a593Smuzhiyun 		printk(KERN_INFO "(%lu) %s %s :"fmt, jiffies, \
385*4882a593Smuzhiyun 			 dev->name, __func__ , ##arg); } while (0)
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun #define V4L2_DEBUG_REG		0x0004
388*4882a593Smuzhiyun #define V4L2_DEBUG_I2C		0x0008
389*4882a593Smuzhiyun #define V4L2_DEBUG_QUEUE	0x0010
390*4882a593Smuzhiyun #define V4L2_DEBUG_ISOC		0x0020
391*4882a593Smuzhiyun #define V4L2_DEBUG_RES_LOCK	0x0040	/* Resource locking */
392*4882a593Smuzhiyun #define V4L2_DEBUG_OPEN		0x0080	/* video open/close debug */
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun #define tm6000_err(fmt, arg...) do {\
395*4882a593Smuzhiyun 	printk(KERN_ERR "tm6000 %s :"fmt, \
396*4882a593Smuzhiyun 		__func__ , ##arg); } while (0)
397