em28xx.h revision 66d9cbad5330d6df30c82f10ee18b62b096b84ef
1712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/*
2712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   em28xx.h - driver for Empia EM2800/EM2820/2840 USB video capture devices
3712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
4712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com>
51f44780827c6bbbcd1f12d5c6b6ce84f49a96bc0Reinette Chatre		      Ludovico Cavedon <cavedon@sssup.it>
6712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		      Mauro Carvalho Chehab <mchehab@infradead.org>
7712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
8712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de>
9712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
10712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   This program is free software; you can redistribute it and/or modify
11712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   it under the terms of the GNU General Public License as published by
12712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   the Free Software Foundation; either version 2 of the License, or
13712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   (at your option) any later version.
14712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
15712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   This program is distributed in the hope that it will be useful,
16712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   but WITHOUT ANY WARRANTY; without even the implied warranty of
17712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   GNU General Public License for more details.
19712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
20712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   You should have received a copy of the GNU General Public License
21712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   along with this program; if not, write to the Free Software
22712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */
24712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
25759ef89fb096c4a6ef078d3cfd5682ac037bd789Winkler, Tomas#ifndef _EM28XX_H
26712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define _EM28XX_H
27712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
28712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/videodev2.h>
295a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <media/videobuf-vmalloc.h>
30712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <media/v4l2-device.h>
31712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
32712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/i2c.h>
33712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/mutex.h>
34712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <media/ir-kbd-i2c.h>
35712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE)
36712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <media/videobuf-dvb.h>
37712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#endif
383e0d4cb12f6fd97193a455b49125398b2231c87cTomas Winkler#include "tuner-xc2028.h"
39712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include "em28xx-reg.h"
40fee1247a30e5b3d48fe985b4a935eb6818f3b464Tomas Winkler
413395f6e9cf48469d7ee05703cad1502002741c16Tomas Winkler/* Boards supported by driver */
425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy#define EM2800_BOARD_UNKNOWN			0
43712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_UNKNOWN			1
44712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_TERRATEC_CINERGY_250	2
454c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_PINNACLE_USB_2		3
464c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2      4
474c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_MSI_VOX_USB_2              5
484c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2800_BOARD_TERRATEC_CINERGY_200       6
49712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2800_BOARD_LEADTEK_WINFAST_USBII      7
50712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2800_BOARD_KWORLD_USB2800             8
514c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_PINNACLE_DVC_90		9
524c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900	10
534c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_TERRATEC_HYBRID_XS		11
544c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_KWORLD_PVRTV2800RF		12
554c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_TERRATEC_PRODIGY_XS	13
564c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_PROLINK_PLAYTV_USB2	14
57712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2800_BOARD_VGEAR_POCKETTV             15
58712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950	16
594c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO	17
604c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2	18
614c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2860_BOARD_SAA711X_REFERENCE_DESIGN	19
624c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600   20
634c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2800_BOARD_GRABBEEX_USB2800           21
644c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2750_BOARD_UNKNOWN			  22
65445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#define EM2750_BOARD_DLCW_130			  23
66445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#define EM2820_BOARD_DLINK_USB_TV		  24
67712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_GADMEI_UTV310		  25
68712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_HERCULES_SMART_TV_USB2	  26
69712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME	  27
70712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28
71712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_VIDEOLOGY_20K14XUSB	  30
72712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2821_BOARD_USBGEAR_VD204		  31
73712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2821_BOARD_SUPERCOMP_USB_2		  32
74712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_TERRATEC_HYBRID_XS		  34
75712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_TYPHOON_DVD_MAKER		  35
76712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_NETGMBH_CAM		  36
77712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_GADMEI_UTV330		  37
78712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2861_BOARD_YAKUMO_MOVIE_MIXER		  38
79712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2861_BOARD_KWORLD_PVRTV_300U		  39
80712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2861_BOARD_PLEXTOR_PX_TV100U		  40
81712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_KWORLD_350U		  41
82712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_KWORLD_355U		  42
83712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_TERRATEC_XS		  43
84712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_TERRATEC_XS_MT2060		  44
85712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_PINNACLE_PCTV_DVB		  45
86712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_COMPRO_VIDEOMATE		  46
87712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_KWORLD_DVB_305U		  47
88712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_KWORLD_DVB_310U		  48
89712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_MSI_DIGIVOX_AD		  49
90712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_MSI_DIGIVOX_AD_II		  50
91712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR	  51
92189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2881_BOARD_DNT_DA2_HYBRID		  52
93189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2881_BOARD_PINNACLE_HYBRID_PRO	  53
94189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2882_BOARD_KWORLD_VS_DVBT		  54
95189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2882_BOARD_TERRATEC_HYBRID_XS		  55
96189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2882_BOARD_PINNACLE_HYBRID_PRO	  56
97189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2883_BOARD_KWORLD_HYBRID_330U                  57
98189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU	  58
99189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850	  60
100712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2	  61
101712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_GADMEI_TVR200		  62
102712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_KAIOMY_TVNPC_U2              63
103712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_EASYCAP                      64
104712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_IODATA_GVMVP_SZ		  65
105712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_EMPIRE_DUAL_TV		  66
106712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_TERRATEC_GRABBY		  67
107712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_TERRATEC_AV350		  68
108712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2882_BOARD_KWORLD_ATSC_315U		  69
109712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2882_BOARD_EVGA_INDTUBE		  70
110712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_SILVERCREST_WEBCAM           71
111712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2861_BOARD_GADMEI_UTV330PLUS           72
112712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_REDDO_DVB_C_USB_BOX          73
11328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten#define EM2800_BOARD_VC211A			  74
11422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
115712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* Limits minimum and default number of buffers */
116712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM28XX_MIN_BUF 4
11722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_DEF_BUF 8
11822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
11998a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy/*Limits the max URB message size */
12098a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy#define URB_MAX_CTRL_SIZE 80
12122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
12222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* Params for validated field */
12322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_BOARD_NOT_VALIDATED 1
12422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_BOARD_VALIDATED	   0
12522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
12622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* Params for em28xx_cmd() audio */
12798a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy#define EM28XX_START_AUDIO      1
12822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_STOP_AUDIO       0
12922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
13022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* maximum number of em28xx boards */
13122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */
13222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
13322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* maximum number of frames that can be queued */
13498a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy#define EM28XX_NUM_FRAMES 5
13522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* number of frames that get used for v4l2_read() */
13622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_NUM_READ_FRAMES 2
13722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
13822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* number of buffers for isoc transfers */
13922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_NUM_BUFS 5
14022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
14122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* number of packets for each buffer
14222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy   windows requests only 40 packets .. so we better do the same
14322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy   this is what I found out for all alternate numbers there!
14422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy */
14522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_NUM_PACKETS 40
14622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
14722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_INTERLACED_DEFAULT 1
1487163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy
14922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/*
15022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define (use usbview if you want to get the other alternate number infos)
15122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define
15222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define alternate number 2
15322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define 			Endpoint Address: 82
15422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy			Direction: in
15522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy			Attribute: 1
156712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler			Type: Isoc
15722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy			Max Packet Size: 1448
15822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy			Interval: 125us
15922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
16022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy  alternate number 7
16122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
16222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy			Endpoint Address: 82
1637163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy			Direction: in
16422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy			Attribute: 1
16522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy			Type: Isoc
166712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler			Max Packet Size: 3072
167712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler			Interval: 125us
168712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler*/
169712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
170712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* time to wait when stopping the isoc transfer */
171712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM28XX_URB_TIMEOUT \
17228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten			msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
17322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
174712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* time in msecs to wait for i2c writes to finish */
17522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM2800_I2C_WRITE_TIMEOUT 20
17622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
17722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guyenum em28xx_mode {
17898a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy	EM28XX_SUSPEND,
17922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy	EM28XX_ANALOG_MODE,
18022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy	EM28XX_DIGITAL_MODE,
18122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy};
182712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
18322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guyenum em28xx_stream_state {
18422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy	STREAM_OFF,
18522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy	STREAM_INTERRUPT,
18698a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy	STREAM_ON,
18722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy};
18822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
18922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guystruct em28xx;
19022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
19122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guystruct em28xx_usb_isoc_ctl {
19222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy		/* max packet size of isoc transaction */
19398a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy	int				max_pkt_size;
19422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
19522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy		/* number of allocated urbs */
19622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy	int				num_bufs;
19722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
19822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy		/* urb for isoc transfers */
19922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy	struct urb			**urb;
20022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
20122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy		/* transfer buffers for isoc transfer */
202712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	char				**transfer_buffer;
20322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
20422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy		/* Last buffer command and region */
20522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy	u8				cmd;
20622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy	int				pos, size, pktsize;
20722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy
208712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		/* Last field: ODD or EVEN? */
209712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	int				field;
210712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
211712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		/* Stores incomplete commands */
212712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	u32				tmp_buf;
213712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	int				tmp_buf_len;
214712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
215712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		/* Stores already requested buffers */
2162943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy	struct em28xx_buffer    	*vid_buf;
217712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	struct em28xx_buffer    	*vbi_buf;
218712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
219712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		/* Stores the number of received fields */
22028f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten	int				nfields;
2212943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy
222712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler		/* isoc urb callback */
2235ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy	int (*isoc_copy) (struct em28xx *dev, struct urb *urb);
2244c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg
2254c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg};
2265ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy
2274c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg/* Struct to enumberate video formats */
2285ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guystruct em28xx_fmt {
2294c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg	char  *name;
2305ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy	u32   fourcc;          /* v4l2 format id */
2314c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg	int   depth;
2322943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy	int   reg;
2332943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy};
2342943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy
2355ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy/* buffer for one video frame */
2364c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Bergstruct em28xx_buffer {
2375ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy	/* common v4l buffer stuff -- must be first */
2384c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg	struct videobuf_buffer vb;
2394c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg
2404c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg	struct list_head frame;
2414c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg	int top_field;
242712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	int receiving;
243712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler};
244712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
245712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstruct em28xx_dmaqueue {
246712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	struct list_head       active;
247712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	struct list_head       queued;
248712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
249712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	wait_queue_head_t          wq;
250712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
251712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	/* Counters to control buffer fill */
252712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	int                        pos;
253712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler};
254712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
2552943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy/* io methods */
2562943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guyenum em28xx_io_method {
257db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar	IO_NONE,
258712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	IO_READ,
259db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar	IO_MMAP,
260712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler};
261712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
2622943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy/* inputs */
263712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
264712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define MAX_EM28XX_INPUT 4
265712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerenum enum28xx_itype {
266712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_VMUX_COMPOSITE1 = 1,
267712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_VMUX_COMPOSITE2,
268712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_VMUX_COMPOSITE3,
269712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_VMUX_COMPOSITE4,
270712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_VMUX_SVIDEO,
271712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_VMUX_TELEVISION,
272712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_VMUX_CABLE,
273712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_VMUX_DVB,
274712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_VMUX_DEBUG,
275712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_RADIO,
276712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler};
277712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
278712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerenum em28xx_ac97_mode {
279712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_NO_AC97 = 0,
280712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_AC97_EM202,
2814c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg	EM28XX_AC97_SIGMATEL,
2824c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg	EM28XX_AC97_OTHER,
283712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler};
2844c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg
2854c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Bergstruct em28xx_audio_mode {
286712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	enum em28xx_ac97_mode ac97;
287712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
288712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	u16 ac97_feat;
289712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	u32 ac97_vendor_id;
290712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
291712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	unsigned int has_audio:1;
292712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
293712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	unsigned int i2s_3rates:1;
29428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten	unsigned int i2s_5rates:1;
2956def9761f72501e638e79eebcd70afea12a3a93dTomas Winkler};
2965425e490471d521bae2fce16d22995803b41d90fTomas Winkler
297712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* em28xx has two audio inputs: tuner and line in.
298712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   However, on most devices, an auxiliary AC97 codec device is used.
299712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   The AC97 device may have several different inputs and outputs,
300712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   depending on their model. So, it is possible to use AC97 mixer to
301712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler   address more than two different entries.
302712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */
303712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerenum em28xx_amux {
3043ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler	/* This is the only entry for em28xx tuner input */
305712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_AMUX_VIDEO,	/* em28xx tuner, AC97 mixer Video */
306712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
307db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar	EM28XX_AMUX_LINE_IN,	/* AC97 mixer Line In */
308712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
309712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	/* Some less-common mixer setups */
310712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_AMUX_VIDEO2,	/* em28xx Line in, AC97 mixer Video */
311712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_AMUX_PHONE,
312da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AMUX_MIC,
313da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AMUX_CD,
314da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AMUX_AUX,
315da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AMUX_PCM_OUT,
316da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg};
317da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg
318da73511d4316c4e3efe903e123286c5b55a1999fJohannes Bergenum em28xx_aout {
319da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	/* AC97 outputs */
320da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_MASTER = 1 << 0,
321da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_LINE   = 1 << 1,
322712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	EM28XX_AOUT_MONO   = 1 << 2,
323da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_LFE    = 1 << 3,
324da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_SURR   = 1 << 4,
325da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg
326da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	/* PCM IN Mixer - used by AC97_RECORD_SELECT register */
327da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_PCM_IN = 1 << 7,
328da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg
329da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	/* Bits 10-8 are used to indicate the PCM IN record select */
330da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_PCM_MIC_PCM = 0 << 8,
331da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_PCM_CD	= 1 << 8,
332da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_PCM_VIDEO	= 2 << 8,
333da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_PCM_AUX	= 3 << 8,
334da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_PCM_LINE	= 4 << 8,
335db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar	EM28XX_AOUT_PCM_STEREO	= 5 << 8,
336da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg	EM28XX_AOUT_PCM_MONO	= 6 << 8,
337db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar	EM28XX_AOUT_PCM_PHONE	= 7 << 8,
338712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler};
339da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg
340da73511d4316c4e3efe903e123286c5b55a1999fJohannes Bergstatic inline int ac97_return_record_select(int a_out)
341712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{
342712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	return (a_out & 0x700) >> 8;
343712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}
344712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler
345712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstruct em28xx_reg_seq {
346712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	int reg;
347712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	unsigned char val, mask;
3480848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy	int sleep;
3498dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler};
3508dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3518dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winklerstruct em28xx_input {
3528dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	enum enum28xx_itype type;
3538dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	unsigned int vmux;
35428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten	enum em28xx_amux amux;
3558dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	enum em28xx_aout aout;
3568dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	struct em28xx_reg_seq *gpio;
3578dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler};
358e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy
3598dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler#define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
3608dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3618dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winklerenum em28xx_decoder {
3628dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	EM28XX_NODECODER = 0,
3630848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy	EM28XX_TVP5150,
3648dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	EM28XX_SAA711X,
3658dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler};
3668dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
367c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawallenum em28xx_sensor {
368c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall	EM28XX_NOSENSOR = 0,
369c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall	EM28XX_MT9V011,
370c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall	EM28XX_MT9M001,
371c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall	EM28XX_MT9M111,
372c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall};
3738dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3748dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winklerenum em28xx_adecoder {
3758dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	EM28XX_NOADECODER = 0,
37615b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas	EM28XX_TVAUDIO,
3778dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler};
3788dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
379e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guystruct em28xx_board {
380e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy	char *name;
381e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy	int vchannels;
3820848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy	int tuner_type;
383e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy	int tuner_addr;
3848dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3858dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	/* i2c flags */
3868dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	unsigned int tda9887_conf;
3878dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3882fac9717a05fc4b4824422d2c439c1260807c110Reinette Chatre	/* GPIO sequences */
3898dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	struct em28xx_reg_seq *dvb_gpio;
3908dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	struct em28xx_reg_seq *suspend_gpio;
3918dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	struct em28xx_reg_seq *tuner_gpio;
3928dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	struct em28xx_reg_seq *mute_gpio;
3938dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler
3948dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	unsigned int is_em2800:1;
3958dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	unsigned int has_msp34xx:1;
3968dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler	unsigned int mts_firmware:1;
397712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler	unsigned int max_range_640_480:1;
398b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	unsigned int has_dvb:1;
399b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	unsigned int has_snapshot_button:1;
400b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	unsigned int is_webcam:1;
401b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	unsigned int valid:1;
402b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	unsigned int has_ir_i2c:1;
403b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy
404b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	unsigned char xclk, i2c_speed;
405b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	unsigned char radio_addr;
406b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	unsigned short tvaudio_addr;
407937c397eb633b804d9a806d08c395ecfc42b1fecWey-Yi Guy
408937c397eb633b804d9a806d08c395ecfc42b1fecWey-Yi Guy	enum em28xx_decoder decoder;
409937c397eb633b804d9a806d08c395ecfc42b1fecWey-Yi Guy	enum em28xx_adecoder adecoder;
410b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy
411b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	struct em28xx_input       input[MAX_EM28XX_INPUT];
412b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	struct em28xx_input	  radio;
413b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	struct ir_scancode_table  *ir_codes;
414b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy};
415b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy
416189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerstruct em28xx_eeprom {
417189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	u32 id;			/* 0x9567eb1a */
418189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	u16 vendor_ID;
419189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	u16 product_ID;
420189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer
421189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	u16 chip_conf;
422189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer
423189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	u16 board_conf;
424189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer
425189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	u16 string1, string2, string3;
426189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer
427189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	u8 string_idx_table;
428189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer};
429189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer
430189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer/* device states */
431189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerenum em28xx_dev_state {
432b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	DEV_INITIALIZED = 0x01,
433b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy	DEV_DISCONNECTED = 0x02,
434189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer	DEV_MISCONFIGURED = 0x04,
435189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer};
436189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer
437189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM28XX_AUDIO_BUFS 5
438d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_NUM_AUDIO_PACKETS 64
439d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */
440d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_CAPTURE_STREAM_EN 1
441d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas
442d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas/* em28xx extensions */
44328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten#define EM28XX_AUDIO   0x10
444d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_DVB     0x20
445d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas
446d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas/* em28xx resource types (used for res_get/res_lock etc */
447d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_RESOURCE_VIDEO 0x01
448d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_RESOURCE_VBI   0x02
449d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas
450d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomasstruct em28xx_audio {
451d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	char name[50];
452d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	char *transfer_buffer[EM28XX_AUDIO_BUFS];
453d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	struct urb *urb[EM28XX_AUDIO_BUFS];
454d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	struct usb_device *udev;
45515b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas	unsigned int capture_transfer_done;
456d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	struct snd_pcm_substream   *capture_pcm_substream;
457d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas
458d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	unsigned int hwptr_done_capture;
459d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	struct snd_card            *sndcard;
460a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
461a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	int users;
462d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	enum em28xx_stream_state capture_stream;
463d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	spinlock_t slock;
464a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy};
465a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
466d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomasstruct em28xx;
467a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
468a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guystruct em28xx_fh {
469a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	struct em28xx *dev;
470a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	int           radio;
471a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	unsigned int  resources;
472a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
473a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	struct videobuf_queue        vb_vidq;
474a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	struct videobuf_queue        vb_vbiq;
475a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
476a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	enum v4l2_buf_type           type;
477a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy};
478a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
479a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy/* main device struct */
480a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guystruct em28xx {
481a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	/* generic device properties */
482a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	char name[30];		/* name (including minor) of the device */
483d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	int model;		/* index in the device_data struct */
484a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	int devno;		/* marks the number of this device */
485a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	enum em28xx_chip_id chip_id;
486d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas
487d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	struct v4l2_device v4l2_dev;
488a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	struct em28xx_board board;
489a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
490a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	/* Webcam specific fields */
491a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	enum em28xx_sensor em28xx_sensor;
492a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	int sensor_xres, sensor_yres;
493a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	int sensor_xtal;
494a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
495a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	/* Allows progressive (e. g. non-interlaced) mode */
496a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	int progressive;
497a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
498a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	/* Vinmode/Vinctl used at the driver */
499a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	int vinmode, vinctl;
500a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
501a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	unsigned int has_audio_class:1;
502a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	unsigned int has_alsa_audio:1;
503a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
504a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	struct em28xx_fmt *format;
505a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy
506a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy	struct em28xx_IR *ir;
507d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas
508d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	/* Some older em28xx chips needs a waiting time after writing */
509d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	unsigned int wait_after_write;
510d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas
511d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas	struct list_head	devlist;
51208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy
51308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	u32 i2s_speed;		/* I2S speed for audio digital stream */
51408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy
51508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	struct em28xx_audio_mode audio_mode;
51628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten
51708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int tuner_type;		/* type of the tuner */
51808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int tuner_addr;		/* tuner address */
51908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int tda9887_conf;
52008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	/* i2c i/o */
52108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	struct i2c_adapter i2c_adap;
52208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	struct i2c_client i2c_client;
52308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	/* video for linux */
52408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int users;		/* user count for exclusive use */
52508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	struct video_device *vdev;	/* video for linux device struct */
52608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	v4l2_std_id norm;	/* selected tv norm */
5277812b16730ccebce71a3b2228ac08dd4f8b39469Wey-Yi Guy	int ctl_freq;		/* selected frequency */
5287812b16730ccebce71a3b2228ac08dd4f8b39469Wey-Yi Guy	unsigned int ctl_input;	/* selected input */
52908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	unsigned int ctl_ainput;/* selected audio input */
53008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	unsigned int ctl_aoutput;/* selected audio output */
53108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int mute;
53208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int volume;
53308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	/* frame properties */
53408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int width;		/* current frame width */
53508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int height;		/* current frame height */
53608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	unsigned hscale;	/* horizontal scale factor (see datasheet) */
53708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	unsigned vscale;	/* vertical scale factor (see datasheet) */
53808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int interlaced;		/* 1=interlace fileds, 0=just top fileds */
53908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	unsigned int video_bytesread;	/* Number of bytes read */
54008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy
54108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	unsigned long hash;	/* eeprom hash - for boards with generic ID */
54208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	unsigned long i2c_hash;	/* i2c devicelist hash -
54308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy				   for boards with generic ID */
54408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy
54508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	struct em28xx_audio adev;
54608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy
54708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	/* states */
54808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	enum em28xx_dev_state state;
54908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	enum em28xx_io_method io;
55008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy
55108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	/* vbi related state tracking */
55208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int capture_type;
55308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	int vbi_read;
55408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	unsigned char cur_field;
55508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy	unsigned int vbi_width;
556a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	unsigned int vbi_height; /* lines per field */
557a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
558a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct work_struct         request_module_wk;
559a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
56028f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten	/* locks */
561a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct mutex lock;
562a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct mutex ctrl_urb_lock;	/* protects urb_buf */
563a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	/* spinlock_t queue_lock; */
564a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct list_head inqueue, outqueue;
565a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	wait_queue_head_t open, wait_frame, wait_stream;
566a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct video_device *vbi_dev;
567a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct video_device *radio_dev;
568a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
569a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	/* resources in use */
570a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	unsigned int resources;
571a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
572a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	unsigned char eedata[256];
573a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
574a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	/* Isoc control struct */
575a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct em28xx_dmaqueue vidq;
576a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct em28xx_dmaqueue vbiq;
577a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct em28xx_usb_isoc_ctl isoc_ctl;
578a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	spinlock_t slock;
579a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
580a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	/* usb transfer */
581a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct usb_device *udev;	/* the usb device */
582a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int alt;		/* alternate */
583a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int max_pkt_size;	/* max packet size of isoc transaction */
584a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int num_alt;		/* Number of alternative settings */
585a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
586a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct urb *urb[EM28XX_NUM_BUFS];	/* urb for isoc transfers */
587a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	char *transfer_buffer[EM28XX_NUM_BUFS];	/* transfer buffers for isoc
588a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy						   transfer */
589a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	char urb_buf[URB_MAX_CTRL_SIZE];	/* urb control msg buffer */
590a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
591a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	/* helper funcs that call usb_control_msg */
592a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int (*em28xx_write_regs) (struct em28xx *dev, u16 reg,
593a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy					char *buf, int len);
594a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int (*em28xx_read_reg) (struct em28xx *dev, u16 reg);
595a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg,
596a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy					char *buf, int len);
597a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg,
598a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy				      char *buf, int len);
599a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg);
600a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
601a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	enum em28xx_mode mode;
602a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
603a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	/* register numbers for GPO/GPIO registers */
604a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	u16 reg_gpo_num, reg_gpio_num;
605a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
606a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	/* Caches GPO and GPIO registers */
607a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	unsigned char	reg_gpo, reg_gpio;
608a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
609a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	/* Snapshot button */
610a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	char snapshot_button_path[30];	/* path of the input dev */
611a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct input_dev *sbutton_input_dev;
612a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct delayed_work sbutton_query_work;
613a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
614a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct em28xx_dvb *dvb;
615a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
616a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	/* I2C keyboard data */
617a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct IR_i2c_init_data init_data;
618a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy};
619a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
620a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guystruct em28xx_ops {
621a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	struct list_head next;
622a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	char *name;
623a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int id;
624a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int (*init)(struct em28xx *);
625a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy	int (*fini)(struct em28xx *);
626a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy};
627a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
628a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy/* Provided by em28xx-i2c.c */
629a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyvoid em28xx_do_i2c_scan(struct em28xx *dev);
630a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint  em28xx_i2c_register(struct em28xx *dev);
631a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint  em28xx_i2c_unregister(struct em28xx *dev);
632a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
633a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy/* Provided by em28xx-core.c */
634a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
635a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyu32 em28xx_request_buffers(struct em28xx *dev, u32 count);
636a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyvoid em28xx_queue_unusedframes(struct em28xx *dev);
637a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyvoid em28xx_release_buffers(struct em28xx *dev);
638a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy
639a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
640a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy			    char *buf, int len);
641a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
642a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_read_reg(struct em28xx *dev, u16 reg);
643a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
644f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy			  int len);
645f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
646f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val);
64728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweetenint em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
648f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy				 u8 bitmask);
649f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy
650f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_read_ac97(struct em28xx *dev, u8 reg);
651f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val);
652f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy
653f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_audio_analog_set(struct em28xx *dev);
654f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_audio_setup(struct em28xx *dev);
655f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy
656f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_colorlevels_set_default(struct em28xx *dev);
657f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_capture_start(struct em28xx *dev, int start);
658f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_vbi_supported(struct em28xx *dev);
659f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_set_outfmt(struct em28xx *dev);
660f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_resolution_set(struct em28xx *dev);
661f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_set_alternate(struct em28xx *dev);
6624967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guyint em28xx_init_isoc(struct em28xx *dev, int max_packets,
663f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy		     int num_bufs, int max_pkt_size,
664a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy		     int (*isoc_copy) (struct em28xx *dev, struct urb *urb));
665a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_uninit_isoc(struct em28xx *dev);
666a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyint em28xx_isoc_dvb_max_packetsize(struct em28xx *dev);
667a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyint em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
66828f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweetenint em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
669a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_wake_i2c(struct em28xx *dev);
670a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_remove_from_devlist(struct em28xx *dev);
671a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_add_into_devlist(struct em28xx *dev);
672a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyint em28xx_register_extension(struct em28xx_ops *dev);
673a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_unregister_extension(struct em28xx_ops *dev);
674a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_init_extension(struct em28xx *dev);
675a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_close_extension(struct em28xx *dev);
676a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy
677a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy/* Provided by em28xx-video.c */
678a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyint em28xx_register_analog_devices(struct em28xx *dev);
679a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_release_analog_resources(struct em28xx *dev);
680a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy
681a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy/* Provided by em28xx-cards.c */
682a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern int em2800_variant_detect(struct usb_device *udev, int model);
683a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern void em28xx_pre_card_setup(struct em28xx *dev);
684a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern void em28xx_card_setup(struct em28xx *dev);
6854967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guyextern struct em28xx_board em28xx_boards[];
686a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern struct usb_device_id em28xx_id_table[];
687a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern const unsigned int em28xx_bcount;
688fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyvoid em28xx_register_i2c_ir(struct em28xx *dev);
689fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyint em28xx_tuner_callback(void *ptr, int component, int command, int arg);
690fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyvoid em28xx_release_resources(struct em28xx *dev);
691fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy
69228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten/* Provided by em28xx-input.c */
6933ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Bergint em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
694fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyint em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
695fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyint em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key,
696fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy				     u32 *ir_raw);
697fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyvoid em28xx_register_snapshot_button(struct em28xx *dev);
698fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyvoid em28xx_deregister_snapshot_button(struct em28xx *dev);
699fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy
700fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyint em28xx_ir_init(struct em28xx *dev);
7013ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Bergint em28xx_ir_fini(struct em28xx *dev);
702fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy
703fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy/* Provided by em28xx-vbi.c */
704fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyextern struct videobuf_queue_ops em28xx_vbi_qops;
7053ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg
706fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy/* printk macros */
707fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy
708fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy#define em28xx_err(fmt, arg...) do {\
709fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy	printk(KERN_ERR fmt , ##arg); } while (0)
710fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy
711fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy#define em28xx_errdev(fmt, arg...) do {\
712fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy	printk(KERN_ERR "%s: "fmt,\
713fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy			dev->name , ##arg); } while (0)
714fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy
715fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy#define em28xx_info(fmt, arg...) do {\
716fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy	printk(KERN_INFO "%s: "fmt,\
7174967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy			dev->name , ##arg); } while (0)
718fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy#define em28xx_warn(fmt, arg...) do {\
719fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy	printk(KERN_WARNING "%s: "fmt,\
7201e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy			dev->name , ##arg); } while (0)
7211e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy
7221e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_compression_disable(struct em28xx *dev)
7231e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{
7241e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy	/* side effect of disabling scaler and mixer */
7251e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy	return em28xx_write_reg(dev, EM28XX_R26_COMPR, 0x00);
7261e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy}
7271e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy
7281e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_contrast_get(struct em28xx *dev)
7291e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{
7301e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy	return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f;
7311e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy}
7321e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy
7331e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_brightness_get(struct em28xx *dev)
7341e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{
7351e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy	return em28xx_read_reg(dev, EM28XX_R21_YOFFSET);
7361e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy}
7371e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy
7381e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_saturation_get(struct em28xx *dev)
7391e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{
7401e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy	return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f;
7411e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy}
7421e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy
7431e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_u_balance_get(struct em28xx *dev)
7441e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{
7451e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy	return em28xx_read_reg(dev, EM28XX_R23_UOFFSET);
7461e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy}
7471e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy
7481e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_v_balance_get(struct em28xx *dev)
7491e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{
75028f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten	return em28xx_read_reg(dev, EM28XX_R24_VOFFSET);
7511e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy}
7521e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy
7531e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_gamma_get(struct em28xx *dev)
7541e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{
7551e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy	return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f;
7561e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy}
7571e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy
7584967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guystatic inline int em28xx_contrast_set(struct em28xx *dev, s32 val)
7591e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{
7601e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy	u8 tmp = (u8) val;
761e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1);
762e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg}
763e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
764e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_brightness_set(struct em28xx *dev, s32 val)
765e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{
766e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	u8 tmp = (u8) val;
767e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1);
768e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg}
769e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
770e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_saturation_set(struct em28xx *dev, s32 val)
771e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{
772e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	u8 tmp = (u8) val;
773e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1);
774e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg}
775e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
776e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_u_balance_set(struct em28xx *dev, s32 val)
777e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{
778e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	u8 tmp = (u8) val;
779e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1);
780e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg}
781e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
782e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_v_balance_set(struct em28xx *dev, s32 val)
7831a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre{
7841a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre	u8 tmp = (u8) val;
7851a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre	return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1);
786e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg}
787e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
788e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_gamma_set(struct em28xx *dev, s32 val)
789e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{
790e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	u8 tmp = (u8) val;
7914ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy	return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1);
7924ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy}
7934ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy
794e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg/*FIXME: maxw should be dependent of alt mode */
795e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline unsigned int norm_maxw(struct em28xx *dev)
796d3a571971e5af241074947fc80f6284677f6e014Reinette Chatre{
7974ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy	if (dev->board.is_webcam)
798d3a571971e5af241074947fc80f6284677f6e014Reinette Chatre		return dev->sensor_xres;
799e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
800e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	if (dev->board.max_range_640_480 || dev->board.is_em2800)
801e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg		return 640;
802e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
803e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	return 720;
804e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg}
805e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
806e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline unsigned int norm_maxh(struct em28xx *dev)
80728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten{
808e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	if (dev->board.is_webcam)
809e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg		return dev->sensor_yres;
810e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
811e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	if (dev->board.max_range_640_480)
812e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg		return 480;
813e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg
814e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg	return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
815e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg}
816e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg#endif
817e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg