19701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/*
2d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  tm6000.h - driver for TM5600/TM6000/TM6010 USB video capture devices
3d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *
4d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  Copyright (C) 2006-2007 Mauro Carvalho Chehab <mchehab@infradead.org>
5d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *
6d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  Copyright (C) 2007 Michel Ludwig <michel.ludwig@gmail.com>
7d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *	- DVB-T support
8d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *
9d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  This program is free software; you can redistribute it and/or modify
10d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  it under the terms of the GNU General Public License as published by
11d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  the Free Software Foundation version 2
12d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *
13d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  This program is distributed in the hope that it will be useful,
14d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  GNU General Public License for more details.
17d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *
18d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  You should have received a copy of the GNU General Public License
19d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  along with this program; if not, write to the Free Software
20d0058645c682a04c261516e917414ed8e39b2296Ruslan Pisarev *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
219701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab */
229701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
239701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <linux/videodev2.h>
249701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <media/v4l2-common.h>
259701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <media/videobuf-vmalloc.h>
269701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include "tm6000-usb-isoc.h"
279701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <linux/i2c.h>
289701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <linux/mutex.h>
29427f7facb374b8651ff01b7700e690ef8ccae159Mauro Carvalho Chehab#include <media/v4l2-device.h>
303d1a51db7e908cd7b3440ecb4cbf00f15a8f33bfThierry Reding
313169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig#include <linux/dvb/frontend.h>
323169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig#include "dvb_demux.h"
333169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig#include "dvb_frontend.h"
343169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig#include "dmxdev.h"
353169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig
3649e5e03c9c499e89cc0f9c7736a418869e887d56Stefan Ringel#define TM6000_VERSION KERNEL_VERSION(0, 0, 2)
379701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
389701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* Inputs */
39c85cba3fe6d44b3955a4c2e19efb7bb8156cab5dMauro Carvalho Chehabenum tm6000_itype {
40fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_INPUT_TV	= 1,
41fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_INPUT_COMPOSITE1,
42fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_INPUT_COMPOSITE2,
43c85cba3fe6d44b3955a4c2e19efb7bb8156cab5dMauro Carvalho Chehab	TM6000_INPUT_SVIDEO,
44fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_INPUT_DVB,
45fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_INPUT_RADIO,
46fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel};
47fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel
48fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringelenum tm6000_mux {
49fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_VMUX_VIDEO_A = 1,
50fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_VMUX_VIDEO_B,
51fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_VMUX_VIDEO_AB,
52fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_AMUX_ADC1,
53fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_AMUX_ADC2,
54fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_AMUX_SIF1,
55fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_AMUX_SIF2,
56fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	TM6000_AMUX_I2S,
57c85cba3fe6d44b3955a4c2e19efb7bb8156cab5dMauro Carvalho Chehab};
58c85cba3fe6d44b3955a4c2e19efb7bb8156cab5dMauro Carvalho Chehab
5929c389be1ceb714739cdcd41fec6547d19b32864Mauro Carvalho Chehabenum tm6000_devtype {
6029c389be1ceb714739cdcd41fec6547d19b32864Mauro Carvalho Chehab	TM6000 = 0,
6129c389be1ceb714739cdcd41fec6547d19b32864Mauro Carvalho Chehab	TM5600,
6229c389be1ceb714739cdcd41fec6547d19b32864Mauro Carvalho Chehab	TM6010,
6329c389be1ceb714739cdcd41fec6547d19b32864Mauro Carvalho Chehab};
649701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
65fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringelstruct tm6000_input {
66fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	enum tm6000_itype	type;
67fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	enum tm6000_mux		vmux;
68fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	enum tm6000_mux		amux;
69fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	unsigned int		v_gpio;
70fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	unsigned int		a_gpio;
718aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov};
728aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov
739701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* ------------------------------------------------------------------
7440004e24c489cbeea9089a35530b553834391bf1Ruslan Pisarev *	Basic structures
7540004e24c489cbeea9089a35530b553834391bf1Ruslan Pisarev * ------------------------------------------------------------------
7640004e24c489cbeea9089a35530b553834391bf1Ruslan Pisarev */
779701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
789701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabstruct tm6000_fmt {
799701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	char  *name;
809701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	u32   fourcc;          /* v4l2 format id */
819701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int   depth;
829701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
839701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
849701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* buffer for one video frame */
859701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabstruct tm6000_buffer {
869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* common v4l buffer stuff -- must be first */
879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct videobuf_buffer vb;
889701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
899701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct tm6000_fmt      *fmt;
909701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
919701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
929701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabstruct tm6000_dmaqueue {
939701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct list_head       active;
949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct list_head       queued;
959701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
969701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* thread for generating video stream*/
979701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct task_struct         *kthread;
989701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	wait_queue_head_t          wq;
999701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Counters to control fps rate */
1009701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int                        frame;
1019701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int                        ini_jiffies;
1029701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
1039701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1049701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* device states */
1059701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabenum tm6000_core_state {
1069701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	DEV_INITIALIZED   = 0x01,
1079701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	DEV_DISCONNECTED  = 0x02,
1089701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	DEV_MISCONFIGURED = 0x04,
1099701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
1109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1119701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* io methods */
1129701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabenum tm6000_io_method {
1139701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	IO_NONE,
1149701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	IO_READ,
1159701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	IO_MMAP,
1169701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
1179701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1189701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabenum tm6000_mode {
11952e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimov	TM6000_MODE_UNKNOWN = 0,
1209701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	TM6000_MODE_ANALOG,
1219701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	TM6000_MODE_DIGITAL,
1229701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
1239701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
12432a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringelstruct tm6000_gpio {
12532a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel	int		tuner_reset;
12632a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel	int		tuner_on;
12732a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel	int		demod_reset;
12832a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel	int		demod_on;
12932a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel	int		power_led;
13032a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel	int		dvb_led;
13132a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel	int		ir;
132af9d9cfd54091e8916b8892aaf40812345aac6d3Mauro Carvalho Chehab};
13332a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel
1349701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabstruct tm6000_capabilities {
1359701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	unsigned int    has_tuner:1;
1369701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	unsigned int    has_tda9874:1;
1379701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	unsigned int    has_dvb:1;
1389701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	unsigned int    has_zl10353:1;
1399701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	unsigned int    has_eeprom:1;
1404386136d29327a6645f7dba963d609d2452db843Michel Ludwig	unsigned int    has_remote:1;
1411416910743e63e751a95de14c0477e41d54076b7Stefan Ringel	unsigned int    has_radio:1;
1429701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
1439701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1443169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwigstruct tm6000_dvb {
1453169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	struct dvb_adapter	adapter;
1463169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	struct dvb_demux	demux;
1473169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	struct dvb_frontend	*frontend;
1483169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	struct dmxdev		dmxdev;
1493169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	unsigned int		streams;
15052e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimov	struct urb		*bulk_urb;
1513169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	struct mutex		mutex;
1523169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig};
1533169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig
154d77057f250104120c149904e6d1c85a7bf718adaStefan Ringelstruct snd_tm6000_card {
155d77057f250104120c149904e6d1c85a7bf718adaStefan Ringel	struct snd_card			*card;
156d77057f250104120c149904e6d1c85a7bf718adaStefan Ringel	spinlock_t			reg_lock;
157d77057f250104120c149904e6d1c85a7bf718adaStefan Ringel	struct tm6000_core		*core;
158d77057f250104120c149904e6d1c85a7bf718adaStefan Ringel	struct snd_pcm_substream	*substream;
1593f23a81a101889711e878240908a2b81b94a268aMauro Carvalho Chehab
1603f23a81a101889711e878240908a2b81b94a268aMauro Carvalho Chehab	/* temporary data for buffer fill processing */
1613f23a81a101889711e878240908a2b81b94a268aMauro Carvalho Chehab	unsigned			buf_pos;
1623f23a81a101889711e878240908a2b81b94a268aMauro Carvalho Chehab	unsigned			period_pos;
163d77057f250104120c149904e6d1c85a7bf718adaStefan Ringel};
164d77057f250104120c149904e6d1c85a7bf718adaStefan Ringel
1656ae635c4f36d7a0b931feb4bb6dad6e5f18187cfMauro Carvalho Chehabstruct tm6000_endpoint {
1666ae635c4f36d7a0b931feb4bb6dad6e5f18187cfMauro Carvalho Chehab	struct usb_host_endpoint	*endp;
1676ae635c4f36d7a0b931feb4bb6dad6e5f18187cfMauro Carvalho Chehab	__u8				bInterfaceNumber;
1686ae635c4f36d7a0b931feb4bb6dad6e5f18187cfMauro Carvalho Chehab	__u8				bAlternateSetting;
1696ae635c4f36d7a0b931feb4bb6dad6e5f18187cfMauro Carvalho Chehab	unsigned			maxsize;
1706ae635c4f36d7a0b931feb4bb6dad6e5f18187cfMauro Carvalho Chehab};
1716ae635c4f36d7a0b931feb4bb6dad6e5f18187cfMauro Carvalho Chehab
17242845708363fc92a190f5c47e6fe750e3919f867Thierry Reding#define TM6000_QUIRK_NO_USB_DELAY (1 << 0)
17342845708363fc92a190f5c47e6fe750e3919f867Thierry Reding
1749701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabstruct tm6000_core {
1759701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* generic device properties */
1769701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	char				name[30];	/* name (including minor) of the device */
1779701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int				model;		/* index in the device_data struct */
1789701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int				devno;		/* marks the number of this device */
17929c389be1ceb714739cdcd41fec6547d19b32864Mauro Carvalho Chehab	enum tm6000_devtype		dev_type;	/* type of device */
180792bc09a9896dfbdac575ab4cdcd0f4db96d8ca1Mauro Carvalho Chehab	unsigned char			eedata[256];	/* Eeprom data */
181792bc09a9896dfbdac575ab4cdcd0f4db96d8ca1Mauro Carvalho Chehab	unsigned			eedata_size;	/* Size of the eeprom info */
1823169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig
1833169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	v4l2_std_id                     norm;           /* Current norm */
18452e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimov	int				width, height;	/* Selected resolution */
1859701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	enum tm6000_core_state		state;
1879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1889701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Device Capabilities*/
1899701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct tm6000_capabilities	caps;
1909701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1916740a932882f43056b8545e5b0b85511975d0a7cMauro Carvalho Chehab	/* Used to load alsa/dvb */
1926740a932882f43056b8545e5b0b85511975d0a7cMauro Carvalho Chehab        struct work_struct		request_module_wk;
1936740a932882f43056b8545e5b0b85511975d0a7cMauro Carvalho Chehab
1949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Tuner configuration */
19595a838243b906e096275b179d4e7302f282c990eMichel Ludwig	int				tuner_type;		/* type of the tuner */
19695a838243b906e096275b179d4e7302f282c990eMichel Ludwig	int				tuner_addr;		/* tuner address */
19732a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel
19832a2232bfd6a5eda4f4d6977ebf68ce9d2408e9bStefan Ringel	struct tm6000_gpio		gpio;
19995a838243b906e096275b179d4e7302f282c990eMichel Ludwig
200d064f960650d64e2564cd505a6e40c4ac359b6f3Stefan Ringel	char				*ir_codes;
201d064f960650d64e2564cd505a6e40c4ac359b6f3Stefan Ringel
2028aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov	__u8				radio;
2038aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov
20495a838243b906e096275b179d4e7302f282c990eMichel Ludwig	/* Demodulator configuration */
20595a838243b906e096275b179d4e7302f282c990eMichel Ludwig	int				demod_addr;	/* demodulator address */
2069701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
207c13dd70411e87e1ad1ccca0ba9bc3cf0a555e5a0Mauro Carvalho Chehab	int				audio_bitrate;
2089701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* i2c i/o */
2099701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct i2c_adapter		i2c_adap;
2109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct i2c_client		i2c_client;
2119701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2120439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel
2130439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel	/* extension */
2140439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel	struct list_head		devlist;
2150439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel
2169701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* video for linux */
2179701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int				users;
2189701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2199701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* various device info */
2209efd85dfff92d9b52675045362677064321332bfMauro Carvalho Chehab	struct tm6000_fh		*resources;	/* Points to fh that is streaming */
2219efd85dfff92d9b52675045362677064321332bfMauro Carvalho Chehab	bool				is_res_read;
2229efd85dfff92d9b52675045362677064321332bfMauro Carvalho Chehab
2237c3f53ec491b64b3c3fa339e4e77e49782b0be9fMichel Ludwig	struct video_device		*vfd;
2248aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov	struct video_device		*radio_dev;
2259701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct tm6000_dmaqueue		vidq;
226427f7facb374b8651ff01b7700e690ef8ccae159Mauro Carvalho Chehab	struct v4l2_device		v4l2_dev;
2279701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2289701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int				input;
229fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	struct tm6000_input		vinput[3];	/* video input */
230fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel	struct tm6000_input		rinput;		/* radio input */
231fb7ef9831a432a6ae82587d1477103c18f99be73Stefan Ringel
2329701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int				freq;
2339701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	unsigned int			fourcc;
2349701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2359701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	enum tm6000_mode		mode;
2369701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2378aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov	int				ctl_mute;             /* audio */
2388aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov	int				ctl_volume;
239886a3c0b58f4c3d11a8cf723b8f5ee167708ebf5Stefan Ringel	int				amode;
2408aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov
2413169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	/* DVB-T support */
2423169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	struct tm6000_dvb		*dvb;
2433169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig
244d77057f250104120c149904e6d1c85a7bf718adaStefan Ringel	/* audio support */
245d77057f250104120c149904e6d1c85a7bf718adaStefan Ringel	struct snd_tm6000_card		*adev;
24606f08e3a4d86e746f5e8e09030e6560e37386b7fMauro Carvalho Chehab	struct work_struct		wq_trigger;   /* Trigger to start/stop audio for alsa module */
24706f08e3a4d86e746f5e8e09030e6560e37386b7fMauro Carvalho Chehab	atomic_t			stream_started;  /* stream should be running if true */
248d77057f250104120c149904e6d1c85a7bf718adaStefan Ringel
249d064f960650d64e2564cd505a6e40c4ac359b6f3Stefan Ringel	struct tm6000_IR		*ir;
250d064f960650d64e2564cd505a6e40c4ac359b6f3Stefan Ringel
2519701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* locks */
2529701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct mutex			lock;
253fc4eab2cbae547fb278c2583b77ee0ff7f5832d3Thierry Reding	struct mutex			usb_lock;
2549701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2559701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* usb transfer */
2569701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct usb_device		*udev;		/* the usb device */
2579701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2586ae635c4f36d7a0b931feb4bb6dad6e5f18187cfMauro Carvalho Chehab	struct tm6000_endpoint		bulk_in, bulk_out, isoc_in, isoc_out;
259d064f960650d64e2564cd505a6e40c4ac359b6f3Stefan Ringel	struct tm6000_endpoint		int_in, int_out;
2609701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2619701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* scaler!=0 if scaler is active*/
2629701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int				scaler;
2639701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2649701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* Isoc control struct */
2659701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct usb_isoc_ctl          isoc_ctl;
2669701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2679701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	spinlock_t                   slock;
26842845708363fc92a190f5c47e6fe750e3919f867Thierry Reding
26942845708363fc92a190f5c47e6fe750e3919f867Thierry Reding	unsigned long quirks;
2709701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
2719701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
27239e1256bc4b85145b9db392e49a71cad43f6903bMauro Carvalho Chehabenum tm6000_ops_type {
27339e1256bc4b85145b9db392e49a71cad43f6903bMauro Carvalho Chehab	TM6000_AUDIO = 0x10,
27439e1256bc4b85145b9db392e49a71cad43f6903bMauro Carvalho Chehab	TM6000_DVB = 0x20,
27539e1256bc4b85145b9db392e49a71cad43f6903bMauro Carvalho Chehab};
2760439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel
2770439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringelstruct tm6000_ops {
2780439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel	struct list_head	next;
2790439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel	char			*name;
28039e1256bc4b85145b9db392e49a71cad43f6903bMauro Carvalho Chehab	enum tm6000_ops_type	type;
2810439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel	int (*init)(struct tm6000_core *);
2820439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel	int (*fini)(struct tm6000_core *);
283b17b86991a6a17560ddd97ed9a970fc38427217dMauro Carvalho Chehab	int (*fillbuf)(struct tm6000_core *, char *buf, int size);
2840439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel};
2850439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel
2869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabstruct tm6000_fh {
2879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct tm6000_core           *dev;
2888aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov	unsigned int                 radio;
2899701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2909701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* video capture */
2919701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct tm6000_fmt            *fmt;
29252e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimov	unsigned int                 width, height;
2939701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct videobuf_queue        vb_vidq;
2949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2959701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	enum v4l2_buf_type           type;
2969701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
2979701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
29840004e24c489cbeea9089a35530b553834391bf1Ruslan Pisarev#define TM6000_STD	(V4L2_STD_PAL|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|    \
2999701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			V4L2_STD_PAL_M|V4L2_STD_PAL_60|V4L2_STD_NTSC_M| \
30040004e24c489cbeea9089a35530b553834391bf1Ruslan Pisarev			V4L2_STD_NTSC_M_JP|V4L2_STD_SECAM)
3019701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
302e78c8f22b536e646032dd9b9f396305d0893e0cdStefan Ringel/* In tm6000-cards.c */
303e78c8f22b536e646032dd9b9f396305d0893e0cdStefan Ringel
30452e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_tuner_callback(void *ptr, int component, int command, int arg);
30552e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_xc5000_callback(void *ptr, int component, int command, int arg);
306e3ee9e5ec17767a24848035a1d759af8a03c971fMauro Carvalho Chehabint tm6000_cards_setup(struct tm6000_core *dev);
307641d21167f66ef4c574ef4f586fec0ae32179acdDmitri Belimovvoid tm6000_flash_led(struct tm6000_core *dev, u8 state);
308e3ee9e5ec17767a24848035a1d759af8a03c971fMauro Carvalho Chehab
3099701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* In tm6000-core.c */
3109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
31152e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_read_write_usb(struct tm6000_core *dev, u8 reqtype, u8 req,
3129701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			   u16 value, u16 index, u8 *buf, u16 len);
31352e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_get_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index);
314e3ee9e5ec17767a24848035a1d759af8a03c971fMauro Carvalho Chehabint tm6000_get_reg16(struct tm6000_core *dev, u8 req, u16 value, u16 index);
3152f7908848642c177b16b71a2ed52b57d614637efStefan Ringelint tm6000_get_reg32(struct tm6000_core *dev, u8 req, u16 value, u16 index);
31652e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_set_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index);
3178aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimovint tm6000_set_reg_mask(struct tm6000_core *dev, u8 req, u16 value,
3188aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimov						u16 index, u16 mask);
3192a15ac7ad625dc22885446016d730a451df1b7d4Dmitri Belimovint tm6000_i2c_reset(struct tm6000_core *dev, u16 tsleep);
32052e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_init(struct tm6000_core *dev);
321dd0c8abf2ac853dad9a360f5e9d3d1cb5e5f7621Thierry Redingint tm6000_reset(struct tm6000_core *dev);
3222a15ac7ad625dc22885446016d730a451df1b7d4Dmitri Belimov
32352e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_init_analog_mode(struct tm6000_core *dev);
32452e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_init_digital_mode(struct tm6000_core *dev);
32552e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_set_audio_bitrate(struct tm6000_core *dev, int bitrate);
3260f6040e8929731d4294f1cffdbcb9be1523d60f0Stefan Ringelint tm6000_set_audio_rinput(struct tm6000_core *dev);
3278aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimovint tm6000_tvaudio_set_mute(struct tm6000_core *dev, u8 mute);
3288aff8ba95155dff265de5ea6f5d5d92caa7bc728Dmitri Belimovvoid tm6000_set_volume(struct tm6000_core *dev, int vol);
3299701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3309701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_v4l2_register(struct tm6000_core *dev);
3319701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_v4l2_unregister(struct tm6000_core *dev);
3329701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_v4l2_exit(void);
3339701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabvoid tm6000_set_fourcc_format(struct tm6000_core *dev);
3349701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3350439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringelvoid tm6000_remove_from_devlist(struct tm6000_core *dev);
3360439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringelvoid tm6000_add_into_devlist(struct tm6000_core *dev);
3370439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringelint tm6000_register_extension(struct tm6000_ops *ops);
3380439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringelvoid tm6000_unregister_extension(struct tm6000_ops *ops);
3390439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringelvoid tm6000_init_extension(struct tm6000_core *dev);
3400439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringelvoid tm6000_close_extension(struct tm6000_core *dev);
341b17b86991a6a17560ddd97ed9a970fc38427217dMauro Carvalho Chehabint tm6000_call_fillbuf(struct tm6000_core *dev, enum tm6000_ops_type type,
342b17b86991a6a17560ddd97ed9a970fc38427217dMauro Carvalho Chehab			char *buf, int size);
343b17b86991a6a17560ddd97ed9a970fc38427217dMauro Carvalho Chehab
3440439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel
3455200401ad8a80b95b3ba5636580f10adc74b6b60Mauro Carvalho Chehab/* In tm6000-stds.c */
3465200401ad8a80b95b3ba5636580f10adc74b6b60Mauro Carvalho Chehabvoid tm6000_get_std_res(struct tm6000_core *dev);
3470f6040e8929731d4294f1cffdbcb9be1523d60f0Stefan Ringelint tm6000_set_standard(struct tm6000_core *dev);
3485200401ad8a80b95b3ba5636580f10adc74b6b60Mauro Carvalho Chehab
3499701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* In tm6000-i2c.c */
3509701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_i2c_register(struct tm6000_core *dev);
3519701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_i2c_unregister(struct tm6000_core *dev);
3529701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3539701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* In tm6000-queue.c */
3549701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3559701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_v4l2_mmap(struct file *filp, struct vm_area_struct *vma);
3569701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3579701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_vidioc_streamon(struct file *file, void *priv,
3589701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			   enum v4l2_buf_type i);
3599701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_vidioc_streamoff(struct file *file, void *priv,
3609701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			    enum v4l2_buf_type i);
36152e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_vidioc_reqbufs(struct file *file, void *priv,
36252e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimov			  struct v4l2_requestbuffers *rb);
36352e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_vidioc_querybuf(struct file *file, void *priv,
36452e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimov			   struct v4l2_buffer *b);
36552e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b);
36652e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimovint tm6000_vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b);
3679701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabssize_t tm6000_v4l2_read(struct file *filp, char __user * buf, size_t count,
36852e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimov			 loff_t *f_pos);
3699701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabunsigned int tm6000_v4l2_poll(struct file *file,
3709701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			      struct poll_table_struct *wait);
3719701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_queue_init(struct tm6000_core *dev);
3729701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
373576d5739a44af5fcbacfe504a8d989a5c7ea8fc7Mauro Carvalho Chehab/* In tm6000-alsa.c */
3740439db75c1fbb28a3b314ae354582e4f180daf52Stefan Ringel/*int tm6000_audio_init(struct tm6000_core *dev, int idx);*/
375576d5739a44af5fcbacfe504a8d989a5c7ea8fc7Mauro Carvalho Chehab
376d064f960650d64e2564cd505a6e40c4ac359b6f3Stefan Ringel/* In tm6000-input.c */
377d064f960650d64e2564cd505a6e40c4ac359b6f3Stefan Ringelint tm6000_ir_init(struct tm6000_core *dev);
378d064f960650d64e2564cd505a6e40c4ac359b6f3Stefan Ringelint tm6000_ir_fini(struct tm6000_core *dev);
379d064f960650d64e2564cd505a6e40c4ac359b6f3Stefan Ringelvoid tm6000_ir_wait(struct tm6000_core *dev, u8 state);
380641d21167f66ef4c574ef4f586fec0ae32179acdDmitri Belimovint tm6000_ir_int_start(struct tm6000_core *dev);
381641d21167f66ef4c574ef4f586fec0ae32179acdDmitri Belimovvoid tm6000_ir_int_stop(struct tm6000_core *dev);
382576d5739a44af5fcbacfe504a8d989a5c7ea8fc7Mauro Carvalho Chehab
3839701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* Debug stuff */
3849701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3859701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabextern int tm6000_debug;
3869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define dprintk(dev, level, fmt, arg...) do {\
3889701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (tm6000_debug & level) \
38952e0a72a0c6f61c26a16b5684f4eb30a6fbf8b83Timofey Trofimov		printk(KERN_INFO "(%lu) %s %s :"fmt, jiffies, \
39045dbf0db5ac974fb699fec39330d01642dff98dcMauro Carvalho Chehab			 dev->name, __func__ , ##arg); } while (0)
3919701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3929701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define V4L2_DEBUG_REG		0x0004
3939701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define V4L2_DEBUG_I2C		0x0008
3949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define V4L2_DEBUG_QUEUE	0x0010
3959701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define V4L2_DEBUG_ISOC		0x0020
3969701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define V4L2_DEBUG_RES_LOCK	0x0040	/* Resource locking */
3979701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define V4L2_DEBUG_OPEN		0x0080	/* video open/close debug */
3989701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3999701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define tm6000_err(fmt, arg...) do {\
4009701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	printk(KERN_ERR "tm6000 %s :"fmt, \
40145dbf0db5ac974fb699fec39330d01642dff98dcMauro Carvalho Chehab		__func__ , ##arg); } while (0)
402