em28xx.h revision 16c7bcadff2222b297d13951dc30e133f56d0154
1b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/*
2b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   em28xx.h - driver for Empia EM2800/EM2820/2840 USB video capture devices
3b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
4b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com>
5b481de9ca074528fe8c429604e2777db8b89806aZhu Yi		      Ludovico Cavedon <cavedon@sssup.it>
6b481de9ca074528fe8c429604e2777db8b89806aZhu Yi		      Mauro Carvalho Chehab <mchehab@infradead.org>
7b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
801f8162a854df7f9c259c839ad3c1168ac13b7b8Reinette Chatre   Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de>
9b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
10b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   This program is free software; you can redistribute it and/or modify
1101ebd063e11bdcf1ddc605d968ea89aef48e34e0Ian Schram   it under the terms of the GNU General Public License as published by
12b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   the Free Software Foundation; either version 2 of the License, or
13b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   (at your option) any later version.
14b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
15b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   This program is distributed in the hope that it will be useful,
16b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   but WITHOUT ANY WARRANTY; without even the implied warranty of
17b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   GNU General Public License for more details.
19b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
20b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   You should have received a copy of the GNU General Public License
21b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   along with this program; if not, write to the Free Software
22b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23b481de9ca074528fe8c429604e2777db8b89806aZhu Yi */
24b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
25b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#ifndef _EM28XX_H
26b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define _EM28XX_H
27b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
28759ef89fb096c4a6ef078d3cfd5682ac037bd789Winkler, Tomas#include <linux/videodev2.h>
29b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include <media/videobuf-vmalloc.h>
30b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
31b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include <linux/i2c.h>
32b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include <linux/mutex.h>
3301f8162a854df7f9c259c839ad3c1168ac13b7b8Reinette Chatre#include <media/ir-kbd-i2c.h>
34b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE)
35b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include <media/videobuf-dvb.h>
36b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#endif
37b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include "tuner-xc2028.h"
38b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include "em28xx-reg.h"
39b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
40b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Boards supported by driver */
41b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_UNKNOWN			0
42b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_UNKNOWN			1
43b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_TERRATEC_CINERGY_250	2
44b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_PINNACLE_USB_2		3
45b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2      4
46b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_MSI_VOX_USB_2              5
47b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_TERRATEC_CINERGY_200       6
48b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_LEADTEK_WINFAST_USBII      7
49b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_KWORLD_USB2800             8
50b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_PINNACLE_DVC_90		9
51b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900	10
52b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_TERRATEC_HYBRID_XS		11
53b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_KWORLD_PVRTV2800RF		12
54b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_TERRATEC_PRODIGY_XS	13
55b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_PROLINK_PLAYTV_USB2	14
56b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_VGEAR_POCKETTV             15
57b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950	16
58b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO	17
59b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2	18
60b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA  19
61b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600   20
62b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_GRABBEEX_USB2800           21
63fcd427bbba10fc315d1c958b85bba74448db4eb4Ben M Cahill#define EM2750_BOARD_UNKNOWN			  22
645a36ba0e412a0e12a8bf2648a075226c1dd7870dTomas Winkler#define EM2750_BOARD_DLCW_130			  23
65fcd427bbba10fc315d1c958b85bba74448db4eb4Ben M Cahill#define EM2820_BOARD_DLINK_USB_TV		  24
663e0d4cb12f6fd97193a455b49125398b2231c87cTomas Winkler#define EM2820_BOARD_GADMEI_UTV310		  25
67fcd427bbba10fc315d1c958b85bba74448db4eb4Ben M Cahill#define EM2820_BOARD_HERCULES_SMART_TV_USB2	  26
68b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME	  27
696a63578ddf6148927a80c07a73b40ccc8f3ac8e2Emmanuel Grumbach#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28
706a63578ddf6148927a80c07a73b40ccc8f3ac8e2Emmanuel Grumbach#define EM2820_BOARD_PINNACLE_DVC_100		  29
71b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_VIDEOLOGY_20K14XUSB	  30
72a3139c5956702c9ff957ac9fe2d902de355b063eSamuel Ortiz#define EM2821_BOARD_USBGEAR_VD204		  31
73a3139c5956702c9ff957ac9fe2d902de355b063eSamuel Ortiz#define EM2821_BOARD_SUPERCOMP_USB_2		  32
74c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2821_BOARD_PROLINK_PLAYTV_USB2	  33
75c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2860_BOARD_TERRATEC_HYBRID_XS		  34
76c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2860_BOARD_TYPHOON_DVD_MAKER		  35
77c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2860_BOARD_NETGMBH_CAM		  36
78c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2860_BOARD_GADMEI_UTV330		  37
79c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2861_BOARD_YAKUMO_MOVIE_MIXER		  38
804c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2861_BOARD_KWORLD_PVRTV_300U		  39
814c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2861_BOARD_PLEXTOR_PX_TV100U		  40
824c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2870_BOARD_KWORLD_350U		  41
834c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2870_BOARD_KWORLD_355U		  42
844c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2870_BOARD_TERRATEC_XS		  43
854c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2870_BOARD_TERRATEC_XS_MT2060		  44
86b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2870_BOARD_PINNACLE_PCTV_DVB		  45
87b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2870_BOARD_COMPRO_VIDEOMATE		  46
88b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_KWORLD_DVB_305U		  47
89b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_KWORLD_DVB_310U		  48
90b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_MSI_DIGIVOX_AD		  49
91b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_MSI_DIGIVOX_AD_II		  50
92b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR	  51
93b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2881_BOARD_DNT_DA2_HYBRID		  52
94b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2881_BOARD_PINNACLE_HYBRID_PRO	  53
95b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2882_BOARD_KWORLD_VS_DVBT		  54
96b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2882_BOARD_TERRATEC_HYBRID_XS		  55
97b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2882_BOARD_PINNACLE_HYBRID_PRO	  56
98b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2883_BOARD_KWORLD_HYBRID_A316		  57
99b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU	  58
100b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2874_BOARD_PINNACLE_PCTV_80E		  59
1010a0bed1d10105a9f58cd14ebe216e8479dd31fdaEmmanuel Grumbach
1020a0bed1d10105a9f58cd14ebe216e8479dd31fdaEmmanuel Grumbach/* Limits minimum and default number of buffers */
1030a0bed1d10105a9f58cd14ebe216e8479dd31fdaEmmanuel Grumbach#define EM28XX_MIN_BUF 4
104b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_DEF_BUF 8
1052aa6ab86bc475a115f56645591d2413981846509Tomas Winkler
106b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/*Limits the max URB message size */
107b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define URB_MAX_CTRL_SIZE 80
108b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
109b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Params for validated field */
110b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_BOARD_NOT_VALIDATED 1
1119636e583d2c641f8cb32d0681f5052b2885edd79Ron Rindjunsky#define EM28XX_BOARD_VALIDATED	   0
112d23000cd8992823e06ca0745564f2c25fe923ce4Wey-Yi Guy
1139636e583d2c641f8cb32d0681f5052b2885edd79Ron Rindjunsky/* maximum number of em28xx boards */
1149636e583d2c641f8cb32d0681f5052b2885edd79Ron Rindjunsky#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */
1159636e583d2c641f8cb32d0681f5052b2885edd79Ron Rindjunsky
116be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler/* maximum number of frames that can be queued */
1171a5c3d61993f56daf15c35bea8d3943f4e835638Jay Sternberg#define EM28XX_NUM_FRAMES 5
118be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler/* number of frames that get used for v4l2_read() */
119be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler#define EM28XX_NUM_READ_FRAMES 2
120be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler
121be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler/* number of buffers for isoc transfers */
122b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_NUM_BUFS 5
123b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
124b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* number of packets for each buffer
125b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   windows requests only 40 packets .. so we better do the same
126b481de9ca074528fe8c429604e2777db8b89806aZhu Yi   this is what I found out for all alternate numbers there!
127b481de9ca074528fe8c429604e2777db8b89806aZhu Yi */
128b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_NUM_PACKETS 40
129b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
130b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* default alternate; 0 means choose the best */
131b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_PINOUT 0
132b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
133b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_INTERLACED_DEFAULT 1
134b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
135b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/*
136b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define (use usbview if you want to get the other alternate number infos)
137b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define
138b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define alternate number 2
139b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define 			Endpoint Address: 82
140b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			Direction: in
141b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			Attribute: 1
142b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			Type: Isoc
143b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			Max Packet Size: 1448
144b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			Interval: 125us
145b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
146b481de9ca074528fe8c429604e2777db8b89806aZhu Yi  alternate number 7
147b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
14876a2407a5b043d0950d5657184118e89860d545cJay Sternberg			Endpoint Address: 82
149b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			Direction: in
150b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			Attribute: 1
15176a2407a5b043d0950d5657184118e89860d545cJay Sternberg			Type: Isoc
1522f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy			Max Packet Size: 3072
153b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			Interval: 125us
154b481de9ca074528fe8c429604e2777db8b89806aZhu Yi*/
155a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler
156b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* time to wait when stopping the isoc transfer */
157b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_URB_TIMEOUT       msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
15880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
159b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* time in msecs to wait for i2c writes to finish */
160b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_I2C_WRITE_TIMEOUT 20
161b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
162b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum em28xx_mode {
163b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	EM28XX_MODE_UNDEFINED,
164b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	EM28XX_ANALOG_MODE,
165b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	EM28XX_DIGITAL_MODE,
166b481de9ca074528fe8c429604e2777db8b89806aZhu Yi};
167b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
168b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum em28xx_stream_state {
169b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	STREAM_OFF,
170b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	STREAM_INTERRUPT,
171b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	STREAM_ON,
172b481de9ca074528fe8c429604e2777db8b89806aZhu Yi};
173b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
174857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winklerstruct em28xx;
175b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
176b481de9ca074528fe8c429604e2777db8b89806aZhu Yistruct em28xx_usb_isoc_ctl {
177b481de9ca074528fe8c429604e2777db8b89806aZhu Yi		/* max packet size of isoc transaction */
178b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	int				max_pkt_size;
179b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
180b481de9ca074528fe8c429604e2777db8b89806aZhu Yi		/* number of allocated urbs */
181abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	int				num_bufs;
18280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
183b481de9ca074528fe8c429604e2777db8b89806aZhu Yi		/* urb for isoc transfers */
184b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct urb			**urb;
185b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
186857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winkler		/* transfer buffers for isoc transfer */
187b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	char				**transfer_buffer;
188b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
1899734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler		/* Last buffer command and region */
1909734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler	u8				cmd;
1919734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler	int				pos, size, pktsize;
1929734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler
19351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison		/* Last field: ODD or EVEN? */
19451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	int				field;
1959734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler
196075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill		/* Stores incomplete commands */
197857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winkler	u32				tmp_buf;
198075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int				tmp_buf_len;
199075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
200075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill		/* Stores already requested buffers */
201075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	struct em28xx_buffer    	*buf;
202857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winkler
203075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill		/* Stores the number of received fields */
2049734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler	int				nfields;
205075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
206a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler		/* isoc urb callback */
207075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int (*isoc_copy) (struct em28xx *dev, struct urb *urb);
208075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
209075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill};
210075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
211b481de9ca074528fe8c429604e2777db8b89806aZhu Yistruct em28xx_fmt {
212075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	char  *name;
213075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	u32   fourcc;          /* v4l2 format id */
214075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill};
215075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
216075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill/* buffer for one video frame */
217b481de9ca074528fe8c429604e2777db8b89806aZhu Yistruct em28xx_buffer {
218075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* common v4l buffer stuff -- must be first */
219075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	struct videobuf_buffer vb;
2209734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler
2219734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler	struct list_head frame;
2229734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler	int top_field;
2239734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler	int receiving;
2249734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler};
2259734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler
226b481de9ca074528fe8c429604e2777db8b89806aZhu Yistruct em28xx_dmaqueue {
227b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct list_head       active;
228b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct list_head       queued;
229075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
230b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	wait_queue_head_t          wq;
231b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
232b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	/* Counters to control buffer fill */
2333d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	int                        pos;
2343d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler};
2353d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler
2363d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler/* io methods */
2373d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winklerenum em28xx_io_method {
2383d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	IO_NONE,
2393d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	IO_READ,
2403d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	IO_MMAP,
2413d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler};
2423d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler
2433d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler/* inputs */
2443d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler
2453d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler#define MAX_EM28XX_INPUT 4
2463d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winklerenum enum28xx_itype {
2473d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_VMUX_COMPOSITE1 = 1,
2483d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_VMUX_COMPOSITE2,
2493d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_VMUX_COMPOSITE3,
2503d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_VMUX_COMPOSITE4,
2513d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_VMUX_SVIDEO,
2523d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_VMUX_TELEVISION,
2533d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_VMUX_CABLE,
2543d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_VMUX_DVB,
2553d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_VMUX_DEBUG,
2563d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_RADIO,
2573d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler};
2583d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler
2593d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winklerenum em28xx_ac97_mode {
2603d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_NO_AC97 = 0,
2613d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_AC97_EM202,
2623d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	EM28XX_AC97_OTHER,
2633d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler};
264abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
2655c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel Cstruct em28xx_audio_mode {
266abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	enum em28xx_ac97_mode ac97;
2675c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C
268857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winkler	u16 ac97_feat;
2695c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C	u32 ac97_vendor_id;
270abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
271abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int has_audio:1;
272abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
273abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int i2s_3rates:1;
274abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int i2s_5rates:1;
275abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill};
276abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
277abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillenum em28xx_amux {
278abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	EM28XX_AMUX_VIDEO,
279abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	EM28XX_AMUX_LINE_IN,
280abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill};
281abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
282abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillstruct em28xx_input {
2835c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C	enum enum28xx_itype type;
284abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int vmux;
2855c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C	enum em28xx_amux amux;
286abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill};
2877aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy
288abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill#define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
289abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
290abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillenum em28xx_decoder {
291abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	EM28XX_NODECODER,
292abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	EM28XX_TVP5150,
293abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	EM28XX_SAA7113,
294abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	EM28XX_SAA7114
295abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill};
296abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
297abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillstruct em28xx_reg_seq {
298abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	int reg;
299abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned char val, mask;
3001061787967db03975dc02030d6815811f4eb9231Daniel Wu	int sleep;
301abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill};
302abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
303abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillstruct em28xx_board {
304abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	char *name;
305abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	int vchannels;
3065c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C	int tuner_type;
3075c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C	int tuner_addr;
308abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
309abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	/* i2c flags */
310abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int tda9887_conf;
311075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
312abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int is_em2800:1;
313abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int has_msp34xx:1;
314abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int mts_firmware:1;
315abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int has_12mhz_i2s:1;
316075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	unsigned int max_range_640_480:1;
317abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int has_dvb:1;
318abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int has_snapshot_button:1;
319abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	unsigned int valid:1;
320075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
321abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	enum em28xx_decoder decoder;
322abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
323abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	struct em28xx_input       input[MAX_EM28XX_INPUT];
3247aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy	struct em28xx_input	  radio;
3257aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy	IR_KEYTAB_TYPE            *ir_codes;
3267aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy};
327abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
3287aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guystruct em28xx_eeprom {
329abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	u32 id;			/* 0x9567eb1a */
330abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	u16 vendor_ID;
331abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	u16 product_ID;
332075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
333abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	u16 chip_conf;
334abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
335abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	u16 board_conf;
336abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill
33776eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler	u16 string1, string2, string3;
33876eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler
33976eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler	u8 string_idx_table;
34076eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler};
34176eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler
34276eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler/* device states */
34376eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winklerenum em28xx_dev_state {
344abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill	DEV_INITIALIZED = 0x01,
345600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler	DEV_DISCONNECTED = 0x02,
346600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler	DEV_MISCONFIGURED = 0x04,
347600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler};
348600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler
349600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler#define EM28XX_AUDIO_BUFS 5
350600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler#define EM28XX_NUM_AUDIO_PACKETS 64
35176eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */
35280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill#define EM28XX_CAPTURE_STREAM_EN 1
35380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
35480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill/* em28xx extensions */
35580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill#define EM28XX_AUDIO   0x10
35680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill#define EM28XX_DVB     0x20
357e57f14895bf6bc7f16df760963427ac6ee6ff7e1Wey-Yi Guy
358e57f14895bf6bc7f16df760963427ac6ee6ff7e1Wey-Yi Guystruct em28xx_audio {
359e57f14895bf6bc7f16df760963427ac6ee6ff7e1Wey-Yi Guy	char name[50];
36080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	char *transfer_buffer[EM28XX_AUDIO_BUFS];
36180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	struct urb *urb[EM28XX_AUDIO_BUFS];
36280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	struct usb_device *udev;
36380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int capture_transfer_done;
36480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	struct snd_pcm_substream   *capture_pcm_substream;
36580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
36680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int hwptr_done_capture;
36780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	struct snd_card            *sndcard;
36880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
36980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	int users, shutdown;
37080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	enum em28xx_stream_state capture_stream;
37180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	spinlock_t slock;
37280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill};
37380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
37480cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstruct em28xx;
37580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
37680cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstruct em28xx_fh {
37780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	struct em28xx *dev;
37880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int  stream_on:1;	/* Locks streams */
37980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	int           radio;
38080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
38180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	struct videobuf_queue        vb_vidq;
38280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
38380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	enum v4l2_buf_type           type;
38480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill};
38580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
38680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill/* main device struct */
38780cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstruct em28xx {
38880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	/* generic device properties */
38980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	char name[30];		/* name (including minor) of the device */
39080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	int model;		/* index in the device_data struct */
39180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	int devno;		/* marks the number of this device */
39280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	enum em28xx_chip_id chip_id;
39380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int is_em2800:1;
39480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int has_msp34xx:1;
39580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int has_tda9887:1;
39680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int stream_on:1;	/* Locks streams */
39780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int has_audio_class:1;
39880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int has_alsa_audio:1;
39980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int has_12mhz_i2s:1;
40080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int max_range_640_480:1;
40180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int has_dvb:1;
40280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int has_snapshot_button:1;
40380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	unsigned int valid:1;		/* report for validated boards */
404630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler
405a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler	struct em28xx_IR *ir;
406630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler
407630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler	/* Some older em28xx chips needs a waiting time after writing */
408630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler	unsigned int wait_after_write;
409853554accce19d16b03476676bdcb1ccdd44caaeGregory Greenman
410853554accce19d16b03476676bdcb1ccdd44caaeGregory Greenman	/* GPIO sequences for analog and digital mode */
411630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler	struct em28xx_reg_seq *analog_gpio, *digital_gpio;
412630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler
413630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler	/* GPIO sequences for tuner callbacks */
414630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler	struct em28xx_reg_seq *tun_analog_gpio, *tun_digital_gpio;
415630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler
416630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler	int video_inputs;	/* number of video inputs */
41780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	struct list_head	devlist;
4182f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy
4192f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy	u32 i2s_speed;		/* I2S speed for audio digital stream */
4202f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy
4212f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy	enum em28xx_decoder decoder;
4222f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy	struct em28xx_audio_mode audio_mode;
4232f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy
4242f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy	int tuner_type;		/* type of the tuner */
4252f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy	int tuner_addr;		/* tuner address */
4262f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy	int tda9887_conf;
4272f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy	/* i2c i/o */
428b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct i2c_adapter i2c_adap;
429b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct i2c_client i2c_client;
430b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	/* video for linux */
431b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	int users;		/* user count for exclusive use */
432b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct video_device *vdev;	/* video for linux device struct */
433b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	v4l2_std_id norm;	/* selected tv norm */
43451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	int ctl_freq;		/* selected frequency */
435b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	unsigned int ctl_input;	/* selected input */
436b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	unsigned int ctl_ainput;/* selected audio input */
437b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	int mute;
438075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int volume;
439075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* frame properties */
440075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int width;		/* current frame width */
441075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int height;		/* current frame height */
442075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	unsigned hscale;	/* horizontal scale factor (see datasheet) */
443075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	unsigned vscale;	/* vertical scale factor (see datasheet) */
444075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int interlaced;		/* 1=interlace fileds, 0=just top fileds */
445075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	unsigned int video_bytesread;	/* Number of bytes read */
446075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
447075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	unsigned long hash;	/* eeprom hash - for boards with generic ID */
448075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	unsigned long i2c_hash;	/* i2c devicelist hash -
449075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill				   for boards with generic ID */
450075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
451a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler	struct em28xx_audio *adev;
452075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
453075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* states */
454075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	enum em28xx_dev_state state;
455075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	enum em28xx_io_method io;
456075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
457075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	struct work_struct         request_module_wk;
458075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
459075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* locks */
460b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct mutex lock;
461885ba202cabd90b8ade1fe59185dc96ed4d69e02Tomas Winkler	struct mutex ctrl_urb_lock;	/* protects urb_buf */
462b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	/* spinlock_t queue_lock; */
463b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct list_head inqueue, outqueue;
464b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	wait_queue_head_t open, wait_frame, wait_stream;
465b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct video_device *vbi_dev;
466b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct video_device *radio_dev;
467075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
468b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	unsigned char eedata[256];
469b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
470b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	/* Isoc control struct */
471b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct em28xx_dmaqueue vidq;
472b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	struct em28xx_usb_isoc_ctl isoc_ctl;
473075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	spinlock_t slock;
474075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
475075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* usb transfer */
4767aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy	struct usb_device *udev;	/* the usb device */
477075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int alt;		/* alternate */
478075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int max_pkt_size;	/* max packet size of isoc transaction */
479075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int num_alt;		/* Number of alternative settings */
480075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
481075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	struct urb *urb[EM28XX_NUM_BUFS];	/* urb for isoc transfers */
482b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	char *transfer_buffer[EM28XX_NUM_BUFS];	/* transfer buffers for isoc transfer */
483b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	char urb_buf[URB_MAX_CTRL_SIZE];	/* urb control msg buffer */
484075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
485075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* helper funcs that call usb_control_msg */
486075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int (*em28xx_write_regs) (struct em28xx *dev, u16 reg,
487075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill					char *buf, int len);
488075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int (*em28xx_read_reg) (struct em28xx *dev, u16 reg);
489075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg,
490075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill					char *buf, int len);
491075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg,
492075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill				      char *buf, int len);
493075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg);
494075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
495075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	enum em28xx_mode mode;
496075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
497075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* register numbers for GPO/GPIO registers */
498075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	u16 reg_gpo_num, reg_gpio_num;
499075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
500075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* Caches GPO and GPIO registers */
501075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	unsigned char	reg_gpo, reg_gpio;
502075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
503075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* Infrared remote control support */
504075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	IR_KEYTAB_TYPE *ir_codes;
505075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
506075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	/* Snapshot button */
507075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	char snapshot_button_path[30];	/* path of the input dev */
508075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	struct input_dev *sbutton_input_dev;
509075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	struct delayed_work sbutton_query_work;
510075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
511075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	struct em28xx_dvb *dvb;
512075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill};
513075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
514075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillstruct em28xx_ops {
515075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	struct list_head next;
516075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	char *name;
517075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int id;
518075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int (*init)(struct em28xx *);
519075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill	int (*fini)(struct em28xx *);
520075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill};
521075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
522075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill/* Provided by em28xx-i2c.c */
523075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
524075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillvoid em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg);
525075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillvoid em28xx_do_i2c_scan(struct em28xx *dev);
526075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_i2c_register(struct em28xx *dev);
527075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_i2c_unregister(struct em28xx *dev);
528075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
529075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill/* Provided by em28xx-core.c */
530075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
531075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillu32 em28xx_request_buffers(struct em28xx *dev, u32 count);
532075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillvoid em28xx_queue_unusedframes(struct em28xx *dev);
533075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillvoid em28xx_release_buffers(struct em28xx *dev);
534075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill
535075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
536075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill			    char *buf, int len);
537885ba202cabd90b8ade1fe59185dc96ed4d69e02Tomas Winklerint em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
538b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_read_reg(struct em28xx *dev, u16 reg);
539b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
540b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			  int len);
541b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
542b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_audio_analog_set(struct em28xx *dev);
543075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_audio_setup(struct em28xx *dev);
544b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
545075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_colorlevels_set_default(struct em28xx *dev);
546075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_capture_start(struct em28xx *dev, int start);
547b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_outfmt_set_yuv422(struct em28xx *dev);
548b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_resolution_set(struct em28xx *dev);
549b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_set_alternate(struct em28xx *dev);
550b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_init_isoc(struct em28xx *dev, int max_packets,
551b481de9ca074528fe8c429604e2777db8b89806aZhu Yi		     int num_bufs, int max_pkt_size,
552b481de9ca074528fe8c429604e2777db8b89806aZhu Yi		     int (*isoc_copy) (struct em28xx *dev, struct urb *urb));
553b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_uninit_isoc(struct em28xx *dev);
554885ba202cabd90b8ade1fe59185dc96ed4d69e02Tomas Winklerint em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
555b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
556b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
557b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Provided by em28xx-video.c */
558b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_register_extension(struct em28xx_ops *dev);
559b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_unregister_extension(struct em28xx_ops *dev);
5603195c1f3499912b207ae600968488759b16037fcTomas Winkler
561b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Provided by em28xx-cards.c */
562b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern int em2800_variant_detect(struct usb_device *udev, int model);
563b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern void em28xx_pre_card_setup(struct em28xx *dev);
564b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern void em28xx_card_setup(struct em28xx *dev);
565b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern struct em28xx_board em28xx_boards[];
566b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern struct usb_device_id em28xx_id_table[];
567b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern const unsigned int em28xx_bcount;
568b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir);
569b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_tuner_callback(void *ptr, int component, int command, int arg);
570b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
571b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Provided by em28xx-input.c */
572b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
573b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
574b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key,
575b481de9ca074528fe8c429604e2777db8b89806aZhu Yi				     u32 *ir_raw);
576b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_register_snapshot_button(struct em28xx *dev);
577b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_deregister_snapshot_button(struct em28xx *dev);
578b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
579b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_ir_init(struct em28xx *dev);
58014519a0b46085db68e610147098d03386c34801fBen M Cahillint em28xx_ir_fini(struct em28xx *dev);
58151e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison
5827b841727d2715d97592f46164804b34d6241644fRick Farrington/* printk macros */
58351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison
58414519a0b46085db68e610147098d03386c34801fBen M Cahill#define em28xx_err(fmt, arg...) do {\
58551e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	printk(KERN_ERR fmt , ##arg); } while (0)
58614519a0b46085db68e610147098d03386c34801fBen M Cahill
58751e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison#define em28xx_errdev(fmt, arg...) do {\
58814519a0b46085db68e610147098d03386c34801fBen M Cahill	printk(KERN_ERR "%s: "fmt,\
58951e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison			dev->name , ##arg); } while (0)
59014519a0b46085db68e610147098d03386c34801fBen M Cahill
59151e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison#define em28xx_info(fmt, arg...) do {\
59214519a0b46085db68e610147098d03386c34801fBen M Cahill	printk(KERN_INFO "%s: "fmt,\
59351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison			dev->name , ##arg); } while (0)
59414519a0b46085db68e610147098d03386c34801fBen M Cahill#define em28xx_warn(fmt, arg...) do {\
59514519a0b46085db68e610147098d03386c34801fBen M Cahill	printk(KERN_WARNING "%s: "fmt,\
596b481de9ca074528fe8c429604e2777db8b89806aZhu Yi			dev->name , ##arg); } while (0)
597b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
59851e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_compression_disable(struct em28xx *dev)
59951e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison{
600b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	/* side effect of disabling scaler and mixer */
60151e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	return em28xx_write_regs(dev, EM28XX_R26_COMPR, "\x00", 1);
602b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}
60351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison
604b481de9ca074528fe8c429604e2777db8b89806aZhu Yistatic inline int em28xx_contrast_get(struct em28xx *dev)
60551e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison{
60651e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f;
607b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}
60851e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison
60951e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_brightness_get(struct em28xx *dev)
61051e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison{
61151e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	return em28xx_read_reg(dev, EM28XX_R21_YOFFSET);
612b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}
61351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison
61451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_saturation_get(struct em28xx *dev)
615b481de9ca074528fe8c429604e2777db8b89806aZhu Yi{
616b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f;
61751e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison}
618b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
61914519a0b46085db68e610147098d03386c34801fBen M Cahillstatic inline int em28xx_u_balance_get(struct em28xx *dev)
62014519a0b46085db68e610147098d03386c34801fBen M Cahill{
62114519a0b46085db68e610147098d03386c34801fBen M Cahill	return em28xx_read_reg(dev, EM28XX_R23_UOFFSET);
62251e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison}
62314519a0b46085db68e610147098d03386c34801fBen M Cahill
62414519a0b46085db68e610147098d03386c34801fBen M Cahillstatic inline int em28xx_v_balance_get(struct em28xx *dev)
62514519a0b46085db68e610147098d03386c34801fBen M Cahill{
62651e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	return em28xx_read_reg(dev, EM28XX_R24_VOFFSET);
6277aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy}
62814519a0b46085db68e610147098d03386c34801fBen M Cahill
62914519a0b46085db68e610147098d03386c34801fBen M Cahillstatic inline int em28xx_gamma_get(struct em28xx *dev)
63051e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison{
631a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy	return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f;
632a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy}
633a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy
634a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guystatic inline int em28xx_contrast_set(struct em28xx *dev, s32 val)
635a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy{
636a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy	u8 tmp = (u8) val;
637a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy	return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1);
638a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy}
639a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy
640a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guystatic inline int em28xx_brightness_set(struct em28xx *dev, s32 val)
641a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy{
642a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy	u8 tmp = (u8) val;
643a326a5d096f031af46c0073dd78eb80dea1f311aEmmanuel Grumbach	return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1);
64451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison}
64514519a0b46085db68e610147098d03386c34801fBen M Cahill
646b481de9ca074528fe8c429604e2777db8b89806aZhu Yistatic inline int em28xx_saturation_set(struct em28xx *dev, s32 val)
647b481de9ca074528fe8c429604e2777db8b89806aZhu Yi{
64851e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	u8 tmp = (u8) val;
649b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1);
65051e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison}
651b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
65251e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_u_balance_set(struct em28xx *dev, s32 val)
653b481de9ca074528fe8c429604e2777db8b89806aZhu Yi{
65451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	u8 tmp = (u8) val;
655b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1);
65651e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison}
657b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
65851e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_v_balance_set(struct em28xx *dev, s32 val)
659b481de9ca074528fe8c429604e2777db8b89806aZhu Yi{
66051e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison	u8 tmp = (u8) val;
661b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1);
66280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill}
663b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
66480cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstatic inline int em28xx_gamma_set(struct em28xx *dev, s32 val)
66580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill{
66680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	u8 tmp = (u8) val;
66780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1);
66880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill}
66980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill
67080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill/*FIXME: maxw should be dependent of alt mode */
67180cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstatic inline unsigned int norm_maxw(struct em28xx *dev)
67280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill{
67380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	if (dev->max_range_640_480)
67480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill		return 640;
67580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill	else
67680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill		return 720;
67780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill}
678b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
6793d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winklerstatic inline unsigned int norm_maxh(struct em28xx *dev)
6803d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler{
6813d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	if (dev->max_range_640_480)
6823d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler		return 480;
6833d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler	else
6843d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler		return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
6853d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler}
6863d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler#endif
6873d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler