em28xx.h revision 017ab4b1e2aa31dc9fe986ab6d1f5ffa2a84395b
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
100864ec0b7a03c8401e6e49f9e480489478ea14cb5Devin Heitmueller#define EM2874_BOARD_PINNACLE_PCTV_80E		  59
1013aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
1023aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* Limits minimum and default number of buffers */
1033aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_MIN_BUF 4
1043aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DEF_BUF 8
105a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
106c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab/*Limits the max URB message size */
107c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab#define URB_MAX_CTRL_SIZE 80
108c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab
10995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf/* Params for validated field */
11095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM28XX_BOARD_NOT_VALIDATED 1
11195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM28XX_BOARD_VALIDATED	   0
11295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf
113596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* maximum number of em28xx boards */
1143687e1e67e4920a202d53cc24678fb34fcda8fc5Mauro Carvalho Chehab#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */
115596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab
116a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* maximum number of frames that can be queued */
1173acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_FRAMES 5
118a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of frames that get used for v4l2_read() */
1193acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_READ_FRAMES 2
120a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
121a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of buffers for isoc transfers */
1223acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_BUFS 5
123a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
124d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab/* number of packets for each buffer
125d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab   windows requests only 40 packets .. so we better do the same
126d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab   this is what I found out for all alternate numbers there!
127d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab */
1283acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_PACKETS 40
129a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
130a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* default alternate; 0 means choose the best */
1313acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_PINOUT 0
132a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
1333acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_INTERLACED_DEFAULT 1
134a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
135a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/*
136a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define (use usbview if you want to get the other alternate number infos)
137a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define
138a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define alternate number 2
139a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define 			Endpoint Address: 82
140a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Direction: in
141a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Attribute: 1
142a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Type: Isoc
143a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Max Packet Size: 1448
144a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Interval: 125us
145a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
146a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton  alternate number 7
147a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
148a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Endpoint Address: 82
149a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Direction: in
150a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Attribute: 1
151a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Type: Isoc
152a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Max Packet Size: 3072
153a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			Interval: 125us
154a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton*/
155a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
156a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* time to wait when stopping the isoc transfer */
1573acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_URB_TIMEOUT       msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
158a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
159596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* time in msecs to wait for i2c writes to finish */
160596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab#define EM2800_I2C_WRITE_TIMEOUT 20
161596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab
1623aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehabenum em28xx_mode {
1632fe3e2ee72ef17daad1d3769321bb7dd69a003a9Mauro Carvalho Chehab	EM28XX_SUSPEND,
1643aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	EM28XX_ANALOG_MODE,
1653aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	EM28XX_DIGITAL_MODE,
1663aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab};
1673aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
1683acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_stream_state {
169a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	STREAM_OFF,
170a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	STREAM_INTERRUPT,
171a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	STREAM_ON,
172a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
173a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
174579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonstruct em28xx;
175579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
176ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_usb_isoc_ctl {
177ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* max packet size of isoc transaction */
178ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				max_pkt_size;
179ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
180ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* number of allocated urbs */
181ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				num_bufs;
182ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
183ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* urb for isoc transfers */
184ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct urb			**urb;
185ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
186ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* transfer buffers for isoc transfer */
187ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	char				**transfer_buffer;
188ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
189ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Last buffer command and region */
190ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	u8				cmd;
191ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				pos, size, pktsize;
192ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
193ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Last field: ODD or EVEN? */
194ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				field;
195ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
196ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Stores incomplete commands */
197ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	u32				tmp_buf;
198ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				tmp_buf_len;
199ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
200ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Stores already requested buffers */
201ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct em28xx_buffer    	*buf;
202ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
203ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab		/* Stores the number of received fields */
204ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int				nfields;
205579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
206579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton		/* isoc urb callback */
207579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton	int (*isoc_copy) (struct em28xx *dev, struct urb *urb);
208579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton
209ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab};
210ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
211ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_fmt {
212ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	char  *name;
213ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	u32   fourcc;          /* v4l2 format id */
214ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab};
215ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
216ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab/* buffer for one video frame */
217ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_buffer {
218ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	/* common v4l buffer stuff -- must be first */
219ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct videobuf_buffer vb;
220ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
221a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct list_head frame;
222a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int top_field;
223ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int receiving;
224ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab};
225ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
226ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_dmaqueue {
227ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct list_head       active;
228ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct list_head       queued;
229ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
230ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	wait_queue_head_t          wq;
231ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
232ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	/* Counters to control buffer fill */
233ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	int                        pos;
234a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
235a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
236a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* io methods */
2373acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_io_method {
238a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	IO_NONE,
239a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	IO_READ,
240a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	IO_MMAP,
241a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
242a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
243a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* inputs */
244a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
2453acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define MAX_EM28XX_INPUT 4
2463acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum enum28xx_itype {
2473acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE1 = 1,
2483acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE2,
2493acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE3,
2503acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_COMPOSITE4,
2513acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_SVIDEO,
2523acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_TELEVISION,
2533acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_CABLE,
2543acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_DVB,
2553acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_VMUX_DEBUG,
2563acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_RADIO,
257a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
258a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
25935643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehabenum em28xx_ac97_mode {
26035643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab	EM28XX_NO_AC97 = 0,
26135643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab	EM28XX_AC97_EM202,
262209acc02249d831e7f2e3d8083b6b562dde5fc6fMauro Carvalho Chehab	EM28XX_AC97_SIGMATEL,
26335643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab	EM28XX_AC97_OTHER,
26435643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab};
26535643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab
26635643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehabstruct em28xx_audio_mode {
26735643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab	enum em28xx_ac97_mode ac97;
26835643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab
26935643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab	u16 ac97_feat;
27016c7bcadff2222b297d13951dc30e133f56d0154Mauro Carvalho Chehab	u32 ac97_vendor_id;
27135643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab
27235643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab	unsigned int has_audio:1;
27335643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab
27435643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab	unsigned int i2s_3rates:1;
27535643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab	unsigned int i2s_5rates:1;
2765c2231c84304563fd5d28e8bbb72e09e882a8e32Devin Heitmueller};
2775c2231c84304563fd5d28e8bbb72e09e882a8e32Devin Heitmueller
2785faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab/* em28xx has two audio inputs: tuner and line in.
2795faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab   However, on most devices, an auxiliary AC97 codec device is used.
2805faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab   The AC97 device may have several different inputs and outputs,
2815faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab   depending on their model. So, it is possible to use AC97 mixer to
2825faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab   address more than two different entries.
2835faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab */
284539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehabenum em28xx_amux {
2855faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	/* This is the only entry for em28xx tuner input */
2865faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	EM28XX_AMUX_VIDEO,	/* em28xx tuner, AC97 mixer Video */
2875faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab
2885faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	EM28XX_AMUX_LINE_IN,	/* AC97 mixer Line In */
2895faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab
2905faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	/* Some less-common mixer setups */
2915faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	EM28XX_AMUX_VIDEO2,	/* em28xx Line in, AC97 mixer Video */
2925faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	EM28XX_AMUX_PHONE,
2935faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	EM28XX_AMUX_MIC,
2945faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	EM28XX_AMUX_CD,
2955faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	EM28XX_AMUX_AUX,
2965faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab	EM28XX_AMUX_PCM_OUT,
297539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab};
298539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab
29935ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehabenum em28xx_aout {
300e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab	EM28XX_AOUT_MASTER = 1 << 0,
301e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab	EM28XX_AOUT_LINE   = 1 << 1,
302e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab	EM28XX_AOUT_MONO   = 1 << 2,
303e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab	EM28XX_AOUT_LFE    = 1 << 3,
304e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab	EM28XX_AOUT_SURR   = 1 << 4,
30535ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehab};
30635ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehab
307122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehabstruct em28xx_reg_seq {
308122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab	int reg;
309122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab	unsigned char val, mask;
310122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab	int sleep;
311122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab};
312122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab
3133acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_input {
3143acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum enum28xx_itype type;
315a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int vmux;
316539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab	enum em28xx_amux amux;
31735ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehab	enum em28xx_aout aout;
318122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab	struct em28xx_reg_seq *gpio;
319a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
320a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
3213acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
322a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
3233acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_decoder {
3241ed1dd54b0456a880ab4090275a47eb5a7a245d1Devin Heitmueller	EM28XX_NODECODER,
3253acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	EM28XX_TVP5150,
326ec5de990d912c0d5cca98e030bf6447c1529f56dMauro Carvalho Chehab	EM28XX_SAA711X,
327a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
328a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
3293acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_board {
330a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	char *name;
331505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab	int vchannels;
332a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tuner_type;
33366767920e3e6532db8afe04f9b2d8e1a9e95cad9Mauro Carvalho Chehab	int tuner_addr;
334a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
335a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* i2c flags */
336a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int tda9887_conf;
337a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
338017ab4b1e2aa31dc9fe986ab6d1f5ffa2a84395bMauro Carvalho Chehab	/* GPIO sequences */
339122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab	struct em28xx_reg_seq *dvb_gpio;
3402fe3e2ee72ef17daad1d3769321bb7dd69a003a9Mauro Carvalho Chehab	struct em28xx_reg_seq *suspend_gpio;
341017ab4b1e2aa31dc9fe986ab6d1f5ffa2a84395bMauro Carvalho Chehab	struct em28xx_reg_seq *tuner_gpio;
342122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab
34374f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	unsigned int is_em2800:1;
344a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int has_msp34xx:1;
3455add9a6f3c90680f89b4694e81025d2aed9559afMauro Carvalho Chehab	unsigned int mts_firmware:1;
346c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	unsigned int max_range_640_480:1;
3473aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	unsigned int has_dvb:1;
348a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	unsigned int has_snapshot_button:1;
34995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf	unsigned int valid:1;
3503abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab
351a2070c665459ac37a36bebae5e97bb4a2568990eMauro Carvalho Chehab	unsigned char xclk, i2c_speed;
352a2070c665459ac37a36bebae5e97bb4a2568990eMauro Carvalho Chehab
3533acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_decoder decoder;
354a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
3553acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	struct em28xx_input       input[MAX_EM28XX_INPUT];
3560be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab	struct em28xx_input	  radio;
3574b92253acc723f365ad6b2f32e4118e38133b7b8Devin Heitmueller	IR_KEYTAB_TYPE            *ir_codes;
358a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
359a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
3603acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_eeprom {
361a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u32 id;			/* 0x9567eb1a */
362a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 vendor_ID;
363a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 product_ID;
364a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
365a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 chip_conf;
366a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
367a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 board_conf;
368a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
369a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u16 string1, string2, string3;
370a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
371a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 string_idx_table;
372a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
373a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
374a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* device states */
3753acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_dev_state {
376a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	DEV_INITIALIZED = 0x01,
377a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	DEV_DISCONNECTED = 0x02,
378a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	DEV_MISCONFIGURED = 0x04,
379a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
380a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
3816d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_BUFS 5
3826d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_NUM_AUDIO_PACKETS 64
3836d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */
3846d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_CAPTURE_STREAM_EN 1
3853aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
3863aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* em28xx extensions */
3876d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO   0x10
3883aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DVB     0x20
3896d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
3906d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_audio {
3916d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	char name[50];
3926d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	char *transfer_buffer[EM28XX_AUDIO_BUFS];
3936d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct urb *urb[EM28XX_AUDIO_BUFS];
3946d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct usb_device *udev;
3956d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	unsigned int capture_transfer_done;
3966d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct snd_pcm_substream   *capture_pcm_substream;
3976d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
3986d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	unsigned int hwptr_done_capture;
3996d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct snd_card            *sndcard;
4006d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
4016d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int users, shutdown;
4026d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	enum em28xx_stream_state capture_stream;
4036d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	spinlock_t slock;
4046d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab};
4056d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
40652284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx;
40752284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
40852284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx_fh {
40952284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	struct em28xx *dev;
41052284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	unsigned int  stream_on:1;	/* Locks streams */
41152284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	int           radio;
41252284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
41352284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	struct videobuf_queue        vb_vidq;
41452284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
41552284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab	enum v4l2_buf_type           type;
41652284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab};
41752284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab
418a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* main device struct */
4193acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx {
420a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* generic device properties */
421a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	char name[30];		/* name (including minor) of the device */
422a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int model;		/* index in the device_data struct */
423e5589befc472ca50882f37c4fb32333fc93a65b7Mauro Carvalho Chehab	int devno;		/* marks the number of this device */
424600bd7f0edee0f9687c3c77e6fe63c74452acbfaDevin Heitmueller	enum em28xx_chip_id chip_id;
425505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab
426505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab	struct em28xx_board board;
427505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab
428a225452ef80a7bd894fd2dfd01a4973d444152f4Mauro Carvalho Chehab	unsigned int stream_on:1;	/* Locks streams */
429d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab	unsigned int has_audio_class:1;
43024a613e4b08c4077b4c809bebab1d4a36d541fccDevin Heitmueller	unsigned int has_alsa_audio:1;
431a2070c665459ac37a36bebae5e97bb4a2568990eMauro Carvalho Chehab
432a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehab	struct em28xx_IR *ir;
433a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehab
43489b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab	/* Some older em28xx chips needs a waiting time after writing */
43589b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab	unsigned int wait_after_write;
43689b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab
43774f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab	struct list_head	devlist;
43874f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab
4399bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab	u32 i2s_speed;		/* I2S speed for audio digital stream */
4409bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab
44135643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab	struct em28xx_audio_mode audio_mode;
442a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
443a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tuner_type;		/* type of the tuner */
444a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tuner_addr;		/* tuner address */
445a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int tda9887_conf;
446a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* i2c i/o */
447a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct i2c_adapter i2c_adap;
448a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct i2c_client i2c_client;
449a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* video for linux */
450a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int users;		/* user count for exclusive use */
451a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct video_device *vdev;	/* video for linux device struct */
4527d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab	v4l2_std_id norm;	/* selected tv norm */
453a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int ctl_freq;		/* selected frequency */
454a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned int ctl_input;	/* selected input */
45595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf	unsigned int ctl_ainput;/* selected audio input */
45635ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehab	unsigned int ctl_aoutput;/* selected audio output */
457a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int mute;
458a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int volume;
459a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* frame properties */
460a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int width;		/* current frame width */
461a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int height;		/* current frame height */
462d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuil	unsigned hscale;	/* horizontal scale factor (see datasheet) */
463d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuil	unsigned vscale;	/* vertical scale factor (see datasheet) */
464a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int interlaced;		/* 1=interlace fileds, 0=just top fileds */
4659e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab	unsigned int video_bytesread;	/* Number of bytes read */
466a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
46703910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab	unsigned long hash;	/* eeprom hash - for boards with generic ID */
4686ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	unsigned long i2c_hash;	/* i2c devicelist hash -
4696ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf				   for boards with generic ID */
47003910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab
4716d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct em28xx_audio *adev;
4726d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
473a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* states */
4743acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_dev_state state;
4753acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	enum em28xx_io_method io;
4769e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab
477d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab	struct work_struct         request_module_wk;
478d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab
479a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* locks */
4805a80415bcabf2b59e8c34db6e743c54582cfd3c2Sascha Sommer	struct mutex lock;
481f2a2e4910502e866833732f31ee697d15b3e56fdMauro Carvalho Chehab	struct mutex ctrl_urb_lock;	/* protects urb_buf */
482d7aa80207babe694b316a48200b096cf0336ecb3Aidan Thornton	/* spinlock_t queue_lock; */
483a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct list_head inqueue, outqueue;
484a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	wait_queue_head_t open, wait_frame, wait_stream;
485a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct video_device *vbi_dev;
4860be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab	struct video_device *radio_dev;
487a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
488a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	unsigned char eedata[256];
489a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
490ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	/* Isoc control struct */
491ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct em28xx_dmaqueue vidq;
492ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	struct em28xx_usb_isoc_ctl isoc_ctl;
493ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab	spinlock_t slock;
494ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab
495a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* usb transfer */
496a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	struct usb_device *udev;	/* the usb device */
497a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int alt;		/* alternate */
498a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	int max_pkt_size;	/* max packet size of isoc transaction */
4999d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab	int num_alt;		/* Number of alternative settings */
5009d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
5013acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	struct urb *urb[EM28XX_NUM_BUFS];	/* urb for isoc transfers */
5023acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab	char *transfer_buffer[EM28XX_NUM_BUFS];	/* transfer buffers for isoc transfer */
503c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab	char urb_buf[URB_MAX_CTRL_SIZE];	/* urb control msg buffer */
504c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab
505a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* helper funcs that call usb_control_msg */
5066ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_write_regs) (struct em28xx *dev, u16 reg,
507a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton					char *buf, int len);
5086ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_read_reg) (struct em28xx *dev, u16 reg);
5096ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg,
5106ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf					char *buf, int len);
5116ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg,
512a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton				      char *buf, int len);
5136ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf	int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg);
5143aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
5153aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab	enum em28xx_mode mode;
5163aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab
5176a1acc3bc5144e004996029b20e46e6020d128a7Devin Heitmueller	/* register numbers for GPO/GPIO registers */
5186a1acc3bc5144e004996029b20e46e6020d128a7Devin Heitmueller	u16 reg_gpo_num, reg_gpio_num;
5196a1acc3bc5144e004996029b20e46e6020d128a7Devin Heitmueller
520c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab	/* Caches GPO and GPIO registers */
521c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab	unsigned char	reg_gpo, reg_gpio;
522c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab
523a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	/* Snapshot button */
524a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	char snapshot_button_path[30];	/* path of the input dev */
525a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	struct input_dev *sbutton_input_dev;
526a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller	struct delayed_work sbutton_query_work;
527a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller
5283421b7787a2cf41ac5edce9b5766bddd1e1d9986Aidan Thornton	struct em28xx_dvb *dvb;
529a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton};
530a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5316d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_ops {
5326d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	struct list_head next;
5336d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	char *name;
5346d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int id;
5356d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int (*init)(struct em28xx *);
5366d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab	int (*fini)(struct em28xx *);
537a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab};
538a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab
5393acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-i2c.c */
540a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5413acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg);
542fad7b958e753e18ff443786360f7846da50a3085Sascha Sommervoid em28xx_do_i2c_scan(struct em28xx *dev);
5433acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_i2c_register(struct em28xx *dev);
5443acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_i2c_unregister(struct em28xx *dev);
545a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5463acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-core.c */
547a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5483acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabu32 em28xx_request_buffers(struct em28xx *dev, u32 count);
5493acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_queue_unusedframes(struct em28xx *dev);
5503acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_release_buffers(struct em28xx *dev);
551a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
5523acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
553a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			    char *buf, int len);
5543acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
5553acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg(struct em28xx *dev, u16 reg);
5563acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
557a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton			  int len);
5583acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
559b69724899440289ab258ff417c2d6aa104c70310Devin Heitmuellerint em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val);
560b69724899440289ab258ff417c2d6aa104c70310Devin Heitmueller
5613acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_audio_analog_set(struct em28xx *dev);
56235643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehabint em28xx_audio_setup(struct em28xx *dev);
563539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab
5643acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_colorlevels_set_default(struct em28xx *dev);
5653acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_capture_start(struct em28xx *dev, int start);
5663acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_outfmt_set_yuv422(struct em28xx *dev);
5673acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_resolution_set(struct em28xx *dev);
5683acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_set_alternate(struct em28xx *dev);
569579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonint em28xx_init_isoc(struct em28xx *dev, int max_packets,
570579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton		     int num_bufs, int max_pkt_size,
571c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab		     int (*isoc_copy) (struct em28xx *dev, struct urb *urb));
572579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonvoid em28xx_uninit_isoc(struct em28xx *dev);
573c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehabint em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
574c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehabint em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
5753acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab
5766d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab/* Provided by em28xx-video.c */
5776d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabint em28xx_register_extension(struct em28xx_ops *dev);
5786d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabvoid em28xx_unregister_extension(struct em28xx_ops *dev);
5796d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab
5803acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-cards.c */
5816ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafextern int em2800_variant_detect(struct usb_device *udev, int model);
582a94e95b443811c127734ef10f3b7d2220532c1d2Markus Rechbergerextern void em28xx_pre_card_setup(struct em28xx *dev);
5833acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern void em28xx_card_setup(struct em28xx *dev);
5843acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct em28xx_board em28xx_boards[];
5853acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct usb_device_id em28xx_id_table[];
5863acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern const unsigned int em28xx_bcount;
587c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabvoid em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir);
588d7cba043d7ec840d67bd5143779d1febe7d83407Michael Krufkyint em28xx_tuner_callback(void *ptr, int component, int command, int arg);
589c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab
590c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab/* Provided by em28xx-input.c */
591c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
592c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
593c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key,
594c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab				     u32 *ir_raw);
595a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmuellervoid em28xx_register_snapshot_button(struct em28xx *dev);
596a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmuellervoid em28xx_deregister_snapshot_button(struct em28xx *dev);
597a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
598a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehabint em28xx_ir_init(struct em28xx *dev);
599a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehabint em28xx_ir_fini(struct em28xx *dev);
600a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehab
601a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* printk macros */
602a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6033acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_err(fmt, arg...) do {\
604f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare	printk(KERN_ERR fmt , ##arg); } while (0)
605a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6063acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_errdev(fmt, arg...) do {\
6074ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab	printk(KERN_ERR "%s: "fmt,\
608f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare			dev->name , ##arg); } while (0)
609a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6103acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_info(fmt, arg...) do {\
6114ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab	printk(KERN_INFO "%s: "fmt,\
612f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare			dev->name , ##arg); } while (0)
6133acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_warn(fmt, arg...) do {\
6144ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab	printk(KERN_WARNING "%s: "fmt,\
615f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare			dev->name , ##arg); } while (0)
616a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6176ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_compression_disable(struct em28xx *dev)
618a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
619a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	/* side effect of disabling scaler and mixer */
6202a29a0d770ef6f24a8fd7806655c826d45888cbaMauro Carvalho Chehab	return em28xx_write_reg(dev, EM28XX_R26_COMPR, 0x00);
621a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
622a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6236ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_get(struct em28xx *dev)
624a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
62541facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f;
626a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
627a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6286ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_get(struct em28xx *dev)
629a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
63041facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R21_YOFFSET);
631a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
632a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6336ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_get(struct em28xx *dev)
634a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
63541facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f;
636a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
637a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6386ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_get(struct em28xx *dev)
639a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
64041facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R23_UOFFSET);
641a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
642a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6436ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_get(struct em28xx *dev)
644a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
64541facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R24_VOFFSET);
646a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
647a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6486ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_get(struct em28xx *dev)
649a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
65041facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f;
651a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
652a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6536ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_set(struct em28xx *dev, s32 val)
654a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
655a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
65641facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1);
657a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
658a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6596ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_set(struct em28xx *dev, s32 val)
660a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
661a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
66241facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1);
663a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
664a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6656ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_set(struct em28xx *dev, s32 val)
666a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
667a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
66841facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1);
669a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
670a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6716ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_set(struct em28xx *dev, s32 val)
672a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
673a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
67441facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1);
675a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
676a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6776ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_set(struct em28xx *dev, s32 val)
678a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
679a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
68041facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1);
681a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
682a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
6836ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_set(struct em28xx *dev, s32 val)
684a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
685a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton	u8 tmp = (u8) val;
68641facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab	return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1);
687a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
688a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton
689a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/*FIXME: maxw should be dependent of alt mode */
6906ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxw(struct em28xx *dev)
69130556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger{
692505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab	if (dev->board.max_range_640_480)
6937d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return 640;
694c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	else
6957d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return 720;
69630556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger}
69730556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger
6986ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxh(struct em28xx *dev)
699a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{
700505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab	if (dev->board.max_range_640_480)
7017d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return 480;
702c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab	else
7037d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab		return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
704a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}
705a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#endif
706