em28xx.h revision ee281b856d4e4921da24387ab116bb0855c2efaa
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"
382ba890ec0849b222a6dabb5192ccd8fd1696d6d3Mauro Carvalho Chehab#include "em28xx-reg.h"
393aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
403aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* Boards supported by driver */
413aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_UNKNOWN			0
423aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_UNKNOWN			1
433aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_TERRATEC_CINERGY_250	2
443aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PINNACLE_USB_2		3
453aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2      4
463aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_MSI_VOX_USB_2              5
473aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_TERRATEC_CINERGY_200       6
483aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_LEADTEK_WINFAST_USBII      7
493aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_KWORLD_USB2800             8
503aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PINNACLE_DVC_90		9
513aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900	10
523aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_TERRATEC_HYBRID_XS		11
533aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_KWORLD_PVRTV2800RF		12
543aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_TERRATEC_PRODIGY_XS	13
553aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PROLINK_PLAYTV_USB2	14
563aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_VGEAR_POCKETTV             15
5710ac6603613d46a43a4544fbbe9581e50879bd45Mauro Carvalho Chehab#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950	16
584fd305b2a2c4d16e8d4ebc95c84f946edd3385c5Devin Heitmueller#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO	17
5917d9d558e818530cc7d210ffea575a36f48eaa1aDevin Heitmueller#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2	18
60a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller#define EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA  19
61e14b3658a7651ffd9b1f407eaf07f4dde17ef1e7Devin Heitmueller#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600   20
6259d07f1b705c466ea4eaca9c43d46be6d6a065a4Aron Szabo#define EM2800_BOARD_GRABBEEX_USB2800           21
6395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2750_BOARD_UNKNOWN			  22
6495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2750_BOARD_DLCW_130			  23
6595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_DLINK_USB_TV		  24
6695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_GADMEI_UTV310		  25
6795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_HERCULES_SMART_TV_USB2	  26
6895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME	  27
6995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28
7095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_PINNACLE_DVC_100		  29
7195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_VIDEOLOGY_20K14XUSB	  30
7295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2821_BOARD_USBGEAR_VD204		  31
7395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2821_BOARD_SUPERCOMP_USB_2		  32
7495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2821_BOARD_PROLINK_PLAYTV_USB2	  33
7595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_TERRATEC_HYBRID_XS		  34
7695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_TYPHOON_DVD_MAKER		  35
7795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_NETGMBH_CAM		  36
7895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_GADMEI_UTV330		  37
7995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2861_BOARD_YAKUMO_MOVIE_MIXER		  38
8095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2861_BOARD_KWORLD_PVRTV_300U		  39
8195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2861_BOARD_PLEXTOR_PX_TV100U		  40
8295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_KWORLD_350U		  41
8395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_KWORLD_355U		  42
8495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_TERRATEC_XS		  43
8595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_TERRATEC_XS_MT2060		  44
8695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_PINNACLE_PCTV_DVB		  45
8795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_COMPRO_VIDEOMATE		  46
8895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_KWORLD_DVB_305U		  47
8995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_KWORLD_DVB_310U		  48
9095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_MSI_DIGIVOX_AD		  49
9195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_MSI_DIGIVOX_AD_II		  50
9295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR	  51
9395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2881_BOARD_DNT_DA2_HYBRID		  52
9495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2881_BOARD_PINNACLE_HYBRID_PRO	  53
9595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2882_BOARD_KWORLD_VS_DVBT		  54
9695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2882_BOARD_TERRATEC_HYBRID_XS		  55
9795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2882_BOARD_PINNACLE_HYBRID_PRO	  56
9895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2883_BOARD_KWORLD_HYBRID_A316		  57
99ee281b856d4e4921da24387ab116bb0855c2efaaMauro Carvalho Chehab#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU	  58
1003aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
1013aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* Limits minimum and default number of buffers */
1023aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_MIN_BUF 4
1033aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DEF_BUF 8
104a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
10595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf/* Params for validated field */
10695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM28XX_BOARD_NOT_VALIDATED 1
10795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM28XX_BOARD_VALIDATED	   0
10895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf
109596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* maximum number of em28xx boards */
1103687e1e67e4920a202d53cc24678fb34fcda8fc5Mauro Carvalho Chehab#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */
111596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab
112a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* maximum number of frames that can be queued */
1133acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_FRAMES 5
114a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of frames that get used for v4l2_read() */
1153acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_READ_FRAMES 2
116a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
117a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of buffers for isoc transfers */
1183acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_BUFS 5
119a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
120d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab/* number of packets for each buffer
121d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab   windows requests only 40 packets .. so we better do the same
122d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab   this is what I found out for all alternate numbers there!
123d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab */
1243acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_PACKETS 40
125a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
126a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* default alternate; 0 means choose the best */
1273acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_PINOUT 0
128a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
1293acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_INTERLACED_DEFAULT 1
130a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
131a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/*
132a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define (use usbview if you want to get the other alternate number infos)
133a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define
134a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define alternate number 2
135a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define 			Endpoint Address: 82
136a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Direction: in
137a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Attribute: 1
138a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Type: Isoc
139a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Max Packet Size: 1448
140a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Interval: 125us
141a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
142a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton  alternate number 7
143a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
144a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Endpoint Address: 82
145a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Direction: in
146a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Attribute: 1
147a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Type: Isoc
148a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Max Packet Size: 3072
149a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Interval: 125us
150a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton*/
151a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
152a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* time to wait when stopping the isoc transfer */
1533acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_URB_TIMEOUT       msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
154a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
155596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* time in msecs to wait for i2c writes to finish */
156596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab#define EM2800_I2C_WRITE_TIMEOUT 20
157596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab
1583aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehabenum em28xx_mode {
159c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab	EM28XX_MODE_UNDEFINED,
1603aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	EM28XX_ANALOG_MODE,
1613aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	EM28XX_DIGITAL_MODE,
1623aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab};
1633aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
1643acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_stream_state {
165a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	STREAM_OFF,
166a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	STREAM_INTERRUPT,
167a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	STREAM_ON,
168a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
169a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
170579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonstruct em28xx;
171579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
172ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_usb_isoc_ctl {
173ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* max packet size of isoc transaction */
174ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				max_pkt_size;
175ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
176ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* number of allocated urbs */
177ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				num_bufs;
178ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
179ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* urb for isoc transfers */
180ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct urb			**urb;
181ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
182ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* transfer buffers for isoc transfer */
183ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	char				**transfer_buffer;
184ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
185ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Last buffer command and region */
186ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	u8				cmd;
187ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				pos, size, pktsize;
188ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
189ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Last field: ODD or EVEN? */
190ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				field;
191ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
192ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Stores incomplete commands */
193ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	u32				tmp_buf;
194ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				tmp_buf_len;
195ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
196ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Stores already requested buffers */
197ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct em28xx_buffer    	*buf;
198ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
199ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Stores the number of received fields */
200ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				nfields;
201579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
202579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton		/* isoc urb callback */
203579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton	int (*isoc_copy) (struct em28xx *dev, struct urb *urb);
204579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
205ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab};
206ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
207ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_fmt {
208ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	char  *name;
209ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	u32   fourcc;          /* v4l2 format id */
210ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab};
211ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
212ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab/* buffer for one video frame */
213ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_buffer {
214ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	/* common v4l buffer stuff -- must be first */
215ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct videobuf_buffer vb;
216ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
217a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct list_head frame;
218a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int top_field;
219ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int receiving;
220ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab};
221ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
222ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_dmaqueue {
223ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct list_head       active;
224ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct list_head       queued;
225ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
226ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	wait_queue_head_t          wq;
227ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
228ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	/* Counters to control buffer fill */
229ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int                        pos;
230a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
231a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
232a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* io methods */
2333acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_io_method {
234a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	IO_NONE,
235a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	IO_READ,
236a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	IO_MMAP,
237a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
238a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
239a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* inputs */
240a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
2413acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define MAX_EM28XX_INPUT 4
2423acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum enum28xx_itype {
2433acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE1 = 1,
2443acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE2,
2453acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE3,
2463acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE4,
2473acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_SVIDEO,
2483acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_TELEVISION,
2493acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_CABLE,
2503acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_DVB,
2513acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_DEBUG,
2523acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_RADIO,
253a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
254a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
255539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehabenum em28xx_amux {
256539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	EM28XX_AMUX_VIDEO,
257539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	EM28XX_AMUX_LINE_IN,
258539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	EM28XX_AMUX_AC97_VIDEO,
259539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	EM28XX_AMUX_AC97_LINE_IN,
260539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab};
261539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab
2623acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_input {
2633acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum enum28xx_itype type;
264a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int vmux;
265539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	enum em28xx_amux amux;
266a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
267a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
2683acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
269a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
2703acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_decoder {
2713acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_TVP5150,
2723acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_SAA7113,
2733acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_SAA7114
274a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
275a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
276102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehabstruct em28xx_reg_seq {
277102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab	int reg;
278c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab	unsigned char val, mask;
279102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab	int sleep;
280ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab};
281ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab
2823acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_board {
283a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	char *name;
284a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int vchannels;
285a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tuner_type;
286a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
287a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* i2c flags */
288a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int tda9887_conf;
289a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
29074f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	unsigned int is_em2800:1;
291a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int has_msp34xx:1;
2925add9a6f3c90680f89b4694e81025d2aed9559afMauro Carvalho Chehab	unsigned int mts_firmware:1;
2933abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab	unsigned int has_12mhz_i2s:1;
294c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	unsigned int max_range_640_480:1;
2953aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	unsigned int has_dvb:1;
296a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	unsigned int has_snapshot_button:1;
29795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf	unsigned int valid:1;
2983abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab
2993acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_decoder decoder;
300a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
3013acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	struct em28xx_input       input[MAX_EM28XX_INPUT];
3020be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab	struct em28xx_input	  radio;
303a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
304a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
3053acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_eeprom {
306a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u32 id;			/* 0x9567eb1a */
307a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 vendor_ID;
308a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 product_ID;
309a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
310a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 chip_conf;
311a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
312a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 board_conf;
313a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
314a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 string1, string2, string3;
315a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
316a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 string_idx_table;
317a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
318a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
319a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* device states */
3203acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_dev_state {
321a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	DEV_INITIALIZED = 0x01,
322a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	DEV_DISCONNECTED = 0x02,
323a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	DEV_MISCONFIGURED = 0x04,
324a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
325a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
3266d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_BUFS 5
3276d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_NUM_AUDIO_PACKETS 64
3286d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */
3296d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_CAPTURE_STREAM_EN 1
3303aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
3313aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* em28xx extensions */
3326d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO   0x10
3333aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DVB     0x20
3346d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
3356d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_audio {
3366d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	char name[50];
3376d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	char *transfer_buffer[EM28XX_AUDIO_BUFS];
3386d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct urb *urb[EM28XX_AUDIO_BUFS];
3396d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct usb_device *udev;
3406d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	unsigned int capture_transfer_done;
3416d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct snd_pcm_substream   *capture_pcm_substream;
3426d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
3436d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	unsigned int hwptr_done_capture;
3446d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct snd_card            *sndcard;
3456d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
3466d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int users, shutdown;
3476d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	enum em28xx_stream_state capture_stream;
3486d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	spinlock_t slock;
3496d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab};
3506d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
35152284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx;
35252284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
35352284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx_fh {
35452284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	struct em28xx *dev;
35552284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	unsigned int  stream_on:1;	/* Locks streams */
35652284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	int           radio;
35752284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
35852284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	struct videobuf_queue        vb_vidq;
35952284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
36052284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	enum v4l2_buf_type           type;
36152284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab};
36252284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
363a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* main device struct */
3643acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx {
365a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* generic device properties */
366a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	char name[30];		/* name (including minor) of the device */
367a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int model;		/* index in the device_data struct */
368e5589befc472ca50882f37c4fb32333fc93a65b7Mauro Carvalho Chehab	int devno;		/* marks the number of this device */
36974f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	unsigned int is_em2800:1;
370a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int has_msp34xx:1;
371a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int has_tda9887:1;
372a225452ef80a7bd894fd2dfd01a4973d444152f4Mauro Carvalho Chehab	unsigned int stream_on:1;	/* Locks streams */
373d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab	unsigned int has_audio_class:1;
3743abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab	unsigned int has_12mhz_i2s:1;
375c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	unsigned int max_range_640_480:1;
3763aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	unsigned int has_dvb:1;
377a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	unsigned int has_snapshot_button:1;
37895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf	unsigned int valid:1;		/* report for validated boards */
379a225452ef80a7bd894fd2dfd01a4973d444152f4Mauro Carvalho Chehab
38089b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab	/* Some older em28xx chips needs a waiting time after writing */
38189b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab	unsigned int wait_after_write;
38289b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab
383c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab	/* GPIO sequences for analog and digital mode */
384102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab	struct em28xx_reg_seq *analog_gpio, *digital_gpio;
385ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab
386c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab	/* GPIO sequences for tuner callbacks */
387c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab	struct em28xx_reg_seq *tun_analog_gpio, *tun_digital_gpio;
388c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab
38974f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	int video_inputs;	/* number of video inputs */
39074f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	struct list_head	devlist;
39174f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab
3929bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab	u32 i2s_speed;		/* I2S speed for audio digital stream */
3939bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab
3943acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_decoder decoder;
395a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
396a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tuner_type;		/* type of the tuner */
397a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tuner_addr;		/* tuner address */
398a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tda9887_conf;
399a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* i2c i/o */
400a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct i2c_adapter i2c_adap;
401a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct i2c_client i2c_client;
402a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* video for linux */
403a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int users;		/* user count for exclusive use */
404a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct video_device *vdev;	/* video for linux device struct */
4057d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab	v4l2_std_id norm;	/* selected tv norm */
406a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int ctl_freq;		/* selected frequency */
407a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int ctl_input;	/* selected input */
40895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf	unsigned int ctl_ainput;/* selected audio input */
409a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int mute;
410a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int volume;
411a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* frame properties */
412a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int width;		/* current frame width */
413a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int height;		/* current frame height */
414a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int hscale;		/* horizontal scale factor (see datasheet) */
415a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int vscale;		/* vertical scale factor (see datasheet) */
416a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int interlaced;		/* 1=interlace fileds, 0=just top fileds */
4179e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab	unsigned int video_bytesread;	/* Number of bytes read */
418a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
41903910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab	unsigned long hash;	/* eeprom hash - for boards with generic ID */
4206ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	unsigned long i2c_hash;	/* i2c devicelist hash -
4216ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf				   for boards with generic ID */
42203910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab
4236d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct em28xx_audio *adev;
4246d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
425a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* states */
4263acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_dev_state state;
4273acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_io_method io;
4289e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab
429d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab	struct work_struct         request_module_wk;
430d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab
431a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* locks */
4325a80415bcabf2b59e8c34db6e743c54582cfd3c2Sascha Sommer	struct mutex lock;
433d7aa80207babe694b316a48200b096cf0336ecb3Aidan Thornton	/* spinlock_t queue_lock; */
434a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct list_head inqueue, outqueue;
435a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	wait_queue_head_t open, wait_frame, wait_stream;
436a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct video_device *vbi_dev;
4370be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab	struct video_device *radio_dev;
438a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
439a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned char eedata[256];
440a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
441ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	/* Isoc control struct */
442ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct em28xx_dmaqueue vidq;
443ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct em28xx_usb_isoc_ctl isoc_ctl;
444ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	spinlock_t slock;
445ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
446a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* usb transfer */
447a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct usb_device *udev;	/* the usb device */
448a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int alt;		/* alternate */
449a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int max_pkt_size;	/* max packet size of isoc transaction */
4509d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab	int num_alt;		/* Number of alternative settings */
4519d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
4523acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	struct urb *urb[EM28XX_NUM_BUFS];	/* urb for isoc transfers */
4533acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	char *transfer_buffer[EM28XX_NUM_BUFS];	/* transfer buffers for isoc transfer */
454a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* helper funcs that call usb_control_msg */
4556ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_write_regs) (struct em28xx *dev, u16 reg,
456a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton					char *buf, int len);
4576ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_read_reg) (struct em28xx *dev, u16 reg);
4586ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg,
4596ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf					char *buf, int len);
4606ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg,
461a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton				      char *buf, int len);
4626ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg);
4633aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
4643aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	enum em28xx_mode mode;
4653aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
466c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab	/* Caches GPO and GPIO registers */
467c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab	unsigned char	reg_gpo, reg_gpio;
468c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab
469a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	/* Snapshot button */
470a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	char snapshot_button_path[30];	/* path of the input dev */
471a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	struct input_dev *sbutton_input_dev;
472a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	struct delayed_work sbutton_query_work;
473a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller
4743421b7787a2cf41ac5edce9b5766bddd1e1d9986Aidan Thornton	struct em28xx_dvb *dvb;
475a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
476a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4776d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_ops {
4786d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct list_head next;
4796d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	char *name;
4806d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int id;
4816d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int (*init)(struct em28xx *);
4826d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int (*fini)(struct em28xx *);
483a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab};
484a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab
4853acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-i2c.c */
486a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4873acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg);
488fad7b958e753e18ff443786360f7846da50a3085Sascha Sommervoid em28xx_do_i2c_scan(struct em28xx *dev);
4893acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_i2c_register(struct em28xx *dev);
4903acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_i2c_unregister(struct em28xx *dev);
491a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4923acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-core.c */
493a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4943acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabu32 em28xx_request_buffers(struct em28xx *dev, u32 count);
4953acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_queue_unusedframes(struct em28xx *dev);
4963acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_release_buffers(struct em28xx *dev);
497a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
4983acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
499a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			    char *buf, int len);
5003acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
5013acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg(struct em28xx *dev, u16 reg);
5023acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
503a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			  int len);
5043acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
5053acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_audio_analog_set(struct em28xx *dev);
506539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab
5073acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_colorlevels_set_default(struct em28xx *dev);
5083acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_capture_start(struct em28xx *dev, int start);
5093acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_outfmt_set_yuv422(struct em28xx *dev);
5103acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_resolution_set(struct em28xx *dev);
5113acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_set_alternate(struct em28xx *dev);
512579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonint em28xx_init_isoc(struct em28xx *dev, int max_packets,
513579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton		     int num_bufs, int max_pkt_size,
514c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab		     int (*isoc_copy) (struct em28xx *dev, struct urb *urb));
515579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonvoid em28xx_uninit_isoc(struct em28xx *dev);
516c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehabint em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
517c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehabint em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
5183acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab
5196d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab/* Provided by em28xx-video.c */
5206d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabint em28xx_register_extension(struct em28xx_ops *dev);
5216d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabvoid em28xx_unregister_extension(struct em28xx_ops *dev);
5226d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
5233acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-cards.c */
5246ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafextern int em2800_variant_detect(struct usb_device *udev, int model);
525a94e95b443811c127734ef10f3b7d2220532c1d2Markus Rechbergerextern void em28xx_pre_card_setup(struct em28xx *dev);
5263acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern void em28xx_card_setup(struct em28xx *dev);
5273acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct em28xx_board em28xx_boards[];
5283acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct usb_device_id em28xx_id_table[];
5293acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern const unsigned int em28xx_bcount;
530c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabvoid em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir);
531ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehabint em28xx_tuner_callback(void *ptr, int command, int arg);
532c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab
533c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab/* Provided by em28xx-input.c */
534c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab/* TODO: Check if the standard get_key handlers on ir-common can be used */
535c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
536c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
537c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key,
538c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab				     u32 *ir_raw);
539a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmuellervoid em28xx_register_snapshot_button(struct em28xx *dev);
540a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmuellervoid em28xx_deregister_snapshot_button(struct em28xx *dev);
541a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
542a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* printk macros */
543a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5443acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_err(fmt, arg...) do {\
545f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare	printk(KERN_ERR fmt , ##arg); } while (0)
546a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5473acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_errdev(fmt, arg...) do {\
5484ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab	printk(KERN_ERR "%s: "fmt,\
549f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare			dev->name , ##arg); } while (0)
550a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5513acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_info(fmt, arg...) do {\
5524ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab	printk(KERN_INFO "%s: "fmt,\
553f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare			dev->name , ##arg); } while (0)
5543acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_warn(fmt, arg...) do {\
5554ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab	printk(KERN_WARNING "%s: "fmt,\
556f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare			dev->name , ##arg); } while (0)
557a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5586ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_compression_disable(struct em28xx *dev)
559a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
560a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* side effect of disabling scaler and mixer */
56141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R26_COMPR, "\x00", 1);
562a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
563a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5646ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_get(struct em28xx *dev)
565a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
56641facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f;
567a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
568a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5696ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_get(struct em28xx *dev)
570a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
57141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R21_YOFFSET);
572a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
573a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5746ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_get(struct em28xx *dev)
575a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
57641facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f;
577a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
578a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5796ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_get(struct em28xx *dev)
580a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
58141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R23_UOFFSET);
582a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
583a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5846ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_get(struct em28xx *dev)
585a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
58641facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R24_VOFFSET);
587a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
588a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5896ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_get(struct em28xx *dev)
590a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
59141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f;
592a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
593a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5946ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_set(struct em28xx *dev, s32 val)
595a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
596a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
59741facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1);
598a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
599a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6006ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_set(struct em28xx *dev, s32 val)
601a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
602a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
60341facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1);
604a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
605a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6066ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_set(struct em28xx *dev, s32 val)
607a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
608a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
60941facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1);
610a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
611a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6126ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_set(struct em28xx *dev, s32 val)
613a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
614a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
61541facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1);
616a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
617a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6186ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_set(struct em28xx *dev, s32 val)
619a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
620a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
62141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1);
622a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
623a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6246ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_set(struct em28xx *dev, s32 val)
625a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
626a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
62741facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1);
628a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
629a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
630a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/*FIXME: maxw should be dependent of alt mode */
6316ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxw(struct em28xx *dev)
63230556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger{
633c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	if (dev->max_range_640_480)
6347d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return 640;
635c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	else
6367d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return 720;
63730556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger}
63830556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger
6396ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxh(struct em28xx *dev)
640a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
641c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	if (dev->max_range_640_480)
6427d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return 480;
643c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	else
6447d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
645a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
646a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#endif
647