em28xx.h revision 89b329ef9d7cc16ed46fc991b21b2d45e7bf452c
1a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/*
20e7072ef6623c3dc58faf3f7310aba77b0a5845eMichael Krufky   em28xx.h - driver for Empia EM2800/EM2820/2840 USB video capture devices
3a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com>
54ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab		      Ludovico Cavedon <cavedon@sssup.it>
62e7c6dc3989136844eb63e05f9e4dc6608a763c6Mauro Carvalho Chehab		      Mauro Carvalho Chehab <mchehab@infradead.org>
7a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
8a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de>
9a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
10a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   This program is free software; you can redistribute it and/or modify
11a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   it under the terms of the GNU General Public License as published by
12a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   the Free Software Foundation; either version 2 of the License, or
13a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   (at your option) any later version.
14a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
15a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   This program is distributed in the hope that it will be useful,
16a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   but WITHOUT ANY WARRANTY; without even the implied warranty of
17a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   GNU General Public License for more details.
19a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
20a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   You should have received a copy of the GNU General Public License
21a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   along with this program; if not, write to the Free Software
22a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton */
24a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
253acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#ifndef _EM28XX_H
263acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define _EM28XX_H
27a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
28cb77d010221e66c63f4a71546fed73be9b12b9a3Mauro Carvalho Chehab#include <linux/videodev2.h>
29ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab#include <media/videobuf-vmalloc.h>
30ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
31a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#include <linux/i2c.h>
323593cab5d62c4c7abced1076710f9bc2d8847433Ingo Molnar#include <linux/mutex.h>
33d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab#include <media/ir-kbd-i2c.h>
343aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE)
353aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#include <media/videobuf-dvb.h>
363aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#endif
373ca9c09379e8f3be0744c47f72769457fa46e9f3Mauro Carvalho Chehab#include "tuner-xc2028.h"
383aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
393aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* Boards supported by driver */
403aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_UNKNOWN			0
413aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_UNKNOWN			1
423aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_TERRATEC_CINERGY_250	2
433aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PINNACLE_USB_2		3
443aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2      4
453aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_MSI_VOX_USB_2              5
463aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_TERRATEC_CINERGY_200       6
473aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_LEADTEK_WINFAST_USBII      7
483aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_KWORLD_USB2800             8
493aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PINNACLE_DVC_90		9
503aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900	10
513aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_TERRATEC_HYBRID_XS		11
523aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_KWORLD_PVRTV2800RF		12
533aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_TERRATEC_PRODIGY_XS	13
543aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PROLINK_PLAYTV_USB2	14
553aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_VGEAR_POCKETTV             15
563aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950	16
573aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
583aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* Limits minimum and default number of buffers */
593aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_MIN_BUF 4
603aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DEF_BUF 8
61a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
62596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* maximum number of em28xx boards */
633687e1e67e4920a202d53cc24678fb34fcda8fc5Mauro Carvalho Chehab#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */
64596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab
65a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* maximum number of frames that can be queued */
663acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_FRAMES 5
67a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of frames that get used for v4l2_read() */
683acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_READ_FRAMES 2
69a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
70a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of buffers for isoc transfers */
713acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_BUFS 5
72a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
73d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab/* number of packets for each buffer
74d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab   windows requests only 40 packets .. so we better do the same
75d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab   this is what I found out for all alternate numbers there!
76d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab */
773acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_PACKETS 40
78a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
79a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* default alternate; 0 means choose the best */
803acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_PINOUT 0
81a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
823acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_INTERLACED_DEFAULT 1
83a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
84a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/*
85a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define (use usbview if you want to get the other alternate number infos)
86a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define
87a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define alternate number 2
88a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define 			Endpoint Address: 82
89a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Direction: in
90a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Attribute: 1
91a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Type: Isoc
92a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Max Packet Size: 1448
93a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Interval: 125us
94a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
95a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton  alternate number 7
96a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
97a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Endpoint Address: 82
98a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Direction: in
99a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Attribute: 1
100a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Type: Isoc
101a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Max Packet Size: 3072
102a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Interval: 125us
103a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton*/
104a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
105a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* time to wait when stopping the isoc transfer */
1063acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_URB_TIMEOUT       msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
107a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
108596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* time in msecs to wait for i2c writes to finish */
109596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab#define EM2800_I2C_WRITE_TIMEOUT 20
110596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab
1113aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehabenum em28xx_mode {
1123aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	EM28XX_ANALOG_MODE,
1133aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	EM28XX_DIGITAL_MODE,
1143aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab};
1153aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
1163acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_stream_state {
117a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	STREAM_OFF,
118a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	STREAM_INTERRUPT,
119a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	STREAM_ON,
120a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
121a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
122579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonstruct em28xx;
123579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
124ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_usb_isoc_ctl {
125ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* max packet size of isoc transaction */
126ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				max_pkt_size;
127ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
128ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* number of allocated urbs */
129ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				num_bufs;
130ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
131ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* urb for isoc transfers */
132ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct urb			**urb;
133ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
134ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* transfer buffers for isoc transfer */
135ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	char				**transfer_buffer;
136ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
137ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Last buffer command and region */
138ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	u8				cmd;
139ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				pos, size, pktsize;
140ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
141ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Last field: ODD or EVEN? */
142ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				field;
143ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
144ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Stores incomplete commands */
145ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	u32				tmp_buf;
146ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				tmp_buf_len;
147ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
148ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Stores already requested buffers */
149ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct em28xx_buffer    	*buf;
150ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
151ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Stores the number of received fields */
152ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				nfields;
153579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
154579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton		/* isoc urb callback */
155579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton	int (*isoc_copy) (struct em28xx *dev, struct urb *urb);
156579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
157ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab};
158ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
159ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_fmt {
160ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	char  *name;
161ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	u32   fourcc;          /* v4l2 format id */
162ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab};
163ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
164ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab/* buffer for one video frame */
165ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_buffer {
166ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	/* common v4l buffer stuff -- must be first */
167ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct videobuf_buffer vb;
168ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
169a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct list_head frame;
170a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int top_field;
171ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int receiving;
172ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab};
173ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
174ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_dmaqueue {
175ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct list_head       active;
176ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct list_head       queued;
177ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
178ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	wait_queue_head_t          wq;
179ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
180ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	/* Counters to control buffer fill */
181ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int                        pos;
182a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
183a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
184a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* io methods */
1853acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_io_method {
186a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	IO_NONE,
187a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	IO_READ,
188a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	IO_MMAP,
189a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
190a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
191a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* inputs */
192a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
1933acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define MAX_EM28XX_INPUT 4
1943acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum enum28xx_itype {
1953acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE1 = 1,
1963acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE2,
1973acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE3,
1983acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE4,
1993acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_SVIDEO,
2003acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_TELEVISION,
2013acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_CABLE,
2023acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_DVB,
2033acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_DEBUG,
2043acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_RADIO,
205a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
206a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
207539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehabenum em28xx_amux {
208539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	EM28XX_AMUX_VIDEO,
209539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	EM28XX_AMUX_LINE_IN,
210539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	EM28XX_AMUX_AC97_VIDEO,
211539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	EM28XX_AMUX_AC97_LINE_IN,
212539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab};
213539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab
2143acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_input {
2153acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum enum28xx_itype type;
216a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int vmux;
217539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	enum em28xx_amux amux;
218a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
219a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
2203acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
221a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
2223acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_decoder {
2233acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_TVP5150,
2243acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_SAA7113,
2253acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_SAA7114
226a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
227a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
228102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehabstruct em28xx_reg_seq {
229102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab	int reg;
230ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab	unsigned char val;
231102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab	int sleep;
232ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab};
233ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab
2343acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_board {
235a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	char *name;
236a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int vchannels;
237a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tuner_type;
238a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
239a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* i2c flags */
240a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int tda9887_conf;
241a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
24274f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	unsigned int is_em2800:1;
243a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int has_msp34xx:1;
2445add9a6f3c90680f89b4694e81025d2aed9559afMauro Carvalho Chehab	unsigned int mts_firmware:1;
2453abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab	unsigned int has_12mhz_i2s:1;
246c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	unsigned int max_range_640_480:1;
2473aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	unsigned int has_dvb:1;
2483abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab
2493acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_decoder decoder;
250a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
2513acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	struct em28xx_input       input[MAX_EM28XX_INPUT];
2520be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab	struct em28xx_input	  radio;
253a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
254a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
2553acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_eeprom {
256a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u32 id;			/* 0x9567eb1a */
257a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 vendor_ID;
258a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 product_ID;
259a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
260a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 chip_conf;
261a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
262a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 board_conf;
263a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
264a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 string1, string2, string3;
265a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
266a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 string_idx_table;
267a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
268a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
269a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* device states */
2703acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_dev_state {
271a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	DEV_INITIALIZED = 0x01,
272a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	DEV_DISCONNECTED = 0x02,
273a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	DEV_MISCONFIGURED = 0x04,
274a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
275a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
276579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonenum em28xx_capture_mode {
277579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton	EM28XX_CAPTURE_OFF = 0,
278579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton	EM28XX_ANALOG_CAPTURE,
279579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton	EM28XX_DIGITAL_CAPTURE,
280579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton};
281579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
2826d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_BUFS 5
2836d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_NUM_AUDIO_PACKETS 64
2846d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */
2856d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_CAPTURE_STREAM_EN 1
2863aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
2873aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* em28xx extensions */
2886d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO   0x10
2893aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DVB     0x20
2906d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
2916d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_audio {
2926d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	char name[50];
2936d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	char *transfer_buffer[EM28XX_AUDIO_BUFS];
2946d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct urb *urb[EM28XX_AUDIO_BUFS];
2956d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct usb_device *udev;
2966d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	unsigned int capture_transfer_done;
2976d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct snd_pcm_substream   *capture_pcm_substream;
2986d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
2996d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	unsigned int hwptr_done_capture;
3006d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct snd_card            *sndcard;
3016d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
3026d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int users, shutdown;
3036d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	enum em28xx_stream_state capture_stream;
3046d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	spinlock_t slock;
3056d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab};
3066d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
30752284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx;
30852284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
30952284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx_fh {
31052284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	struct em28xx *dev;
31152284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	unsigned int  stream_on:1;	/* Locks streams */
31252284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	int           radio;
31352284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
31452284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	struct videobuf_queue        vb_vidq;
31552284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
31652284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	enum v4l2_buf_type           type;
31752284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab};
31852284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
319a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* main device struct */
3203acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx {
321a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* generic device properties */
322a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	char name[30];		/* name (including minor) of the device */
323a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int model;		/* index in the device_data struct */
324e5589befc472ca50882f37c4fb32333fc93a65b7Mauro Carvalho Chehab	int devno;		/* marks the number of this device */
32574f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	unsigned int is_em2800:1;
326a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int has_msp34xx:1;
327a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int has_tda9887:1;
328a225452ef80a7bd894fd2dfd01a4973d444152f4Mauro Carvalho Chehab	unsigned int stream_on:1;	/* Locks streams */
329d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab	unsigned int has_audio_class:1;
3303abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab	unsigned int has_12mhz_i2s:1;
331c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	unsigned int max_range_640_480:1;
3323aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	unsigned int has_dvb:1;
333a225452ef80a7bd894fd2dfd01a4973d444152f4Mauro Carvalho Chehab
33489b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab	/* Some older em28xx chips needs a waiting time after writing */
33589b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab	unsigned int wait_after_write;
33689b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab
337102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab	/* GPIO sequences for tuner callback */
338102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab	struct em28xx_reg_seq *analog_gpio, *digital_gpio;
339ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab
34074f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	int video_inputs;	/* number of video inputs */
34174f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	struct list_head	devlist;
34274f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab
3439bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab	u32 i2s_speed;		/* I2S speed for audio digital stream */
3449bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab
3453acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_decoder decoder;
346a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
347a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tuner_type;		/* type of the tuner */
348a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tuner_addr;		/* tuner address */
349a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tda9887_conf;
350a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* i2c i/o */
351a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct i2c_adapter i2c_adap;
352a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct i2c_client i2c_client;
353a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* video for linux */
354a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int users;		/* user count for exclusive use */
355a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct video_device *vdev;	/* video for linux device struct */
3567d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab	v4l2_std_id norm;	/* selected tv norm */
357a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int ctl_freq;		/* selected frequency */
358a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int ctl_input;	/* selected input */
359a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int ctl_ainput;	/* slected audio input */
360a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int mute;
361a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int volume;
362a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* frame properties */
363a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int width;		/* current frame width */
364a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int height;		/* current frame height */
365a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int hscale;		/* horizontal scale factor (see datasheet) */
366a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int vscale;		/* vertical scale factor (see datasheet) */
367a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int interlaced;		/* 1=interlace fileds, 0=just top fileds */
3689e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab	unsigned int video_bytesread;	/* Number of bytes read */
369a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
37003910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab	unsigned long hash;	/* eeprom hash - for boards with generic ID */
3716ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	unsigned long i2c_hash;	/* i2c devicelist hash -
3726ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf				   for boards with generic ID */
37303910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab
3746d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct em28xx_audio *adev;
3756d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
376a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* states */
3773acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_dev_state state;
3783acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_io_method io;
3799e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab
380d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab	struct work_struct         request_module_wk;
381d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab
382a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* locks */
3835a80415bcabf2b59e8c34db6e743c54582cfd3c2Sascha Sommer	struct mutex lock;
384d7aa80207babe694b316a48200b096cf0336ecb3Aidan Thornton	/* spinlock_t queue_lock; */
385a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct list_head inqueue, outqueue;
386a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	wait_queue_head_t open, wait_frame, wait_stream;
387a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct video_device *vbi_dev;
3880be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab	struct video_device *radio_dev;
389a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
390a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned char eedata[256];
391a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
392ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	/* Isoc control struct */
393ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct em28xx_dmaqueue vidq;
394ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct em28xx_usb_isoc_ctl isoc_ctl;
395ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	spinlock_t slock;
396ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
397a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* usb transfer */
398a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct usb_device *udev;	/* the usb device */
399a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int alt;		/* alternate */
400a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int max_pkt_size;	/* max packet size of isoc transaction */
4019d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab	int num_alt;		/* Number of alternative settings */
4029d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
4033acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	struct urb *urb[EM28XX_NUM_BUFS];	/* urb for isoc transfers */
4043acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	char *transfer_buffer[EM28XX_NUM_BUFS];	/* transfer buffers for isoc transfer */
405a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* helper funcs that call usb_control_msg */
4066ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_write_regs) (struct em28xx *dev, u16 reg,
407a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton					char *buf, int len);
4086ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_read_reg) (struct em28xx *dev, u16 reg);
4096ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg,
4106ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf					char *buf, int len);
4116ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg,
412a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton				      char *buf, int len);
4136ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg);
4143aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
4153aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	enum em28xx_mode mode;
4163aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
4173421b7787a2cf41ac5edce9b5766bddd1e1d9986Aidan Thornton	struct em28xx_dvb *dvb;
418a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
419a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4206d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_ops {
4216d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct list_head next;
4226d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	char *name;
4236d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int id;
4246d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int (*init)(struct em28xx *);
4256d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int (*fini)(struct em28xx *);
426a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab};
427a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab
4283acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-i2c.c */
429a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4303acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg);
431fad7b958e753e18ff443786360f7846da50a3085Sascha Sommervoid em28xx_do_i2c_scan(struct em28xx *dev);
4323acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_i2c_register(struct em28xx *dev);
4333acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_i2c_unregister(struct em28xx *dev);
434a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4353acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-core.c */
436a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4373acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabu32 em28xx_request_buffers(struct em28xx *dev, u32 count);
4383acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_queue_unusedframes(struct em28xx *dev);
4393acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_release_buffers(struct em28xx *dev);
440a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4413acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
442a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			    char *buf, int len);
4433acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
4443acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg(struct em28xx *dev, u16 reg);
4453acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
446a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			  int len);
4473acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
4483acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_audio_analog_set(struct em28xx *dev);
449539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab
4503acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_colorlevels_set_default(struct em28xx *dev);
4513acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_capture_start(struct em28xx *dev, int start);
4523acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_outfmt_set_yuv422(struct em28xx *dev);
4533acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_resolution_set(struct em28xx *dev);
4543acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_set_alternate(struct em28xx *dev);
455579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonint em28xx_init_isoc(struct em28xx *dev, int max_packets,
456579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton		     int num_bufs, int max_pkt_size,
457579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton		     int (*isoc_copy) (struct em28xx *dev, struct urb *urb),
458579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton		     int cap_type);
459579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonvoid em28xx_uninit_isoc(struct em28xx *dev);
4603acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab
4616d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab/* Provided by em28xx-video.c */
4626d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabint em28xx_register_extension(struct em28xx_ops *dev);
4636d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabvoid em28xx_unregister_extension(struct em28xx_ops *dev);
4646d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
4653acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-cards.c */
4666ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafextern int em2800_variant_detect(struct usb_device *udev, int model);
467a94e95b443811c127734ef10f3b7d2220532c1d2Markus Rechbergerextern void em28xx_pre_card_setup(struct em28xx *dev);
4683acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern void em28xx_card_setup(struct em28xx *dev);
4693acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct em28xx_board em28xx_boards[];
4703acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct usb_device_id em28xx_id_table[];
4713acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern const unsigned int em28xx_bcount;
472c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabvoid em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir);
473ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehabint em28xx_tuner_callback(void *ptr, int command, int arg);
4743ca9c09379e8f3be0744c47f72769457fa46e9f3Mauro Carvalho Chehabvoid em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl);
475c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab
476c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab/* Provided by em28xx-input.c */
477c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab/* TODO: Check if the standard get_key handlers on ir-common can be used */
478c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
479c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
480c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key,
481c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab				     u32 *ir_raw);
482a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4834362559d826b369df41fc74df4c5db6061962dceSascha Sommer/* em2800 registers */
4844362559d826b369df41fc74df4c5db6061962dceSascha Sommer#define EM2800_AUDIOSRC_REG 0x08
4854362559d826b369df41fc74df4c5db6061962dceSascha Sommer
4863acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* em28xx registers */
48774f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab#define I2C_CLK_REG	0x06
488596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab#define CHIPID_REG	0x0a
489a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define USBSUSP_REG	0x0c	/* */
490a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
491a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define AUDIOSRC_REG	0x0e
492a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define XCLK_REG	0x0f
493a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
494a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define VINMODE_REG	0x10
495a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define VINCTRL_REG	0x11
496a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define VINENABLE_REG	0x12	/* */
497a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
498a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define GAMMA_REG	0x14
499a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define RGAIN_REG	0x15
500a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define GGAIN_REG	0x16
501a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define BGAIN_REG	0x17
502a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define ROFFSET_REG	0x18
503a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define GOFFSET_REG	0x19
504a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define BOFFSET_REG	0x1a
505a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
506a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define OFLOW_REG	0x1b
507a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define HSTART_REG	0x1c
508a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define VSTART_REG	0x1d
509a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define CWIDTH_REG	0x1e
510a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define CHEIGHT_REG	0x1f
511a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
512a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define YGAIN_REG	0x20
513a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define YOFFSET_REG	0x21
514a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define UVGAIN_REG	0x22
515a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define UOFFSET_REG	0x23
516a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define VOFFSET_REG	0x24
517a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define SHARPNESS_REG	0x25
518a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
519a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define COMPR_REG	0x26
520a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define OUTFMT_REG	0x27
521a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
522a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define XMIN_REG	0x28
523a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define XMAX_REG	0x29
524a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define YMIN_REG	0x2a
525a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define YMAX_REG	0x2b
526a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
527a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define HSCALELOW_REG	0x30
528a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define HSCALEHIGH_REG	0x31
529a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define VSCALELOW_REG	0x32
530a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define VSCALEHIGH_REG	0x33
531a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
532a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define AC97LSB_REG	0x40
533a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define AC97MSB_REG	0x41
534a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define AC97ADDR_REG	0x42
535a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define AC97BUSY_REG	0x43
536a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
537a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* em202 registers */
538a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define MASTER_AC97	0x02
539539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab#define LINE_IN_AC97    0x10
540a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define VIDEO_AC97	0x14
541a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
542a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* register settings */
5434362559d826b369df41fc74df4c5db6061962dceSascha Sommer#define EM2800_AUDIO_SRC_TUNER  0x0d
5444362559d826b369df41fc74df4c5db6061962dceSascha Sommer#define EM2800_AUDIO_SRC_LINE   0x0c
5453acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_AUDIO_SRC_TUNER	0xc0
5463acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_AUDIO_SRC_LINE	0x80
547a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
548a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* printk macros */
549a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5503acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_err(fmt, arg...) do {\
551f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare	printk(KERN_ERR fmt , ##arg); } while (0)
552a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5533acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_errdev(fmt, arg...) do {\
5544ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab	printk(KERN_ERR "%s: "fmt,\
555f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare			dev->name , ##arg); } while (0)
556a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5573acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_info(fmt, arg...) do {\
5584ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab	printk(KERN_INFO "%s: "fmt,\
559f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare			dev->name , ##arg); } while (0)
5603acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_warn(fmt, arg...) do {\
5614ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab	printk(KERN_WARNING "%s: "fmt,\
562f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare			dev->name , ##arg); } while (0)
563a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5646ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_compression_disable(struct em28xx *dev)
565a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
566a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* side effect of disabling scaler and mixer */
5673acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_write_regs(dev, COMPR_REG, "\x00", 1);
568a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
569a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5706ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_get(struct em28xx *dev)
571a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
5723acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_read_reg(dev, YGAIN_REG) & 0x1f;
573a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
574a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5756ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_get(struct em28xx *dev)
576a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
5773acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_read_reg(dev, YOFFSET_REG);
578a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
579a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5806ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_get(struct em28xx *dev)
581a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
5823acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_read_reg(dev, UVGAIN_REG) & 0x1f;
583a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
584a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5856ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_get(struct em28xx *dev)
586a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
5873acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_read_reg(dev, UOFFSET_REG);
588a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
589a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5906ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_get(struct em28xx *dev)
591a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
5923acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_read_reg(dev, VOFFSET_REG);
593a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
594a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5956ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_get(struct em28xx *dev)
596a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
5973acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_read_reg(dev, GAMMA_REG) & 0x3f;
598a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
599a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6006ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_set(struct em28xx *dev, s32 val)
601a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
602a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
6033acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_write_regs(dev, YGAIN_REG, &tmp, 1);
604a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
605a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6066ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_set(struct em28xx *dev, s32 val)
607a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
608a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
6093acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_write_regs(dev, YOFFSET_REG, &tmp, 1);
610a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
611a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6126ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_set(struct em28xx *dev, s32 val)
613a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
614a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
6153acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_write_regs(dev, UVGAIN_REG, &tmp, 1);
616a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
617a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6186ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_set(struct em28xx *dev, s32 val)
619a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
620a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
6213acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_write_regs(dev, UOFFSET_REG, &tmp, 1);
622a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
623a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6246ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_set(struct em28xx *dev, s32 val)
625a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
626a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
6273acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_write_regs(dev, VOFFSET_REG, &tmp, 1);
628a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
629a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6306ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_set(struct em28xx *dev, s32 val)
631a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
632a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
6333acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	return em28xx_write_regs(dev, GAMMA_REG, &tmp, 1);
634a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
635a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
636a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/*FIXME: maxw should be dependent of alt mode */
6376ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxw(struct em28xx *dev)
63830556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger{
639c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	if (dev->max_range_640_480)
6407d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return 640;
641c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	else
6427d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return 720;
64330556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger}
64430556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger
6456ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxh(struct em28xx *dev)
646a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
647c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	if (dev->max_range_640_480)
6487d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return 480;
649c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	else
6507d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
651a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
652a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#endif
653