blob: 50aa5a5317f236ca1e6344b7194361cb2518cee6 [file] [log] [blame]
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001/*
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002 em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
3 video capture devices
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08004
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -08005 Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
6 Markus Rechberger <mrechberger@gmail.com>
Mauro Carvalho Chehab2e7c6dc2006-04-03 07:53:40 -03007 Mauro Carvalho Chehab <mchehab@infradead.org>
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -08008 Sascha Sommer <saschasommer@freenet.de>
Frank Schaeferc647a912012-11-08 14:11:52 -03009 Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080010
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 */
25
26#include <linux/init.h>
27#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090028#include <linux/slab.h>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080029#include <linux/delay.h>
30#include <linux/i2c.h>
31#include <linux/usb.h>
32#include <media/tuner.h>
Hans Verkuil2474ed42006-03-19 12:35:57 -030033#include <media/msp3400.h>
Hans Verkuilc7c0b342006-04-02 13:35:00 -030034#include <media/saa7115.h>
35#include <media/tvp5150.h>
Douglas Schilling Landgraff2cf2502009-03-31 17:10:58 -030036#include <media/tvaudio.h>
37#include <media/i2c-addr.h>
Mauro Carvalho Chehab1f6173e2005-11-08 21:37:16 -080038#include <media/tveeprom.h>
Mauro Carvalho Chehab9bb13a62006-01-09 15:25:37 -020039#include <media/v4l2-common.h>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080040
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -080041#include "em28xx.h"
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080042
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -030043#define DRIVER_NAME "em28xx"
44
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -030045static int tuner = -1;
46module_param(tuner, int, 0444);
47MODULE_PARM_DESC(tuner, "tuner type");
48
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -030049static unsigned int disable_ir;
50module_param(disable_ir, int, 0444);
51MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
52
Devin Heitmuellere2a1b792009-05-27 23:44:10 -030053static unsigned int disable_usb_speed_check;
54module_param(disable_usb_speed_check, int, 0444);
55MODULE_PARM_DESC(disable_usb_speed_check,
56 "override min bandwidth requirement of 480M bps");
57
Devin Heitmuellerd3829fa2013-01-04 16:16:24 -030058static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -030059module_param_array(card, int, NULL, 0444);
60MODULE_PARM_DESC(card, "card type");
61
Frank Schaefer7e5d74e2012-12-26 15:12:37 -030062static int usb_xfer_mode = -1;
63module_param(usb_xfer_mode, int, 0444);
64MODULE_PARM_DESC(usb_xfer_mode,
65 "USB transfer mode for frame data (-1 = auto, 0 = prefer isoc, 1 = prefer bulk)");
Frank Schaefer454fe922012-11-08 14:11:53 -030066
67
Chris Rankin38b61eb2011-08-20 08:21:03 -030068/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */
Fengguang Wu9e8ca382014-01-15 18:50:26 -030069static DECLARE_BITMAP(em28xx_devused, EM28XX_MAXBOARDS);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -030070
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -030071struct em28xx_hash_table {
72 unsigned long hash;
73 unsigned int model;
74 unsigned int tuner;
75};
76
Ezequiel Garcia60332f02012-04-28 09:57:01 -030077static void em28xx_pre_card_setup(struct em28xx *dev);
78
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -030079/*
80 * Reset sequences for analog/digital modes
81 */
82
83/* Reset for the most [analog] boards */
84static struct em28xx_reg_seq default_analog[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -030085 {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -030086 { -1, -1, -1, -1},
87};
88
89/* Reset for the most [digital] boards */
90static struct em28xx_reg_seq default_digital[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -030091 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -030092 { -1, -1, -1, -1},
93};
94
95/* Board Hauppauge WinTV HVR 900 analog */
96static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -030097 {EM2820_R08_GPIO_CTRL, 0x2d, ~EM_GPIO_4, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -030098 { 0x05, 0xff, 0x10, 10},
99 { -1, -1, -1, -1},
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300100};
101
102/* Board Hauppauge WinTV HVR 900 digital */
103static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300104 {EM2820_R08_GPIO_CTRL, 0x2e, ~EM_GPIO_4, 10},
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300105 {EM2880_R04_GPO, 0x04, 0x0f, 10},
106 {EM2880_R04_GPO, 0x0c, 0x0f, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300107 { -1, -1, -1, -1},
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300108};
109
Devin Heitmueller7030f522011-03-13 02:04:53 -0300110/* Board Hauppauge WinTV HVR 900 (R2) digital */
111static struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300112 {EM2820_R08_GPIO_CTRL, 0x2e, ~EM_GPIO_4, 10},
Devin Heitmueller7030f522011-03-13 02:04:53 -0300113 {EM2880_R04_GPO, 0x0c, 0x0f, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300114 { -1, -1, -1, -1},
Devin Heitmueller7030f522011-03-13 02:04:53 -0300115};
116
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300117/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
118static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300119 {EM2820_R08_GPIO_CTRL, 0x69, ~EM_GPIO_4, 10},
120 { -1, -1, -1, -1},
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300121};
122
123/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300124
125/* Board - EM2870 Kworld 355u
126 Analog - No input analog */
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300127
Franklin Mengd7de5d82009-06-06 17:05:02 -0300128/* Board - EM2882 Kworld 315U digital */
129static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300130 {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
131 {EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 10},
Franklin Mengd7de5d82009-06-06 17:05:02 -0300132 {EM2880_R04_GPO, 0x04, 0xff, 10},
133 {EM2880_R04_GPO, 0x0c, 0xff, 10},
Frank Schaeferc074fc42013-06-03 14:12:03 -0300134 {EM2820_R08_GPIO_CTRL, 0x7e, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300135 { -1, -1, -1, -1},
Franklin Mengd7de5d82009-06-06 17:05:02 -0300136};
137
138static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
139 {EM2880_R04_GPO, 0x08, 0xff, 10},
140 {EM2880_R04_GPO, 0x0c, 0xff, 10},
141 {EM2880_R04_GPO, 0x08, 0xff, 10},
142 {EM2880_R04_GPO, 0x0c, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300143 { -1, -1, -1, -1},
Franklin Mengd7de5d82009-06-06 17:05:02 -0300144};
145
Robert Krakora6e7b9ea2009-01-18 21:59:34 -0300146static struct em28xx_reg_seq kworld_330u_analog[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300147 {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
Robert Krakora6e7b9ea2009-01-18 21:59:34 -0300148 {EM2880_R04_GPO, 0x00, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300149 { -1, -1, -1, -1},
Robert Krakora6e7b9ea2009-01-18 21:59:34 -0300150};
151
152static struct em28xx_reg_seq kworld_330u_digital[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300153 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
Robert Krakora6e7b9ea2009-01-18 21:59:34 -0300154 {EM2880_R04_GPO, 0x08, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300155 { -1, -1, -1, -1},
Robert Krakora6e7b9ea2009-01-18 21:59:34 -0300156};
157
Devin Heitmueller19859222009-06-19 00:33:54 -0300158/* Evga inDtube
159 GPIO0 - Enable digital power (s5h1409) - low to enable
160 GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
161 GPIO4 - xc3028 reset
162 GOP3 - s5h1409 reset
163 */
164static struct em28xx_reg_seq evga_indtube_analog[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300165 {EM2820_R08_GPIO_CTRL, 0x79, 0xff, 60},
Devin Heitmueller19859222009-06-19 00:33:54 -0300166 { -1, -1, -1, -1},
167};
168
169static struct em28xx_reg_seq evga_indtube_digital[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300170 {EM2820_R08_GPIO_CTRL, 0x7a, 0xff, 1},
Devin Heitmueller19859222009-06-19 00:33:54 -0300171 {EM2880_R04_GPO, 0x04, 0xff, 10},
172 {EM2880_R04_GPO, 0x0c, 0xff, 1},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300173 { -1, -1, -1, -1},
Devin Heitmueller19859222009-06-19 00:33:54 -0300174};
175
Jarod Wilson7e48b302010-03-07 17:55:43 -0300176/*
Jean-Francois Thibert6dbea9f2013-10-09 11:18:05 -0300177 * KWorld PlusTV 340U, UB435-Q and UB435-Q V2 (ATSC) GPIOs map:
Jarod Wilson7e48b302010-03-07 17:55:43 -0300178 * EM_GPIO_0 - currently unknown
179 * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
180 * EM_GPIO_2 - currently unknown
181 * EM_GPIO_3 - currently unknown
182 * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
183 * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
184 * EM_GPIO_6 - currently unknown
185 * EM_GPIO_7 - currently unknown
186 */
187static struct em28xx_reg_seq kworld_a340_digital[] = {
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300188 {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
189 { -1, -1, -1, -1},
Jarod Wilson7e48b302010-03-07 17:55:43 -0300190};
191
Mauro Carvalho Chehab02bc1f52014-03-03 16:28:39 -0300192static struct em28xx_reg_seq kworld_ub435q_v3_digital[] = {
193 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 100},
194 {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 100},
195 {EM2874_R80_GPIO_P0_CTRL, 0xbe, 0xff, 100},
196 {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 100},
197 { -1, -1, -1, -1},
198};
199
Devin Heitmuellerd5b3ba92009-07-08 21:51:35 -0300200/* Pinnacle Hybrid Pro eb1a:2881 */
201static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300202 {EM2820_R08_GPIO_CTRL, 0xfd, ~EM_GPIO_4, 10},
Devin Heitmuellerd5b3ba92009-07-08 21:51:35 -0300203 { -1, -1, -1, -1},
204};
205
206static struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300207 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
Devin Heitmuellerd5b3ba92009-07-08 21:51:35 -0300208 {EM2880_R04_GPO, 0x04, 0xff, 100},/* zl10353 reset */
209 {EM2880_R04_GPO, 0x0c, 0xff, 1},
210 { -1, -1, -1, -1},
211};
212
Michel Garniercec4e6c2010-10-16 14:42:01 -0300213static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300214 {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
Michel Garniercec4e6c2010-10-16 14:42:01 -0300215 {EM2880_R04_GPO, 0x00, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300216 { -1, -1, -1, -1},
Michel Garniercec4e6c2010-10-16 14:42:01 -0300217};
218
219static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300220 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
Michel Garniercec4e6c2010-10-16 14:42:01 -0300221 {EM2880_R04_GPO, 0x08, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300222 { -1, -1, -1, -1},
Michel Garniercec4e6c2010-10-16 14:42:01 -0300223};
224
Devin Heitmueller38b2df92012-08-13 21:18:02 -0300225/* PCTV HD Mini (80e) GPIOs
226 0-5: not used
227 6: demod reset, active low
228 7: LED on, active high */
229static struct em28xx_reg_seq em2874_pctv_80e_digital[] = {
230 {EM28XX_R06_I2C_CLK, 0x45, 0xff, 10}, /*400 KHz*/
Mauro Carvalho Chehab88e4fcda2014-03-04 20:49:07 -0300231 {EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 100},/*Demod reset*/
232 {EM2874_R80_GPIO_P0_CTRL, 0x40, 0xff, 10},
Devin Heitmueller38b2df92012-08-13 21:18:02 -0300233 { -1, -1, -1, -1},
234};
235
Antti Palosaari285eb1a2009-09-15 14:42:13 -0300236/* eb1a:2868 Reddo DVB-C USB TV Box
237 GPIO4 - CU1216L NIM
238 Other GPIOs seems to be don't care. */
239static struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300240 {EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 10},
241 {EM2820_R08_GPIO_CTRL, 0xde, 0xff, 10},
242 {EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 10},
243 {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
244 {EM2820_R08_GPIO_CTRL, 0x7f, 0xff, 10},
245 {EM2820_R08_GPIO_CTRL, 0x6f, 0xff, 10},
246 {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300247 { -1, -1, -1, -1},
Antti Palosaari285eb1a2009-09-15 14:42:13 -0300248};
Devin Heitmuellerd5b3ba92009-07-08 21:51:35 -0300249
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300250/* Callback for the most boards */
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300251static struct em28xx_reg_seq default_tuner_gpio[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300252 {EM2820_R08_GPIO_CTRL, EM_GPIO_4, EM_GPIO_4, 10},
253 {EM2820_R08_GPIO_CTRL, 0, EM_GPIO_4, 10},
254 {EM2820_R08_GPIO_CTRL, EM_GPIO_4, EM_GPIO_4, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300255 { -1, -1, -1, -1},
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300256};
257
Vitaly Wool2bd1d9e2009-03-04 08:27:52 -0300258/* Mute/unmute */
259static struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300260 {EM2820_R08_GPIO_CTRL, 5, 7, 10},
261 { -1, -1, -1, -1},
Vitaly Wool2bd1d9e2009-03-04 08:27:52 -0300262};
263
264static struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300265 {EM2820_R08_GPIO_CTRL, 4, 7, 10},
266 { -1, -1, -1, -1},
Vitaly Wool2bd1d9e2009-03-04 08:27:52 -0300267};
268
269static struct em28xx_reg_seq compro_mute_gpio[] = {
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300270 {EM2820_R08_GPIO_CTRL, 6, 7, 10},
271 { -1, -1, -1, -1},
Vitaly Wool2bd1d9e2009-03-04 08:27:52 -0300272};
273
Mauro Carvalho Chehab766ed642009-05-24 00:46:01 -0300274/* Terratec AV350 */
275static struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300276 {EM2820_R08_GPIO_CTRL, 0xff, 0x7f, 10},
Mauro Carvalho Chehab766ed642009-05-24 00:46:01 -0300277 { -1, -1, -1, -1},
278};
279
280static struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300281 {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
Mauro Carvalho Chehab766ed642009-05-24 00:46:01 -0300282 { -1, -1, -1, -1},
283};
Mauro Carvalho Chehab02e78042009-06-29 11:35:05 -0300284
285static struct em28xx_reg_seq silvercrest_reg_seq[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300286 {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
287 {EM2820_R08_GPIO_CTRL, 0x01, 0xf7, 10},
Mauro Carvalho Chehab02e78042009-06-29 11:35:05 -0300288 { -1, -1, -1, -1},
289};
290
Mauro Carvalho Chehab694a1012009-11-26 21:26:13 -0300291static struct em28xx_reg_seq vc211a_enable[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300292 {EM2820_R08_GPIO_CTRL, 0xff, 0x07, 10},
293 {EM2820_R08_GPIO_CTRL, 0xff, 0x0f, 10},
294 {EM2820_R08_GPIO_CTRL, 0xff, 0x0b, 10},
Mauro Carvalho Chehab694a1012009-11-26 21:26:13 -0300295 { -1, -1, -1, -1},
296};
297
Andrea.Amorosi76@gmail.com7ca7ef62010-02-09 17:53:38 -0300298static struct em28xx_reg_seq dikom_dk300_digital[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300299 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
Andrea.Amorosi76@gmail.com7ca7ef62010-02-09 17:53:38 -0300300 {EM2880_R04_GPO, 0x08, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300301 { -1, -1, -1, -1},
Andrea.Amorosi76@gmail.com7ca7ef62010-02-09 17:53:38 -0300302};
303
Mauro Carvalho Chehab694a1012009-11-26 21:26:13 -0300304
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -0300305/* Reset for the most [digital] boards */
306static struct em28xx_reg_seq leadership_digital[] = {
Frank Schaefer907d1092013-06-03 14:12:02 -0300307 {EM2874_R80_GPIO_P0_CTRL, 0x70, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300308 { -1, -1, -1, -1},
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -0300309};
310
311static struct em28xx_reg_seq leadership_reset[] = {
Frank Schaefer907d1092013-06-03 14:12:02 -0300312 {EM2874_R80_GPIO_P0_CTRL, 0xf0, 0xff, 10},
313 {EM2874_R80_GPIO_P0_CTRL, 0xb0, 0xff, 10},
314 {EM2874_R80_GPIO_P0_CTRL, 0xf0, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300315 { -1, -1, -1, -1},
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -0300316};
317
Antti Palosaari460312e2011-05-25 17:03:50 -0300318/* 2013:024f PCTV nanoStick T2 290e
Antti Palosaarid6a5f922011-04-07 16:34:44 -0300319 * GPIO_6 - demod reset
320 * GPIO_7 - LED
321 */
322static struct em28xx_reg_seq pctv_290e[] = {
Frank Schaefer907d1092013-06-03 14:12:02 -0300323 {EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 80},
324 {EM2874_R80_GPIO_P0_CTRL, 0x40, 0xff, 80}, /* GPIO_6 = 1 */
325 {EM2874_R80_GPIO_P0_CTRL, 0xc0, 0xff, 80}, /* GPIO_7 = 1 */
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300326 { -1, -1, -1, -1},
Antti Palosaarid6a5f922011-04-07 16:34:44 -0300327};
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -0300328
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -0300329#if 0
330static struct em28xx_reg_seq terratec_h5_gpio[] = {
Frank Schaeferc074fc42013-06-03 14:12:03 -0300331 {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
Frank Schaefer907d1092013-06-03 14:12:02 -0300332 {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 100},
333 {EM2874_R80_GPIO_P0_CTRL, 0xf2, 0xff, 50},
334 {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 50},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300335 { -1, -1, -1, -1},
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -0300336};
337
338static struct em28xx_reg_seq terratec_h5_digital[] = {
Frank Schaefer907d1092013-06-03 14:12:02 -0300339 {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 10},
340 {EM2874_R80_GPIO_P0_CTRL, 0xe6, 0xff, 100},
341 {EM2874_R80_GPIO_P0_CTRL, 0xa6, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300342 { -1, -1, -1, -1},
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -0300343};
344#endif
345
Antti Palosaari36588712011-08-01 01:15:30 -0300346/* 2013:024f PCTV DVB-S2 Stick 460e
347 * GPIO_0 - POWER_ON
348 * GPIO_1 - BOOST
349 * GPIO_2 - VUV_LNB (red LED)
350 * GPIO_3 - EXT_12V
351 * GPIO_4 - INT_DEM (DEMOD GPIO_0)
352 * GPIO_5 - INT_LNB
353 * GPIO_6 - RESET_DEM
354 * GPIO_7 - LED (green LED)
355 */
356static struct em28xx_reg_seq pctv_460e[] = {
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300357 {EM2874_R80_GPIO_P0_CTRL, 0x01, 0xff, 50},
358 { 0x0d, 0xff, 0xff, 50},
359 {EM2874_R80_GPIO_P0_CTRL, 0x41, 0xff, 50}, /* GPIO_6=1 */
360 { 0x0d, 0x42, 0xff, 50},
361 {EM2874_R80_GPIO_P0_CTRL, 0x61, 0xff, 50}, /* GPIO_5=1 */
362 { -1, -1, -1, -1},
Antti Palosaari36588712011-08-01 01:15:30 -0300363};
364
Mauro Carvalho Chehab4159d012013-02-28 10:35:56 -0300365static struct em28xx_reg_seq c3tech_digital_duo_digital[] = {
Frank Schaefer907d1092013-06-03 14:12:02 -0300366 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 10},
367 {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10}, /* xc5000 reset */
368 {EM2874_R80_GPIO_P0_CTRL, 0xf9, 0xff, 35},
369 {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10},
370 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 10},
371 {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 10},
372 {EM2874_R80_GPIO_P0_CTRL, 0xbe, 0xff, 10},
373 {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 20},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300374 { -1, -1, -1, -1},
Mauro Carvalho Chehab4159d012013-02-28 10:35:56 -0300375};
376
Antti Palosaariec573362013-02-25 09:01:13 -0300377/*
378 * 2013:0258 PCTV DVB-S2 Stick (461e)
379 * GPIO 0 = POWER_ON
380 * GPIO 1 = BOOST
381 * GPIO 2 = VUV_LNB (red LED)
382 * GPIO 3 = #EXT_12V
383 * GPIO 4 = INT_DEM
384 * GPIO 5 = INT_LNB
385 * GPIO 6 = #RESET_DEM
386 * GPIO 7 = P07_LED (green LED)
387 */
388static struct em28xx_reg_seq pctv_461e[] = {
389 {EM2874_R80_GPIO_P0_CTRL, 0x7f, 0xff, 0},
390 {0x0d, 0xff, 0xff, 0},
391 {EM2874_R80_GPIO_P0_CTRL, 0x3f, 0xff, 100}, /* reset demod */
392 {EM2874_R80_GPIO_P0_CTRL, 0x7f, 0xff, 200}, /* reset demod */
393 {0x0d, 0x42, 0xff, 0},
394 {EM2874_R80_GPIO_P0_CTRL, 0xeb, 0xff, 0},
395 {EM2874_R5F_TS_ENABLE, 0x84, 0x84, 0}, /* parallel? | null discard */
396 { -1, -1, -1, -1},
397};
398
Mauro Carvalho Chehab85032322011-11-24 15:01:45 -0200399#if 0
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -0300400static struct em28xx_reg_seq hauppauge_930c_gpio[] = {
Frank Schaefer907d1092013-06-03 14:12:02 -0300401 {EM2874_R80_GPIO_P0_CTRL, 0x6f, 0xff, 10},
402 {EM2874_R80_GPIO_P0_CTRL, 0x4f, 0xff, 10}, /* xc5000 reset */
403 {EM2874_R80_GPIO_P0_CTRL, 0x6f, 0xff, 10},
404 {EM2874_R80_GPIO_P0_CTRL, 0x4f, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300405 { -1, -1, -1, -1},
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -0300406};
407
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -0300408static struct em28xx_reg_seq hauppauge_930c_digital[] = {
Frank Schaefer907d1092013-06-03 14:12:02 -0300409 {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 10},
410 {EM2874_R80_GPIO_P0_CTRL, 0xe6, 0xff, 100},
411 {EM2874_R80_GPIO_P0_CTRL, 0xa6, 0xff, 10},
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300412 { -1, -1, -1, -1},
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -0300413};
414#endif
415
Antti Palosaari35530852012-03-18 18:09:01 -0300416/* 1b80:e425 MaxMedia UB425-TC
Jakob Haufe7c1dfdb2013-04-13 11:03:37 -0300417 * 1b80:e1cc Delock 61959
Antti Palosaari35530852012-03-18 18:09:01 -0300418 * GPIO_6 - demod reset, 0=active
419 * GPIO_7 - LED, 0=active
420 */
421static struct em28xx_reg_seq maxmedia_ub425_tc[] = {
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300422 {EM2874_R80_GPIO_P0_CTRL, 0x83, 0xff, 100},
423 {EM2874_R80_GPIO_P0_CTRL, 0xc3, 0xff, 100}, /* GPIO_6 = 1 */
424 {EM2874_R80_GPIO_P0_CTRL, 0x43, 0xff, 000}, /* GPIO_7 = 0 */
425 { -1, -1, -1, -1},
Antti Palosaari35530852012-03-18 18:09:01 -0300426};
427
Ivan Kalvachevfa5527c2012-03-19 20:09:55 -0300428/* 2304:0242 PCTV QuatroStick (510e)
429 * GPIO_2: decoder reset, 0=active
430 * GPIO_4: decoder suspend, 0=active
431 * GPIO_6: demod reset, 0=active
432 * GPIO_7: LED, 1=active
433 */
434static struct em28xx_reg_seq pctv_510e[] = {
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300435 {EM2874_R80_GPIO_P0_CTRL, 0x10, 0xff, 100},
436 {EM2874_R80_GPIO_P0_CTRL, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
437 {EM2874_R80_GPIO_P0_CTRL, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
438 { -1, -1, -1, -1},
Ivan Kalvachevfa5527c2012-03-19 20:09:55 -0300439};
440
Antti Palosaaric247d7b2012-03-19 11:48:19 -0300441/* 2013:0251 PCTV QuatroStick nano (520e)
442 * GPIO_2: decoder reset, 0=active
443 * GPIO_4: decoder suspend, 0=active
444 * GPIO_6: demod reset, 0=active
445 * GPIO_7: LED, 1=active
446 */
447static struct em28xx_reg_seq pctv_520e[] = {
Frank Schaeferb68cafc2013-10-10 14:36:30 -0300448 {EM2874_R80_GPIO_P0_CTRL, 0x10, 0xff, 100},
449 {EM2874_R80_GPIO_P0_CTRL, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
450 {EM2874_R80_GPIO_P0_CTRL, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
451 {EM2874_R80_GPIO_P0_CTRL, 0xd4, 0xff, 000}, /* GPIO_7 = 1 */
452 { -1, -1, -1, -1},
Antti Palosaaric247d7b2012-03-19 11:48:19 -0300453};
454
Frank Schaefer0c37e732013-12-01 18:06:57 -0300455/* 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
456 * reg 0x80/0x84:
457 * GPIO_0: capturing LED, 0=on, 1=off
458 * GPIO_2: AV mute button, 0=pressed, 1=unpressed
459 * GPIO 3: illumination button, 0=pressed, 1=unpressed
460 * GPIO_6: illumination/flash LED, 0=on, 1=off
461 * reg 0x81/0x85:
462 * GPIO_7: snapshot button, 0=pressed, 1=unpressed
463 */
464static struct em28xx_reg_seq speedlink_vad_laplace_reg_seq[] = {
465 {EM2820_R08_GPIO_CTRL, 0xf7, 0xff, 10},
466 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xb2, 10},
467 { -1, -1, -1, -1},
468};
469
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300470/*
Frank Schaeferf52226092013-12-01 18:06:52 -0300471 * Button definitions
472 */
473static struct em28xx_button std_snapshot_button[] = {
474 {
475 .role = EM28XX_BUTTON_SNAPSHOT,
476 .reg_r = EM28XX_R0C_USBSUSP,
477 .reg_clearing = EM28XX_R0C_USBSUSP,
478 .mask = EM28XX_R0C_USBSUSP_SNAPSHOT,
479 .inverted = 0,
480 },
481 {-1, 0, 0, 0, 0},
482};
483
Frank Schaefer0c37e732013-12-01 18:06:57 -0300484static struct em28xx_button speedlink_vad_laplace_buttons[] = {
485 {
486 .role = EM28XX_BUTTON_SNAPSHOT,
487 .reg_r = EM2874_R85_GPIO_P1_STATE,
488 .mask = 0x80,
489 .inverted = 1,
490 },
491 {
492 .role = EM28XX_BUTTON_ILLUMINATION,
493 .reg_r = EM2874_R84_GPIO_P0_STATE,
494 .mask = 0x08,
495 .inverted = 1,
496 },
497 {-1, 0, 0, 0, 0},
498};
499
500/*
501 * LED definitions
502 */
503static struct em28xx_led speedlink_vad_laplace_leds[] = {
504 {
505 .role = EM28XX_LED_ANALOG_CAPTURING,
506 .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
507 .gpio_mask = 0x01,
508 .inverted = 1,
509 },
510 {
511 .role = EM28XX_LED_ILLUMINATION,
512 .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
513 .gpio_mask = 0x40,
514 .inverted = 1,
515 },
516 {-1, 0, 0, 0},
517};
518
Mauro Carvalho Chehab59432be2014-03-04 12:34:34 -0300519static struct em28xx_led kworld_ub435q_v3_leds[] = {
520 {
521 .role = EM28XX_LED_DIGITAL_CAPTURING,
522 .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
523 .gpio_mask = 0x80,
524 .inverted = 1,
525 },
526 {-1, 0, 0, 0},
527};
528
Mauro Carvalho Chehab88e4fcda2014-03-04 20:49:07 -0300529static struct em28xx_led pctv_80e_leds[] = {
530 {
531 .role = EM28XX_LED_DIGITAL_CAPTURING,
532 .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
533 .gpio_mask = 0x80,
534 .inverted = 0,
535 },
536 {-1, 0, 0, 0},
537};
538
Mauro Carvalho Chehab59432be2014-03-04 12:34:34 -0300539
Frank Schaeferf52226092013-12-01 18:06:52 -0300540/*
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300541 * Board definitions
542 */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800543struct em28xx_board em28xx_boards[] = {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300544 [EM2750_BOARD_UNKNOWN] = {
Mauro Carvalho Chehab8b220792009-07-12 10:56:21 -0300545 .name = "EM2710/EM2750/EM2751 webcam grabber",
Mauro Carvalho Chehab3d3215c2009-08-10 10:29:27 -0300546 .xclk = EM28XX_XCLK_FREQUENCY_20MHZ,
Mauro Carvalho Chehab8a2e6992009-07-12 10:26:36 -0300547 .tuner_type = TUNER_ABSENT,
548 .is_webcam = 1,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300549 .input = { {
550 .type = EM28XX_VMUX_COMPOSITE1,
551 .vmux = 0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300552 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabb80fd2d2009-07-14 21:08:22 -0300553 .gpio = silvercrest_reg_seq,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300554 } },
555 },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800556 [EM2800_BOARD_UNKNOWN] = {
557 .name = "Unknown EM2800 video grabber",
558 .is_em2800 = 1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800559 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300560 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300561 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300562 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800563 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300564 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300565 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300566 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800567 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300568 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300569 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300570 } },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800571 },
572 [EM2820_BOARD_UNKNOWN] = {
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -0300573 .name = "Unknown EM2750/28xx video grabber",
574 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabb04fb662009-07-13 01:28:21 -0300575 .is_webcam = 1, /* To enable sensor probe */
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800576 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300577 [EM2750_BOARD_DLCW_130] = {
578 /* Beijing Huaqi Information Digital Technology Co., Ltd */
579 .name = "Huaqi DLCW-130",
580 .valid = EM28XX_BOARD_NOT_VALIDATED,
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -0300581 .xclk = EM28XX_XCLK_FREQUENCY_48MHZ,
Mauro Carvalho Chehab8a2e6992009-07-12 10:26:36 -0300582 .tuner_type = TUNER_ABSENT,
583 .is_webcam = 1,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300584 .input = { {
585 .type = EM28XX_VMUX_COMPOSITE1,
586 .vmux = 0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300587 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300588 } },
589 },
Markus Rechberger4d17d082006-02-07 06:25:39 -0200590 [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
Markus Rechberger33ccaa32006-02-07 06:25:41 -0200591 .name = "Kworld PVR TV 2800 RF",
Mauro Carvalho Chehabed086312008-01-24 06:59:20 -0300592 .tuner_type = TUNER_TEMIC_PAL,
Markus Rechberger4d17d082006-02-07 06:25:39 -0200593 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300594 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300595 .input = { {
Markus Rechberger4d17d082006-02-07 06:25:39 -0200596 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300597 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300598 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300599 }, {
Markus Rechberger4d17d082006-02-07 06:25:39 -0200600 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300601 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300602 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300603 } },
Markus Rechberger4d17d082006-02-07 06:25:39 -0200604 },
Douglas Schilling Landgraff7fe3e62009-01-19 09:31:55 -0300605 [EM2820_BOARD_GADMEI_TVR200] = {
606 .name = "Gadmei TVR200",
607 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
608 .tda9887_conf = TDA9887_PRESENT,
609 .decoder = EM28XX_SAA711X,
610 .input = { {
611 .type = EM28XX_VMUX_TELEVISION,
612 .vmux = SAA7115_COMPOSITE2,
613 .amux = EM28XX_AMUX_LINE_IN,
614 }, {
615 .type = EM28XX_VMUX_COMPOSITE1,
616 .vmux = SAA7115_COMPOSITE0,
617 .amux = EM28XX_AMUX_LINE_IN,
618 }, {
619 .type = EM28XX_VMUX_SVIDEO,
620 .vmux = SAA7115_SVIDEO3,
621 .amux = EM28XX_AMUX_LINE_IN,
622 } },
623 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800624 [EM2820_BOARD_TERRATEC_CINERGY_250] = {
625 .name = "Terratec Cinergy 250 USB",
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800626 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
Mauro Carvalho Chehabac07bb72009-09-08 14:04:41 -0300627 .has_ir_i2c = 1,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800628 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300629 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300630 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800631 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300632 .vmux = SAA7115_COMPOSITE2,
Frank Schaefer5e8d02b2013-01-05 08:44:09 -0300633 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300634 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800635 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300636 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300637 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300638 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800639 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300640 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300641 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300642 } },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800643 },
644 [EM2820_BOARD_PINNACLE_USB_2] = {
645 .name = "Pinnacle PCTV USB 2",
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800646 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
Mauro Carvalho Chehabac07bb72009-09-08 14:04:41 -0300647 .has_ir_i2c = 1,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800648 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300649 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300650 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800651 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300652 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300653 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300654 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800655 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300656 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300657 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300658 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800659 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300660 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300661 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300662 } },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800663 },
664 [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
665 .name = "Hauppauge WinTV USB 2",
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800666 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300667 .tda9887_conf = TDA9887_PRESENT |
Nicola Soranzoa1a6ee72009-02-10 23:28:24 -0300668 TDA9887_PORT1_ACTIVE |
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300669 TDA9887_PORT2_ACTIVE,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800670 .decoder = EM28XX_TVP5150,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800671 .has_msp34xx = 1,
Mauro Carvalho Chehabac07bb72009-09-08 14:04:41 -0300672 .has_ir_i2c = 1,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300673 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800674 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300675 .vmux = TVP5150_COMPOSITE0,
Hans Verkuil2474ed42006-03-19 12:35:57 -0300676 .amux = MSP_INPUT_DEFAULT,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300677 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800678 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300679 .vmux = TVP5150_SVIDEO,
Hans Verkuil07151722006-04-01 18:03:23 -0300680 .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
681 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300682 } },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800683 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300684 [EM2820_BOARD_DLINK_USB_TV] = {
685 .name = "D-Link DUB-T210 TV Tuner",
686 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300687 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
688 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300689 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300690 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300691 .type = EM28XX_VMUX_TELEVISION,
692 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300693 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300694 }, {
695 .type = EM28XX_VMUX_COMPOSITE1,
696 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300697 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300698 }, {
699 .type = EM28XX_VMUX_SVIDEO,
700 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300701 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300702 } },
703 },
704 [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
705 .name = "Hercules Smart TV USB 2.0",
706 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300707 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
708 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300709 .decoder = EM28XX_SAA711X,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300710 .input = { {
711 .type = EM28XX_VMUX_TELEVISION,
712 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300713 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300714 }, {
715 .type = EM28XX_VMUX_COMPOSITE1,
716 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300717 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300718 }, {
719 .type = EM28XX_VMUX_SVIDEO,
720 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300721 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300722 } },
723 },
724 [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
725 .name = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
726 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300727 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
728 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300729 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300730 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300731 .type = EM28XX_VMUX_TELEVISION,
732 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300733 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300734 }, {
735 .type = EM28XX_VMUX_COMPOSITE1,
736 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300737 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300738 }, {
739 .type = EM28XX_VMUX_SVIDEO,
740 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300741 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300742 } },
743 },
744 [EM2820_BOARD_GADMEI_UTV310] = {
745 .name = "Gadmei UTV310",
746 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300747 .tuner_type = TUNER_TNF_5335MF,
748 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300749 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300750 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300751 .type = EM28XX_VMUX_TELEVISION,
752 .vmux = SAA7115_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300753 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300754 }, {
755 .type = EM28XX_VMUX_COMPOSITE1,
756 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300757 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300758 }, {
759 .type = EM28XX_VMUX_SVIDEO,
760 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300761 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300762 } },
763 },
764 [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
765 .name = "Leadtek Winfast USB II Deluxe",
766 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300767 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
Magnus Almca39d842009-11-13 05:48:24 -0300768 .has_ir_i2c = 1,
769 .tvaudio_addr = 0x58,
770 .tda9887_conf = TDA9887_PRESENT |
771 TDA9887_PORT2_ACTIVE |
772 TDA9887_QSS,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300773 .decoder = EM28XX_SAA711X,
Magnus Almca39d842009-11-13 05:48:24 -0300774 .adecoder = EM28XX_TVAUDIO,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300775 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300776 .type = EM28XX_VMUX_TELEVISION,
Magnus Almca39d842009-11-13 05:48:24 -0300777 .vmux = SAA7115_COMPOSITE4,
778 .amux = EM28XX_AMUX_AUX,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300779 }, {
780 .type = EM28XX_VMUX_COMPOSITE1,
Magnus Almca39d842009-11-13 05:48:24 -0300781 .vmux = SAA7115_COMPOSITE5,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300782 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300783 }, {
784 .type = EM28XX_VMUX_SVIDEO,
Magnus Almca39d842009-11-13 05:48:24 -0300785 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300786 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300787 } },
Magnus Almca39d842009-11-13 05:48:24 -0300788 .radio = {
789 .type = EM28XX_RADIO,
790 .amux = EM28XX_AMUX_AUX,
791 }
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300792 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300793 [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300794 .name = "Videology 20K14XUSB USB2.0",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300795 .valid = EM28XX_BOARD_NOT_VALIDATED,
Mauro Carvalho Chehab8a2e6992009-07-12 10:26:36 -0300796 .tuner_type = TUNER_ABSENT,
797 .is_webcam = 1,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300798 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300799 .type = EM28XX_VMUX_COMPOSITE1,
800 .vmux = 0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300801 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300802 } },
803 },
Mauro Carvalho Chehab02e78042009-06-29 11:35:05 -0300804 [EM2820_BOARD_SILVERCREST_WEBCAM] = {
805 .name = "Silvercrest Webcam 1.3mpix",
806 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabc43221d2009-07-12 10:23:23 -0300807 .is_webcam = 1,
Mauro Carvalho Chehab02e78042009-06-29 11:35:05 -0300808 .input = { {
809 .type = EM28XX_VMUX_COMPOSITE1,
810 .vmux = 0,
811 .amux = EM28XX_AMUX_VIDEO,
812 .gpio = silvercrest_reg_seq,
813 } },
814 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300815 [EM2821_BOARD_SUPERCOMP_USB_2] = {
816 .name = "Supercomp USB 2.0 TV",
817 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300818 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
819 .tda9887_conf = TDA9887_PRESENT |
820 TDA9887_PORT1_ACTIVE |
821 TDA9887_PORT2_ACTIVE,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300822 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300823 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300824 .type = EM28XX_VMUX_TELEVISION,
825 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300826 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300827 }, {
828 .type = EM28XX_VMUX_COMPOSITE1,
829 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300830 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300831 }, {
832 .type = EM28XX_VMUX_SVIDEO,
833 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300834 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300835 } },
836 },
837 [EM2821_BOARD_USBGEAR_VD204] = {
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300838 .name = "Usbgear VD204v9",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300839 .valid = EM28XX_BOARD_NOT_VALIDATED,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300840 .tuner_type = TUNER_ABSENT, /* Capture only device */
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300841 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300842 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300843 .type = EM28XX_VMUX_COMPOSITE1,
844 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300845 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300846 }, {
847 .type = EM28XX_VMUX_SVIDEO,
848 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300849 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300850 } },
851 },
852 [EM2860_BOARD_NETGMBH_CAM] = {
853 /* Beijing Huaqi Information Digital Technology Co., Ltd */
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300854 .name = "NetGMBH Cam",
855 .valid = EM28XX_BOARD_NOT_VALIDATED,
Mauro Carvalho Chehab8a2e6992009-07-12 10:26:36 -0300856 .tuner_type = TUNER_ABSENT,
857 .is_webcam = 1,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300858 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300859 .type = EM28XX_VMUX_COMPOSITE1,
860 .vmux = 0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300861 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300862 } },
863 },
864 [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300865 .name = "Typhoon DVD Maker",
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300866 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300867 .tuner_type = TUNER_ABSENT, /* Capture only device */
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300868 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300869 .type = EM28XX_VMUX_COMPOSITE1,
870 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300871 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300872 }, {
873 .type = EM28XX_VMUX_SVIDEO,
874 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300875 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300876 } },
877 },
878 [EM2860_BOARD_GADMEI_UTV330] = {
879 .name = "Gadmei UTV330",
880 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300881 .tuner_type = TUNER_TNF_5335MF,
882 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300883 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300884 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300885 .type = EM28XX_VMUX_TELEVISION,
886 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300887 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300888 }, {
889 .type = EM28XX_VMUX_COMPOSITE1,
890 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300891 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300892 }, {
893 .type = EM28XX_VMUX_SVIDEO,
894 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300895 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300896 } },
897 },
Mauro Carvalho Chehab6d888a62009-08-30 13:05:56 -0300898 [EM2861_BOARD_GADMEI_UTV330PLUS] = {
899 .name = "Gadmei UTV330+",
900 .tuner_type = TUNER_TNF_5335MF,
901 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -0300902 .ir_codes = RC_MAP_GADMEI_RM008Z,
Mauro Carvalho Chehab6d888a62009-08-30 13:05:56 -0300903 .decoder = EM28XX_SAA711X,
904 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
905 .input = { {
906 .type = EM28XX_VMUX_TELEVISION,
907 .vmux = SAA7115_COMPOSITE2,
908 .amux = EM28XX_AMUX_VIDEO,
909 }, {
910 .type = EM28XX_VMUX_COMPOSITE1,
911 .vmux = SAA7115_COMPOSITE0,
912 .amux = EM28XX_AMUX_LINE_IN,
913 }, {
914 .type = EM28XX_VMUX_SVIDEO,
915 .vmux = SAA7115_SVIDEO3,
916 .amux = EM28XX_AMUX_LINE_IN,
917 } },
918 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300919 [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
920 .name = "Terratec Cinergy A Hybrid XS",
921 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300922 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300923 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300924 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300925
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300926 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300927 .type = EM28XX_VMUX_TELEVISION,
928 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300929 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300930 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300931 }, {
932 .type = EM28XX_VMUX_COMPOSITE1,
933 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300934 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300935 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300936 }, {
937 .type = EM28XX_VMUX_SVIDEO,
938 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300939 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300940 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300941 } },
942 },
943 [EM2861_BOARD_KWORLD_PVRTV_300U] = {
944 .name = "KWorld PVRTV 300U",
945 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300946 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300947 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300948 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300949 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300950 .type = EM28XX_VMUX_TELEVISION,
951 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300952 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300953 }, {
954 .type = EM28XX_VMUX_COMPOSITE1,
955 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300956 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300957 }, {
958 .type = EM28XX_VMUX_SVIDEO,
959 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300960 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300961 } },
962 },
963 [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
964 .name = "Yakumo MovieMixer",
Nicola Soranzoa1a6ee72009-02-10 23:28:24 -0300965 .tuner_type = TUNER_ABSENT, /* Capture only device */
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300966 .decoder = EM28XX_TVP5150,
967 .input = { {
968 .type = EM28XX_VMUX_TELEVISION,
969 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300970 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300971 }, {
972 .type = EM28XX_VMUX_COMPOSITE1,
973 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300974 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300975 }, {
976 .type = EM28XX_VMUX_SVIDEO,
977 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300978 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300979 } },
980 },
Devin Heitmueller443fed92010-03-19 23:53:12 -0300981 [EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = {
982 .name = "EM2860/TVP5150 Reference Design",
983 .tuner_type = TUNER_ABSENT, /* Capture only device */
984 .decoder = EM28XX_TVP5150,
985 .input = { {
986 .type = EM28XX_VMUX_COMPOSITE1,
987 .vmux = TVP5150_COMPOSITE1,
988 .amux = EM28XX_AMUX_LINE_IN,
989 }, {
990 .type = EM28XX_VMUX_SVIDEO,
991 .vmux = TVP5150_SVIDEO,
992 .amux = EM28XX_AMUX_LINE_IN,
993 } },
994 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300995 [EM2861_BOARD_PLEXTOR_PX_TV100U] = {
996 .name = "Plextor ConvertX PX-TV100U",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300997 .tuner_type = TUNER_TNF_5335MF,
Mauro Carvalho Chehab0a6e44d2009-07-29 01:39:12 -0300998 .xclk = EM28XX_XCLK_I2S_MSB_TIMING |
999 EM28XX_XCLK_FREQUENCY_12MHZ,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001000 .tda9887_conf = TDA9887_PRESENT,
1001 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehab0a6e44d2009-07-29 01:39:12 -03001002 .has_msp34xx = 1,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001003 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001004 .type = EM28XX_VMUX_TELEVISION,
1005 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001006 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab0a6e44d2009-07-29 01:39:12 -03001007 .gpio = pinnacle_hybrid_pro_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001008 }, {
1009 .type = EM28XX_VMUX_COMPOSITE1,
1010 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001011 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab0a6e44d2009-07-29 01:39:12 -03001012 .gpio = pinnacle_hybrid_pro_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001013 }, {
1014 .type = EM28XX_VMUX_SVIDEO,
1015 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001016 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab0a6e44d2009-07-29 01:39:12 -03001017 .gpio = pinnacle_hybrid_pro_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001018 } },
1019 },
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -03001020
1021 /* Those boards with em2870 are DVB Only*/
1022
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001023 [EM2870_BOARD_TERRATEC_XS] = {
1024 .name = "Terratec Cinergy T XS",
1025 .valid = EM28XX_BOARD_NOT_VALIDATED,
1026 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001027 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001028 },
1029 [EM2870_BOARD_TERRATEC_XS_MT2060] = {
1030 .name = "Terratec Cinergy T XS (MT2060)",
1031 .valid = EM28XX_BOARD_NOT_VALIDATED,
1032 .tuner_type = TUNER_ABSENT, /* MT2060 */
1033 },
1034 [EM2870_BOARD_KWORLD_350U] = {
1035 .name = "Kworld 350 U DVB-T",
1036 .valid = EM28XX_BOARD_NOT_VALIDATED,
1037 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001038 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001039 },
1040 [EM2870_BOARD_KWORLD_355U] = {
1041 .name = "Kworld 355 U DVB-T",
1042 .valid = EM28XX_BOARD_NOT_VALIDATED,
Aivar Päkk1985f6f2011-12-11 18:15:00 -03001043 .tuner_type = TUNER_ABSENT,
1044 .tuner_gpio = default_tuner_gpio,
1045 .has_dvb = 1,
1046 .dvb_gpio = default_digital,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001047 },
1048 [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
1049 .name = "Pinnacle PCTV DVB-T",
1050 .valid = EM28XX_BOARD_NOT_VALIDATED,
1051 .tuner_type = TUNER_ABSENT, /* MT2060 */
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -03001052 /* djh - I have serious doubts this is right... */
1053 .xclk = EM28XX_XCLK_IR_RC5_MODE |
1054 EM28XX_XCLK_FREQUENCY_10MHZ,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001055 },
1056 [EM2870_BOARD_COMPRO_VIDEOMATE] = {
1057 .name = "Compro, VideoMate U3",
1058 .valid = EM28XX_BOARD_NOT_VALIDATED,
1059 .tuner_type = TUNER_ABSENT, /* MT2060 */
1060 },
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -03001061
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001062 [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
1063 .name = "Terratec Hybrid XS Secam",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001064 .has_msp34xx = 1,
1065 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001066 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001067 .decoder = EM28XX_TVP5150,
Catimimi65638012010-02-18 18:06:32 -03001068 .has_dvb = 1,
Michel Garniercec4e6c2010-10-16 14:42:01 -03001069 .dvb_gpio = terratec_cinergy_USB_XS_FR_digital,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001070 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001071 .type = EM28XX_VMUX_TELEVISION,
1072 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001073 .amux = EM28XX_AMUX_VIDEO,
Michel Garniercec4e6c2010-10-16 14:42:01 -03001074 .gpio = terratec_cinergy_USB_XS_FR_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001075 }, {
1076 .type = EM28XX_VMUX_COMPOSITE1,
1077 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001078 .amux = EM28XX_AMUX_LINE_IN,
Michel Garniercec4e6c2010-10-16 14:42:01 -03001079 .gpio = terratec_cinergy_USB_XS_FR_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001080 }, {
1081 .type = EM28XX_VMUX_SVIDEO,
1082 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001083 .amux = EM28XX_AMUX_LINE_IN,
Michel Garniercec4e6c2010-10-16 14:42:01 -03001084 .gpio = terratec_cinergy_USB_XS_FR_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001085 } },
1086 },
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -03001087 [EM2884_BOARD_TERRATEC_H5] = {
1088 .name = "Terratec Cinergy H5",
1089 .has_dvb = 1,
1090#if 0
1091 .tuner_type = TUNER_PHILIPS_TDA8290,
1092 .tuner_addr = 0x41,
1093 .dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */
1094 .tuner_gpio = terratec_h5_gpio,
Mauro Carvalho Chehabde724052011-11-20 11:23:24 -02001095#else
1096 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -03001097#endif
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03001098 .def_i2c_bus = 1,
1099 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -03001100 EM28XX_I2C_FREQ_400_KHZ,
1101 },
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -03001102 [EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
1103 .name = "Hauppauge WinTV HVR 930C",
1104 .has_dvb = 1,
Mauro Carvalho Chehabde724052011-11-20 11:23:24 -02001105#if 0 /* FIXME: Add analog support */
1106 .tuner_type = TUNER_XC5000,
1107 .tuner_addr = 0x41,
1108 .dvb_gpio = hauppauge_930c_digital,
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -03001109 .tuner_gpio = hauppauge_930c_gpio,
Mauro Carvalho Chehabde724052011-11-20 11:23:24 -02001110#else
1111 .tuner_type = TUNER_ABSENT,
1112#endif
Mauro Carvalho Chehabdfbbf5d2011-11-20 12:16:25 -02001113 .ir_codes = RC_MAP_HAUPPAUGE,
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03001114 .def_i2c_bus = 1,
1115 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -03001116 EM28XX_I2C_FREQ_400_KHZ,
1117 },
Mauro Carvalho Chehab4159d012013-02-28 10:35:56 -03001118 [EM2884_BOARD_C3TECH_DIGITAL_DUO] = {
1119 .name = "C3 Tech Digital Duo HDTV/SDTV USB",
1120 .has_dvb = 1,
1121 /* FIXME: Add analog support - need a saa7136 driver */
1122 .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
1123 .ir_codes = RC_MAP_EMPTY,
1124 .def_i2c_bus = 1,
1125 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
1126 .dvb_gpio = c3tech_digital_duo_digital,
1127 },
Andreas Oberrittera1ed02e2011-11-16 11:06:50 -03001128 [EM2884_BOARD_CINERGY_HTC_STICK] = {
1129 .name = "Terratec Cinergy HTC Stick",
1130 .has_dvb = 1,
Martin Blumenstinglc8dce002012-06-12 18:19:28 -03001131 .ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
1132 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03001133 .def_i2c_bus = 1,
1134 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001135 EM28XX_I2C_FREQ_400_KHZ,
1136 },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001137 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
Aidan Thornton122d1582007-11-20 15:25:08 -03001138 .name = "Hauppauge WinTV HVR 900",
Aidan Thornton122d1582007-11-20 15:25:08 -03001139 .tda9887_conf = TDA9887_PRESENT,
1140 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001141 .tuner_gpio = default_tuner_gpio,
Mauro Carvalho Chehab5add9a62007-11-22 12:08:53 -03001142 .mts_firmware = 1,
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -03001143 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001144 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Mauro Carvalho Chehabaf86ce72011-01-24 12:18:48 -03001145 .ir_codes = RC_MAP_HAUPPAUGE,
Aidan Thornton122d1582007-11-20 15:25:08 -03001146 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001147 .input = { {
Aidan Thornton122d1582007-11-20 15:25:08 -03001148 .type = EM28XX_VMUX_TELEVISION,
1149 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001150 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001151 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001152 }, {
Aidan Thornton122d1582007-11-20 15:25:08 -03001153 .type = EM28XX_VMUX_COMPOSITE1,
1154 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001155 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001156 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001157 }, {
Aidan Thornton122d1582007-11-20 15:25:08 -03001158 .type = EM28XX_VMUX_SVIDEO,
1159 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001160 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001161 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001162 } },
Aidan Thornton122d1582007-11-20 15:25:08 -03001163 },
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001164 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
1165 .name = "Hauppauge WinTV HVR 900 (R2)",
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001166 .tda9887_conf = TDA9887_PRESENT,
1167 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001168 .tuner_gpio = default_tuner_gpio,
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001169 .mts_firmware = 1,
Devin Heitmueller75e2b862011-03-13 02:01:02 -03001170 .has_dvb = 1,
Devin Heitmueller7030f522011-03-13 02:04:53 -03001171 .dvb_gpio = hauppauge_wintv_hvr_900R2_digital,
Mauro Carvalho Chehabaf86ce72011-01-24 12:18:48 -03001172 .ir_codes = RC_MAP_HAUPPAUGE,
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001173 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001174 .input = { {
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001175 .type = EM28XX_VMUX_TELEVISION,
1176 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001177 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001178 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001179 }, {
1180 .type = EM28XX_VMUX_COMPOSITE1,
1181 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehaba5942b52008-11-27 07:44:00 -03001182 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001183 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001184 }, {
1185 .type = EM28XX_VMUX_SVIDEO,
1186 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001187 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001188 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001189 } },
1190 },
Douglas Schilling Landgraff89bc322008-12-01 21:01:04 -03001191 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
1192 .name = "Hauppauge WinTV HVR 850",
1193 .tuner_type = TUNER_XC2028,
1194 .tuner_gpio = default_tuner_gpio,
1195 .mts_firmware = 1,
1196 .has_dvb = 1,
1197 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Mauro Carvalho Chehabaf86ce72011-01-24 12:18:48 -03001198 .ir_codes = RC_MAP_HAUPPAUGE,
Douglas Schilling Landgraff89bc322008-12-01 21:01:04 -03001199 .decoder = EM28XX_TVP5150,
1200 .input = { {
1201 .type = EM28XX_VMUX_TELEVISION,
1202 .vmux = TVP5150_COMPOSITE0,
1203 .amux = EM28XX_AMUX_VIDEO,
1204 .gpio = hauppauge_wintv_hvr_900_analog,
1205 }, {
1206 .type = EM28XX_VMUX_COMPOSITE1,
1207 .vmux = TVP5150_COMPOSITE1,
1208 .amux = EM28XX_AMUX_LINE_IN,
1209 .gpio = hauppauge_wintv_hvr_900_analog,
1210 }, {
1211 .type = EM28XX_VMUX_SVIDEO,
1212 .vmux = TVP5150_SVIDEO,
1213 .amux = EM28XX_AMUX_LINE_IN,
1214 .gpio = hauppauge_wintv_hvr_900_analog,
1215 } },
1216 },
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03001217 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
Mauro Carvalho Chehab3abee532008-01-05 17:01:41 -03001218 .name = "Hauppauge WinTV HVR 950",
Mauro Carvalho Chehab3abee532008-01-05 17:01:41 -03001219 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001220 .tuner_gpio = default_tuner_gpio,
Mauro Carvalho Chehab3abee532008-01-05 17:01:41 -03001221 .mts_firmware = 1,
Mauro Carvalho Chehab227ad4a2008-04-17 21:37:40 -03001222 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001223 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Mauro Carvalho Chehab15195d32011-01-24 12:18:47 -03001224 .ir_codes = RC_MAP_HAUPPAUGE,
Mauro Carvalho Chehab3abee532008-01-05 17:01:41 -03001225 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001226 .input = { {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001227 .type = EM28XX_VMUX_TELEVISION,
1228 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001229 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001230 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001231 }, {
Mauro Carvalho Chehab7d070e22007-11-01 21:52:58 -03001232 .type = EM28XX_VMUX_COMPOSITE1,
1233 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001234 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001235 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001236 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001237 .type = EM28XX_VMUX_SVIDEO,
1238 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001239 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001240 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001241 } },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001242 },
Devin Heitmueller4fd305b2008-06-04 13:43:46 -03001243 [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
1244 .name = "Pinnacle PCTV HD Pro Stick",
Devin Heitmueller4fd305b2008-06-04 13:43:46 -03001245 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001246 .tuner_gpio = default_tuner_gpio,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -03001247 .mts_firmware = 1,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -03001248 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001249 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -03001250 .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -03001251 .decoder = EM28XX_TVP5150,
1252 .input = { {
1253 .type = EM28XX_VMUX_TELEVISION,
1254 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001255 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001256 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -03001257 }, {
1258 .type = EM28XX_VMUX_COMPOSITE1,
1259 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001260 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001261 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -03001262 }, {
1263 .type = EM28XX_VMUX_SVIDEO,
1264 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001265 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001266 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -03001267 } },
1268 },
Devin Heitmuellere14b3652008-07-26 11:04:33 -03001269 [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
1270 .name = "AMD ATI TV Wonder HD 600",
Devin Heitmuellere14b3652008-07-26 11:04:33 -03001271 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001272 .tuner_gpio = default_tuner_gpio,
Devin Heitmuellere14b3652008-07-26 11:04:33 -03001273 .mts_firmware = 1,
Devin Heitmuellere14b3652008-07-26 11:04:33 -03001274 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001275 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -03001276 .ir_codes = RC_MAP_ATI_TV_WONDER_HD_600,
Devin Heitmuellere14b3652008-07-26 11:04:33 -03001277 .decoder = EM28XX_TVP5150,
1278 .input = { {
1279 .type = EM28XX_VMUX_TELEVISION,
1280 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001281 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001282 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmuellere14b3652008-07-26 11:04:33 -03001283 }, {
1284 .type = EM28XX_VMUX_COMPOSITE1,
1285 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001286 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001287 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmuellere14b3652008-07-26 11:04:33 -03001288 }, {
1289 .type = EM28XX_VMUX_SVIDEO,
1290 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001291 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001292 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmuellere14b3652008-07-26 11:04:33 -03001293 } },
1294 },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001295 [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001296 .name = "Terratec Hybrid XS",
1297 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001298 .tuner_gpio = default_tuner_gpio,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001299 .decoder = EM28XX_TVP5150,
reinhard schwab655b8402008-07-26 10:47:00 -03001300 .has_dvb = 1,
Devin Heitmuellerf7976082009-06-22 22:32:32 -03001301 .dvb_gpio = default_digital,
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -03001302 .ir_codes = RC_MAP_TERRATEC_CINERGY_XS,
Devin Heitmueller8cd9aae2009-08-03 23:56:51 -03001303 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001304 .input = { {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001305 .type = EM28XX_VMUX_TELEVISION,
1306 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001307 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001308 .gpio = default_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001309 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001310 .type = EM28XX_VMUX_COMPOSITE1,
1311 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001312 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001313 .gpio = default_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001314 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001315 .type = EM28XX_VMUX_SVIDEO,
1316 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001317 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001318 .gpio = default_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001319 } },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001320 },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001321 /* maybe there's a reason behind it why Terratec sells the Hybrid XS
1322 as Prodigy XS with a different PID, let's keep it separated for now
1323 maybe we'll need it lateron */
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001324 [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
1325 .name = "Terratec Prodigy XS",
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001326 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001327 .tuner_gpio = default_tuner_gpio,
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001328 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001329 .input = { {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001330 .type = EM28XX_VMUX_TELEVISION,
1331 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001332 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001333 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001334 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001335 .type = EM28XX_VMUX_COMPOSITE1,
1336 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001337 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001338 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001339 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001340 .type = EM28XX_VMUX_SVIDEO,
1341 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001342 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001343 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001344 } },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -03001345 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001346 [EM2820_BOARD_MSI_VOX_USB_2] = {
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -03001347 .name = "MSI VOX USB 2.0",
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -03001348 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
1349 .tda9887_conf = TDA9887_PRESENT |
1350 TDA9887_PORT1_ACTIVE |
1351 TDA9887_PORT2_ACTIVE,
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -03001352 .max_range_640_480 = 1,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -03001353 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -03001354 .input = { {
1355 .type = EM28XX_VMUX_TELEVISION,
1356 .vmux = SAA7115_COMPOSITE4,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001357 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001358 }, {
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -03001359 .type = EM28XX_VMUX_COMPOSITE1,
1360 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001361 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001362 }, {
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -03001363 .type = EM28XX_VMUX_SVIDEO,
1364 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001365 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001366 } },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001367 },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001368 [EM2800_BOARD_TERRATEC_CINERGY_200] = {
1369 .name = "Terratec Cinergy 200 USB",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001370 .is_em2800 = 1,
Mauro Carvalho Chehabac07bb72009-09-08 14:04:41 -03001371 .has_ir_i2c = 1,
Sascha Sommer53b667e2012-01-08 16:41:22 -03001372 .tuner_type = TUNER_LG_TALN,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001373 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -03001374 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001375 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001376 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001377 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001378 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001379 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001380 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001381 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001382 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001383 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001384 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001385 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001386 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001387 } },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001388 },
Aron Szabo59d07f12008-07-27 13:47:52 -03001389 [EM2800_BOARD_GRABBEEX_USB2800] = {
Nicola Soranzoa1a6ee72009-02-10 23:28:24 -03001390 .name = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
1391 .is_em2800 = 1,
1392 .decoder = EM28XX_SAA711X,
1393 .tuner_type = TUNER_ABSENT, /* capture only board */
1394 .input = { {
Aron Szabo59d07f12008-07-27 13:47:52 -03001395 .type = EM28XX_VMUX_COMPOSITE1,
1396 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001397 .amux = EM28XX_AMUX_LINE_IN,
Aron Szabo59d07f12008-07-27 13:47:52 -03001398 }, {
1399 .type = EM28XX_VMUX_SVIDEO,
1400 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001401 .amux = EM28XX_AMUX_LINE_IN,
Aron Szabo59d07f12008-07-27 13:47:52 -03001402 } },
1403 },
Mauro Carvalho Chehab694a1012009-11-26 21:26:13 -03001404 [EM2800_BOARD_VC211A] = {
1405 .name = "Actionmaster/LinXcel/Digitus VC211A",
1406 .is_em2800 = 1,
1407 .tuner_type = TUNER_ABSENT, /* Capture-only board */
1408 .decoder = EM28XX_SAA711X,
1409 .input = { {
1410 .type = EM28XX_VMUX_COMPOSITE1,
1411 .vmux = SAA7115_COMPOSITE0,
1412 .amux = EM28XX_AMUX_LINE_IN,
1413 .gpio = vc211a_enable,
1414 }, {
1415 .type = EM28XX_VMUX_SVIDEO,
1416 .vmux = SAA7115_SVIDEO3,
1417 .amux = EM28XX_AMUX_LINE_IN,
1418 .gpio = vc211a_enable,
1419 } },
1420 },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001421 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
1422 .name = "Leadtek Winfast USB II",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001423 .is_em2800 = 1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001424 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
1425 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -03001426 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001427 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001428 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001429 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001430 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001431 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001432 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001433 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001434 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001435 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001436 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001437 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001438 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001439 } },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001440 },
1441 [EM2800_BOARD_KWORLD_USB2800] = {
1442 .name = "Kworld USB2800",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001443 .is_em2800 = 1,
Michael Krufkyab8b8702008-04-22 14:46:05 -03001444 .tuner_type = TUNER_PHILIPS_FCV1236D,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001445 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -03001446 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001447 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001448 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001449 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001450 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001451 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001452 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001453 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001454 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001455 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001456 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001457 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001458 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001459 } },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08001460 },
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -08001461 [EM2820_BOARD_PINNACLE_DVC_90] = {
Douglas Schilling Landgrafea476892009-09-06 18:41:59 -03001462 .name = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker "
Don Kramer74e07f32012-01-02 16:15:44 -03001463 "/ Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -03001464 .tuner_type = TUNER_ABSENT, /* capture only board */
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -03001465 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001466 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001467 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001468 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001469 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001470 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001471 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -03001472 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001473 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001474 } },
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -08001475 },
Sascha Sommer43625592007-11-03 15:05:07 -03001476 [EM2800_BOARD_VGEAR_POCKETTV] = {
1477 .name = "V-Gear PocketTV",
1478 .is_em2800 = 1,
Sascha Sommer43625592007-11-03 15:05:07 -03001479 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
1480 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -03001481 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001482 .input = { {
Sascha Sommer43625592007-11-03 15:05:07 -03001483 .type = EM28XX_VMUX_TELEVISION,
1484 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001485 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001486 }, {
Sascha Sommer43625592007-11-03 15:05:07 -03001487 .type = EM28XX_VMUX_COMPOSITE1,
1488 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001489 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001490 }, {
Sascha Sommer43625592007-11-03 15:05:07 -03001491 .type = EM28XX_VMUX_SVIDEO,
1492 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001493 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001494 } },
Sascha Sommer43625592007-11-03 15:05:07 -03001495 },
Douglas Schilling Landgraf1e1addd2008-12-27 21:38:14 -03001496 [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
1497 .name = "Pixelview PlayTV Box 4 USB 2.0",
1498 .tda9887_conf = TDA9887_PRESENT,
1499 .tuner_type = TUNER_YMEC_TVF_5533MF,
1500 .decoder = EM28XX_SAA711X,
1501 .input = { {
1502 .type = EM28XX_VMUX_TELEVISION,
1503 .vmux = SAA7115_COMPOSITE2,
1504 .amux = EM28XX_AMUX_VIDEO,
1505 .aout = EM28XX_AOUT_MONO | /* I2S */
1506 EM28XX_AOUT_MASTER, /* Line out pin */
1507 }, {
1508 .type = EM28XX_VMUX_COMPOSITE1,
1509 .vmux = SAA7115_COMPOSITE0,
1510 .amux = EM28XX_AMUX_LINE_IN,
1511 }, {
1512 .type = EM28XX_VMUX_SVIDEO,
1513 .vmux = SAA7115_SVIDEO3,
1514 .amux = EM28XX_AMUX_LINE_IN,
1515 } },
1516 },
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -03001517 [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
Douglas Schilling Landgraf1f372a92009-02-25 16:54:31 -03001518 .name = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
Frank Schaeferf52226092013-12-01 18:06:52 -03001519 .buttons = std_snapshot_button,
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -03001520 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabed086312008-01-24 06:59:20 -03001521 .tuner_type = TUNER_YMEC_TVF_5533MF,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -03001522 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001523 .input = { {
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -03001524 .type = EM28XX_VMUX_TELEVISION,
1525 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab30e4ac72008-11-20 13:43:05 -03001526 .amux = EM28XX_AMUX_VIDEO,
1527 .aout = EM28XX_AOUT_MONO | /* I2S */
1528 EM28XX_AOUT_MASTER, /* Line out pin */
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001529 }, {
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -03001530 .type = EM28XX_VMUX_COMPOSITE1,
1531 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab7463dda2008-02-05 22:29:26 -03001532 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001533 }, {
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -03001534 .type = EM28XX_VMUX_SVIDEO,
1535 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab7463dda2008-02-05 22:29:26 -03001536 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001537 } },
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -03001538 },
Devin Heitmueller3ed58ba2009-05-27 23:27:26 -03001539 [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
1540 .name = "EM2860/SAA711X Reference Design",
Frank Schaeferf52226092013-12-01 18:06:52 -03001541 .buttons = std_snapshot_button,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001542 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -03001543 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001544 .input = { {
Devin Heitmuellera9fc52b2008-06-28 08:57:06 -03001545 .type = EM28XX_VMUX_SVIDEO,
1546 .vmux = SAA7115_SVIDEO3,
Devin Heitmueller3ed58ba2009-05-27 23:27:26 -03001547 }, {
1548 .type = EM28XX_VMUX_COMPOSITE1,
1549 .vmux = SAA7115_COMPOSITE0,
Devin Heitmuellera9fc52b2008-06-28 08:57:06 -03001550 } },
1551 },
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -03001552
Mauro Carvalho Chehabebaefdb2011-06-01 10:16:25 -03001553 [EM2874_BOARD_LEADERSHIP_ISDBT] = {
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03001554 .def_i2c_bus = 1,
1555 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -03001556 EM28XX_I2C_FREQ_100_KHZ,
1557 .xclk = EM28XX_XCLK_FREQUENCY_10MHZ,
1558 .name = "EM2874 Leadership ISDBT",
1559 .tuner_type = TUNER_ABSENT,
1560 .tuner_gpio = leadership_reset,
1561 .dvb_gpio = leadership_digital,
1562 .has_dvb = 1,
1563 },
1564
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001565 [EM2880_BOARD_MSI_DIGIVOX_AD] = {
1566 .name = "MSI DigiVox A/D",
1567 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001568 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001569 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001570 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001571 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001572 .type = EM28XX_VMUX_TELEVISION,
1573 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001574 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001575 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001576 }, {
1577 .type = EM28XX_VMUX_COMPOSITE1,
1578 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001579 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001580 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001581 }, {
1582 .type = EM28XX_VMUX_SVIDEO,
1583 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001584 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001585 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001586 } },
1587 },
1588 [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
1589 .name = "MSI DigiVox A/D II",
1590 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001591 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001592 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001593 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001594 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001595 .type = EM28XX_VMUX_TELEVISION,
1596 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001597 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001598 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001599 }, {
1600 .type = EM28XX_VMUX_COMPOSITE1,
1601 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001602 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001603 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001604 }, {
1605 .type = EM28XX_VMUX_SVIDEO,
1606 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001607 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001608 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001609 } },
1610 },
1611 [EM2880_BOARD_KWORLD_DVB_305U] = {
1612 .name = "KWorld DVB-T 305U",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001613 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001614 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001615 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001616 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001617 .type = EM28XX_VMUX_TELEVISION,
1618 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001619 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001620 }, {
1621 .type = EM28XX_VMUX_COMPOSITE1,
1622 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001623 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001624 }, {
1625 .type = EM28XX_VMUX_SVIDEO,
1626 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001627 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001628 } },
1629 },
1630 [EM2880_BOARD_KWORLD_DVB_310U] = {
1631 .name = "KWorld DVB-T 310U",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001632 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001633 .tuner_gpio = default_tuner_gpio,
Darron Broadda3808e2008-09-30 02:46:41 -03001634 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001635 .dvb_gpio = default_digital,
Darron Broadda3808e2008-09-30 02:46:41 -03001636 .mts_firmware = 1,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001637 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001638 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001639 .type = EM28XX_VMUX_TELEVISION,
1640 .vmux = TVP5150_COMPOSITE0,
Darron Broadda3808e2008-09-30 02:46:41 -03001641 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001642 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001643 }, {
1644 .type = EM28XX_VMUX_COMPOSITE1,
1645 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehaba42aa192008-11-19 11:08:53 -03001646 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001647 .gpio = default_analog,
Darron Broadda3808e2008-09-30 02:46:41 -03001648 }, { /* S-video has not been tested yet */
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001649 .type = EM28XX_VMUX_SVIDEO,
1650 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehaba42aa192008-11-19 11:08:53 -03001651 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001652 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001653 } },
1654 },
Franklin Mengd7de5d82009-06-06 17:05:02 -03001655 [EM2882_BOARD_KWORLD_ATSC_315U] = {
1656 .name = "KWorld ATSC 315U HDTV TV Box",
1657 .valid = EM28XX_BOARD_NOT_VALIDATED,
1658 .tuner_type = TUNER_THOMSON_DTT761X,
1659 .tuner_gpio = em2882_kworld_315u_tuner_gpio,
1660 .tda9887_conf = TDA9887_PRESENT,
1661 .decoder = EM28XX_SAA711X,
1662 .has_dvb = 1,
1663 .dvb_gpio = em2882_kworld_315u_digital,
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -03001664 .ir_codes = RC_MAP_KWORLD_315U,
Franklin Mengd7de5d82009-06-06 17:05:02 -03001665 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
1666 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
1667 /* Analog mode - still not ready */
1668 /*.input = { {
1669 .type = EM28XX_VMUX_TELEVISION,
1670 .vmux = SAA7115_COMPOSITE2,
1671 .amux = EM28XX_AMUX_VIDEO,
1672 .gpio = em2882_kworld_315u_analog,
1673 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1674 }, {
1675 .type = EM28XX_VMUX_COMPOSITE1,
1676 .vmux = SAA7115_COMPOSITE0,
1677 .amux = EM28XX_AMUX_LINE_IN,
1678 .gpio = em2882_kworld_315u_analog1,
1679 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1680 }, {
1681 .type = EM28XX_VMUX_SVIDEO,
1682 .vmux = SAA7115_SVIDEO3,
1683 .amux = EM28XX_AMUX_LINE_IN,
1684 .gpio = em2882_kworld_315u_analog1,
1685 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1686 } }, */
1687 },
Douglas Schilling Landgrafe5db5d42009-04-09 18:24:34 -03001688 [EM2880_BOARD_EMPIRE_DUAL_TV] = {
1689 .name = "Empire dual TV",
1690 .tuner_type = TUNER_XC2028,
1691 .tuner_gpio = default_tuner_gpio,
1692 .has_dvb = 1,
1693 .dvb_gpio = default_digital,
1694 .mts_firmware = 1,
1695 .decoder = EM28XX_TVP5150,
1696 .input = { {
1697 .type = EM28XX_VMUX_TELEVISION,
1698 .vmux = TVP5150_COMPOSITE0,
1699 .amux = EM28XX_AMUX_VIDEO,
1700 .gpio = default_analog,
1701 }, {
1702 .type = EM28XX_VMUX_COMPOSITE1,
1703 .vmux = TVP5150_COMPOSITE1,
1704 .amux = EM28XX_AMUX_LINE_IN,
1705 .gpio = default_analog,
1706 }, {
1707 .type = EM28XX_VMUX_SVIDEO,
1708 .vmux = TVP5150_SVIDEO,
1709 .amux = EM28XX_AMUX_LINE_IN,
1710 .gpio = default_analog,
1711 } },
1712 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001713 [EM2881_BOARD_DNT_DA2_HYBRID] = {
1714 .name = "DNT DA2 Hybrid",
1715 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001716 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001717 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001718 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001719 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001720 .type = EM28XX_VMUX_TELEVISION,
1721 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001722 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001723 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001724 }, {
1725 .type = EM28XX_VMUX_COMPOSITE1,
1726 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001727 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001728 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001729 }, {
1730 .type = EM28XX_VMUX_SVIDEO,
1731 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001732 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001733 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001734 } },
1735 },
1736 [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
1737 .name = "Pinnacle Hybrid Pro",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001738 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001739 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001740 .decoder = EM28XX_TVP5150,
Devin Heitmuellerd5b3ba92009-07-08 21:51:35 -03001741 .has_dvb = 1,
1742 .dvb_gpio = pinnacle_hybrid_pro_digital,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001743 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001744 .type = EM28XX_VMUX_TELEVISION,
1745 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001746 .amux = EM28XX_AMUX_VIDEO,
Devin Heitmuellerd5b3ba92009-07-08 21:51:35 -03001747 .gpio = pinnacle_hybrid_pro_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001748 }, {
1749 .type = EM28XX_VMUX_COMPOSITE1,
1750 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001751 .amux = EM28XX_AMUX_LINE_IN,
Devin Heitmuellerd5b3ba92009-07-08 21:51:35 -03001752 .gpio = pinnacle_hybrid_pro_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001753 }, {
1754 .type = EM28XX_VMUX_SVIDEO,
1755 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001756 .amux = EM28XX_AMUX_LINE_IN,
Devin Heitmuellerd5b3ba92009-07-08 21:51:35 -03001757 .gpio = pinnacle_hybrid_pro_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001758 } },
1759 },
Devin Heitmueller09bc1942011-03-13 02:07:54 -03001760 [EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {
1761 .name = "Pinnacle Hybrid Pro (330e)",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001762 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001763 .tuner_gpio = default_tuner_gpio,
Eugeniy Meshcheryakova674a3b2008-08-01 08:23:41 -03001764 .mts_firmware = 1,
Devin Heitmuellerad9b4bb2011-03-13 02:09:59 -03001765 .has_dvb = 1,
1766 .dvb_gpio = hauppauge_wintv_hvr_900R2_digital,
Devin Heitmueller9b316d62011-03-13 02:18:34 -03001767 .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001768 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001769 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001770 .type = EM28XX_VMUX_TELEVISION,
1771 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001772 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001773 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001774 }, {
1775 .type = EM28XX_VMUX_COMPOSITE1,
1776 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001777 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001778 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001779 }, {
1780 .type = EM28XX_VMUX_SVIDEO,
1781 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001782 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001783 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001784 } },
1785 },
1786 [EM2882_BOARD_KWORLD_VS_DVBT] = {
1787 .name = "Kworld VS-DVB-T 323UR",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001788 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001789 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001790 .decoder = EM28XX_TVP5150,
Antonio Larrosa811fab62010-03-04 22:19:48 -03001791 .mts_firmware = 1,
1792 .has_dvb = 1,
1793 .dvb_gpio = kworld_330u_digital,
1794 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -03001795 .ir_codes = RC_MAP_KWORLD_315U,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001796 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001797 .type = EM28XX_VMUX_TELEVISION,
1798 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001799 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001800 }, {
1801 .type = EM28XX_VMUX_COMPOSITE1,
1802 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001803 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001804 }, {
1805 .type = EM28XX_VMUX_SVIDEO,
1806 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001807 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001808 } },
1809 },
1810 [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
Philippe Bourdin91245442010-10-31 09:57:58 -03001811 .name = "Terratec Cinnergy Hybrid T USB XS (em2882)",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001812 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001813 .tuner_gpio = default_tuner_gpio,
Uroš Vamplec994d02009-09-30 22:53:37 -03001814 .mts_firmware = 1,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001815 .decoder = EM28XX_TVP5150,
Uroš Vamplec994d02009-09-30 22:53:37 -03001816 .has_dvb = 1,
1817 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -03001818 .ir_codes = RC_MAP_TERRATEC_CINERGY_XS,
Uroš Vamplec994d02009-09-30 22:53:37 -03001819 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001820 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001821 .type = EM28XX_VMUX_TELEVISION,
1822 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001823 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001824 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001825 }, {
1826 .type = EM28XX_VMUX_COMPOSITE1,
1827 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001828 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001829 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001830 }, {
1831 .type = EM28XX_VMUX_SVIDEO,
1832 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001833 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001834 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001835 } },
1836 },
Andrea.Amorosi76@gmail.com7ca7ef62010-02-09 17:53:38 -03001837 [EM2882_BOARD_DIKOM_DK300] = {
1838 .name = "Dikom DK300",
1839 .tuner_type = TUNER_XC2028,
1840 .tuner_gpio = default_tuner_gpio,
1841 .decoder = EM28XX_TVP5150,
1842 .mts_firmware = 1,
1843 .has_dvb = 1,
1844 .dvb_gpio = dikom_dk300_digital,
1845 .input = { {
1846 .type = EM28XX_VMUX_TELEVISION,
1847 .vmux = TVP5150_COMPOSITE0,
1848 .amux = EM28XX_AMUX_VIDEO,
1849 .gpio = default_analog,
1850 } },
1851 },
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001852 [EM2883_BOARD_KWORLD_HYBRID_330U] = {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001853 .name = "Kworld PlusTV HD Hybrid 330",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001854 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001855 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001856 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabbe2c6db2008-12-09 15:43:10 -03001857 .mts_firmware = 1,
1858 .has_dvb = 1,
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001859 .dvb_gpio = kworld_330u_digital,
1860 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
Nicola Soranzoa1a6ee72009-02-10 23:28:24 -03001861 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
1862 EM28XX_I2C_EEPROM_ON_BOARD |
1863 EM28XX_I2C_EEPROM_KEY_VALID,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001864 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001865 .type = EM28XX_VMUX_TELEVISION,
1866 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001867 .amux = EM28XX_AMUX_VIDEO,
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001868 .gpio = kworld_330u_analog,
1869 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001870 }, {
1871 .type = EM28XX_VMUX_COMPOSITE1,
1872 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001873 .amux = EM28XX_AMUX_LINE_IN,
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001874 .gpio = kworld_330u_analog,
1875 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001876 }, {
1877 .type = EM28XX_VMUX_SVIDEO,
1878 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001879 .amux = EM28XX_AMUX_LINE_IN,
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001880 .gpio = kworld_330u_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001881 } },
1882 },
Mauro Carvalho Chehabee281b82008-07-27 16:58:04 -03001883 [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
Vitaly Woold3603342008-07-27 14:10:11 -03001884 .name = "Compro VideoMate ForYou/Stereo",
Vitaly Woold3603342008-07-27 14:10:11 -03001885 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
Douglas Schilling Landgraff2cf2502009-03-31 17:10:58 -03001886 .tvaudio_addr = 0xb0,
Vitaly Woold3603342008-07-27 14:10:11 -03001887 .tda9887_conf = TDA9887_PRESENT,
1888 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabdf7fa092009-02-25 09:06:13 -03001889 .adecoder = EM28XX_TVAUDIO,
Vitaly Wool2bd1d9e2009-03-04 08:27:52 -03001890 .mute_gpio = compro_mute_gpio,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001891 .input = { {
Vitaly Woold3603342008-07-27 14:10:11 -03001892 .type = EM28XX_VMUX_TELEVISION,
1893 .vmux = TVP5150_COMPOSITE0,
Vitaly Wool2bd1d9e2009-03-04 08:27:52 -03001894 .amux = EM28XX_AMUX_VIDEO,
1895 .gpio = compro_unmute_tv_gpio,
Vitaly Woold3603342008-07-27 14:10:11 -03001896 }, {
1897 .type = EM28XX_VMUX_SVIDEO,
1898 .vmux = TVP5150_SVIDEO,
1899 .amux = EM28XX_AMUX_LINE_IN,
Vitaly Wool2bd1d9e2009-03-04 08:27:52 -03001900 .gpio = compro_unmute_svid_gpio,
Vitaly Woold3603342008-07-27 14:10:11 -03001901 } },
1902 },
Mauro Carvalho Chehab0bf4f6c2009-02-11 14:13:20 -03001903 [EM2860_BOARD_KAIOMY_TVNPC_U2] = {
1904 .name = "Kaiomy TVnPC U2",
1905 .vchannels = 3,
1906 .tuner_type = TUNER_XC2028,
1907 .tuner_addr = 0x61,
1908 .mts_firmware = 1,
1909 .decoder = EM28XX_TVP5150,
1910 .tuner_gpio = default_tuner_gpio,
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -03001911 .ir_codes = RC_MAP_KAIOMY,
Mauro Carvalho Chehab0bf4f6c2009-02-11 14:13:20 -03001912 .input = { {
1913 .type = EM28XX_VMUX_TELEVISION,
1914 .vmux = TVP5150_COMPOSITE0,
1915 .amux = EM28XX_AMUX_VIDEO,
1916
1917 }, {
1918 .type = EM28XX_VMUX_COMPOSITE1,
1919 .vmux = TVP5150_COMPOSITE1,
1920 .amux = EM28XX_AMUX_LINE_IN,
1921 }, {
1922 .type = EM28XX_VMUX_SVIDEO,
1923 .vmux = TVP5150_SVIDEO,
1924 .amux = EM28XX_AMUX_LINE_IN,
1925 } },
1926 .radio = {
1927 .type = EM28XX_RADIO,
1928 .amux = EM28XX_AMUX_LINE_IN,
1929 }
Mauro Carvalho Chehab56ee3802009-02-11 14:18:36 -03001930 },
1931 [EM2860_BOARD_EASYCAP] = {
1932 .name = "Easy Cap Capture DC-60",
1933 .vchannels = 2,
1934 .tuner_type = TUNER_ABSENT,
1935 .decoder = EM28XX_SAA711X,
1936 .input = { {
1937 .type = EM28XX_VMUX_COMPOSITE1,
1938 .vmux = SAA7115_COMPOSITE0,
1939 .amux = EM28XX_AMUX_LINE_IN,
1940 }, {
1941 .type = EM28XX_VMUX_SVIDEO,
1942 .vmux = SAA7115_SVIDEO3,
1943 .amux = EM28XX_AMUX_LINE_IN,
1944 } },
1945 },
Indika Katugampalaf74a61e32009-02-11 11:13:05 -03001946 [EM2820_BOARD_IODATA_GVMVP_SZ] = {
1947 .name = "IO-DATA GV-MVP/SZ",
1948 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
1949 .tuner_gpio = default_tuner_gpio,
1950 .tda9887_conf = TDA9887_PRESENT,
1951 .decoder = EM28XX_TVP5150,
1952 .input = { {
1953 .type = EM28XX_VMUX_TELEVISION,
1954 .vmux = TVP5150_COMPOSITE0,
1955 .amux = EM28XX_AMUX_VIDEO,
1956 }, { /* Composite has not been tested yet */
1957 .type = EM28XX_VMUX_COMPOSITE1,
1958 .vmux = TVP5150_COMPOSITE1,
1959 .amux = EM28XX_AMUX_VIDEO,
1960 }, { /* S-video has not been tested yet */
1961 .type = EM28XX_VMUX_SVIDEO,
1962 .vmux = TVP5150_SVIDEO,
1963 .amux = EM28XX_AMUX_VIDEO,
1964 } },
1965 },
Mauro Carvalho Chehab4557af92009-05-23 09:58:52 -03001966 [EM2860_BOARD_TERRATEC_GRABBY] = {
1967 .name = "Terratec Grabby",
1968 .vchannels = 2,
1969 .tuner_type = TUNER_ABSENT,
1970 .decoder = EM28XX_SAA711X,
1971 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
1972 .input = { {
1973 .type = EM28XX_VMUX_COMPOSITE1,
1974 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehaba3fa9042010-10-25 17:51:15 -03001975 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab4557af92009-05-23 09:58:52 -03001976 }, {
1977 .type = EM28XX_VMUX_SVIDEO,
1978 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehaba3fa9042010-10-25 17:51:15 -03001979 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab4557af92009-05-23 09:58:52 -03001980 } },
1981 },
Mauro Carvalho Chehab766ed642009-05-24 00:46:01 -03001982 [EM2860_BOARD_TERRATEC_AV350] = {
1983 .name = "Terratec AV350",
1984 .vchannels = 2,
1985 .tuner_type = TUNER_ABSENT,
1986 .decoder = EM28XX_TVP5150,
1987 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
1988 .mute_gpio = terratec_av350_mute_gpio,
1989 .input = { {
1990 .type = EM28XX_VMUX_COMPOSITE1,
1991 .vmux = TVP5150_COMPOSITE1,
1992 .amux = EM28XX_AUDIO_SRC_LINE,
Jean Delvare1df8e982009-05-13 16:48:07 -03001993 .gpio = terratec_av350_unmute_gpio,
Mauro Carvalho Chehab766ed642009-05-24 00:46:01 -03001994
1995 }, {
1996 .type = EM28XX_VMUX_SVIDEO,
1997 .vmux = TVP5150_SVIDEO,
1998 .amux = EM28XX_AUDIO_SRC_LINE,
Jean Delvare1df8e982009-05-13 16:48:07 -03001999 .gpio = terratec_av350_unmute_gpio,
Mauro Carvalho Chehab766ed642009-05-24 00:46:01 -03002000 } },
2001 },
Adrian Taylor8298f2f2010-10-20 07:55:33 -03002002
2003 [EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = {
2004 .name = "Elgato Video Capture",
2005 .decoder = EM28XX_SAA711X,
2006 .tuner_type = TUNER_ABSENT, /* Capture only device */
2007 .input = { {
2008 .type = EM28XX_VMUX_COMPOSITE1,
2009 .vmux = SAA7115_COMPOSITE0,
2010 .amux = EM28XX_AMUX_LINE_IN,
2011 }, {
2012 .type = EM28XX_VMUX_SVIDEO,
2013 .vmux = SAA7115_SVIDEO3,
2014 .amux = EM28XX_AMUX_LINE_IN,
2015 } },
2016 },
2017
Devin Heitmueller19859222009-06-19 00:33:54 -03002018 [EM2882_BOARD_EVGA_INDTUBE] = {
2019 .name = "Evga inDtube",
2020 .tuner_type = TUNER_XC2028,
2021 .tuner_gpio = default_tuner_gpio,
2022 .decoder = EM28XX_TVP5150,
Devin Heitmuellera4c47302009-06-20 21:34:42 -03002023 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
Devin Heitmueller19859222009-06-19 00:33:54 -03002024 .mts_firmware = 1,
2025 .has_dvb = 1,
2026 .dvb_gpio = evga_indtube_digital,
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -03002027 .ir_codes = RC_MAP_EVGA_INDTUBE,
Devin Heitmueller19859222009-06-19 00:33:54 -03002028 .input = { {
2029 .type = EM28XX_VMUX_TELEVISION,
2030 .vmux = TVP5150_COMPOSITE0,
2031 .amux = EM28XX_AMUX_VIDEO,
2032 .gpio = evga_indtube_analog,
2033 }, {
2034 .type = EM28XX_VMUX_COMPOSITE1,
2035 .vmux = TVP5150_COMPOSITE1,
2036 .amux = EM28XX_AMUX_LINE_IN,
2037 .gpio = evga_indtube_analog,
2038 }, {
2039 .type = EM28XX_VMUX_SVIDEO,
2040 .vmux = TVP5150_SVIDEO,
2041 .amux = EM28XX_AMUX_LINE_IN,
2042 .gpio = evga_indtube_analog,
2043 } },
2044 },
Antti Palosaari285eb1a2009-09-15 14:42:13 -03002045 /* eb1a:2868 Empia EM2870 + Philips CU1216L NIM (Philips TDA10023 +
2046 Infineon TUA6034) */
2047 [EM2870_BOARD_REDDO_DVB_C_USB_BOX] = {
2048 .name = "Reddo DVB-C USB TV Box",
2049 .tuner_type = TUNER_ABSENT,
Antti Palosaari28f4ddd12009-10-04 12:59:35 -03002050 .tuner_gpio = reddo_dvb_c_usb_box,
Antti Palosaari285eb1a2009-09-15 14:42:13 -03002051 .has_dvb = 1,
Antti Palosaari285eb1a2009-09-15 14:42:13 -03002052 },
Jarod Wilson7e48b302010-03-07 17:55:43 -03002053 /* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
2054 * initially as the KWorld PlusTV 340U, then as the UB435-Q.
2055 * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */
2056 [EM2870_BOARD_KWORLD_A340] = {
2057 .name = "KWorld PlusTV 340U or UB435-Q (ATSC)",
2058 .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
2059 .has_dvb = 1,
2060 .dvb_gpio = kworld_a340_digital,
2061 .tuner_gpio = default_tuner_gpio,
2062 },
Antti Palosaari460312e2011-05-25 17:03:50 -03002063 /* 2013:024f PCTV nanoStick T2 290e.
Antti Palosaarid6a5f922011-04-07 16:34:44 -03002064 * Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2 */
2065 [EM28174_BOARD_PCTV_290E] = {
Antti Palosaari460312e2011-05-25 17:03:50 -03002066 .name = "PCTV nanoStick T2 290e",
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03002067 .def_i2c_bus = 1,
2068 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ,
Antti Palosaarid6a5f922011-04-07 16:34:44 -03002069 .tuner_type = TUNER_ABSENT,
2070 .tuner_gpio = pctv_290e,
2071 .has_dvb = 1,
Antti Palosaariff7b9292011-05-25 17:00:35 -03002072 .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
Antti Palosaarid6a5f922011-04-07 16:34:44 -03002073 },
Antti Palosaari36588712011-08-01 01:15:30 -03002074 /* 2013:024f PCTV DVB-S2 Stick 460e
2075 * Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A8293 */
2076 [EM28174_BOARD_PCTV_460E] = {
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03002077 .def_i2c_bus = 1,
2078 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
Antti Palosaari36588712011-08-01 01:15:30 -03002079 .name = "PCTV DVB-S2 Stick (460e)",
2080 .tuner_type = TUNER_ABSENT,
2081 .tuner_gpio = pctv_460e,
2082 .has_dvb = 1,
2083 .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
2084 },
Gareth Williams4d28d3d2011-12-24 05:47:29 -03002085 /* eb1a:5006 Honestech VIDBOX NW03
2086 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner */
2087 [EM2860_BOARD_HT_VIDBOX_NW03] = {
2088 .name = "Honestech Vidbox NW03",
2089 .tuner_type = TUNER_ABSENT,
2090 .decoder = EM28XX_SAA711X,
2091 .input = { {
2092 .type = EM28XX_VMUX_COMPOSITE1,
2093 .vmux = SAA7115_COMPOSITE0,
2094 .amux = EM28XX_AMUX_LINE_IN,
2095 }, {
2096 .type = EM28XX_VMUX_SVIDEO,
2097 .vmux = SAA7115_SVIDEO3, /* S-VIDEO needs confirming */
2098 .amux = EM28XX_AMUX_LINE_IN,
2099 } },
2100 },
Antti Palosaari35530852012-03-18 18:09:01 -03002101 /* 1b80:e425 MaxMedia UB425-TC
2102 * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2 */
2103 [EM2874_BOARD_MAXMEDIA_UB425_TC] = {
2104 .name = "MaxMedia UB425-TC",
2105 .tuner_type = TUNER_ABSENT,
2106 .tuner_gpio = maxmedia_ub425_tc,
2107 .has_dvb = 1,
Antti Palosaari831378d2013-04-12 13:59:03 -03002108 .ir_codes = RC_MAP_REDDO,
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03002109 .def_i2c_bus = 1,
2110 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
Antti Palosaari35530852012-03-18 18:09:01 -03002111 EM28XX_I2C_FREQ_400_KHZ,
2112 },
Ivan Kalvachevfa5527c2012-03-19 20:09:55 -03002113 /* 2304:0242 PCTV QuatroStick (510e)
2114 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
2115 [EM2884_BOARD_PCTV_510E] = {
2116 .name = "PCTV QuatroStick (510e)",
2117 .tuner_type = TUNER_ABSENT,
2118 .tuner_gpio = pctv_510e,
2119 .has_dvb = 1,
2120 .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03002121 .def_i2c_bus = 1,
2122 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
Ivan Kalvachevfa5527c2012-03-19 20:09:55 -03002123 EM28XX_I2C_FREQ_400_KHZ,
2124 },
Antti Palosaaric247d7b2012-03-19 11:48:19 -03002125 /* 2013:0251 PCTV QuatroStick nano (520e)
2126 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
2127 [EM2884_BOARD_PCTV_520E] = {
2128 .name = "PCTV QuatroStick nano (520e)",
2129 .tuner_type = TUNER_ABSENT,
2130 .tuner_gpio = pctv_520e,
2131 .has_dvb = 1,
2132 .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03002133 .def_i2c_bus = 1,
2134 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
Antti Palosaaric247d7b2012-03-19 11:48:19 -03002135 EM28XX_I2C_FREQ_400_KHZ,
2136 },
Martin Blumenstingl89040132012-10-04 14:22:54 -03002137 [EM2884_BOARD_TERRATEC_HTC_USB_XS] = {
2138 .name = "Terratec Cinergy HTC USB XS",
2139 .has_dvb = 1,
2140 .ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
2141 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03002142 .def_i2c_bus = 1,
2143 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
Martin Blumenstingl89040132012-10-04 14:22:54 -03002144 EM28XX_I2C_FREQ_400_KHZ,
2145 },
Jakob Haufe7c1dfdb2013-04-13 11:03:37 -03002146 /* 1b80:e1cc Delock 61959
2147 * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
Mauro Carvalho Chehabce679432013-12-22 13:13:41 -03002148 * mostly the same as MaxMedia UB-425-TC but different remote */
Jakob Haufe7c1dfdb2013-04-13 11:03:37 -03002149 [EM2874_BOARD_DELOCK_61959] = {
2150 .name = "Delock 61959",
2151 .tuner_type = TUNER_ABSENT,
2152 .tuner_gpio = maxmedia_ub425_tc,
2153 .has_dvb = 1,
2154 .ir_codes = RC_MAP_DELOCK_61959,
2155 .def_i2c_bus = 1,
2156 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
2157 EM28XX_I2C_FREQ_400_KHZ,
2158 },
Jean-Francois Thibert6dbea9f2013-10-09 11:18:05 -03002159 /*
2160 * 1b80:e346 KWorld USB ATSC TV Stick UB435-Q V2
2161 * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
2162 */
2163 [EM2874_BOARD_KWORLD_UB435Q_V2] = {
2164 .name = "KWorld USB ATSC TV Stick UB435-Q V2",
2165 .tuner_type = TUNER_ABSENT,
2166 .has_dvb = 1,
2167 .dvb_gpio = kworld_a340_digital,
2168 .tuner_gpio = default_tuner_gpio,
2169 .def_i2c_bus = 1,
2170 },
Mauro Carvalho Chehab02bc1f52014-03-03 16:28:39 -03002171 /*
2172 * 1b80:e34c KWorld USB ATSC TV Stick UB435-Q V3
2173 * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
2174 */
2175 [EM2874_BOARD_KWORLD_UB435Q_V3] = {
2176 .name = "KWorld USB ATSC TV Stick UB435-Q V3",
2177 .tuner_type = TUNER_ABSENT,
2178 .has_dvb = 1,
2179 .tuner_gpio = kworld_ub435q_v3_digital,
2180 .def_i2c_bus = 1,
2181 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
2182 EM28XX_I2C_FREQ_100_KHZ,
Mauro Carvalho Chehab59432be2014-03-04 12:34:34 -03002183 .leds = kworld_ub435q_v3_leds,
Mauro Carvalho Chehab02bc1f52014-03-03 16:28:39 -03002184 },
Devin Heitmueller38b2df92012-08-13 21:18:02 -03002185 [EM2874_BOARD_PCTV_HD_MINI_80E] = {
2186 .name = "Pinnacle PCTV HD Mini",
2187 .tuner_type = TUNER_ABSENT,
2188 .has_dvb = 1,
2189 .dvb_gpio = em2874_pctv_80e_digital,
2190 .decoder = EM28XX_NODECODER,
Mauro Carvalho Chehab959505b2014-01-19 07:15:11 -03002191 .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
Mauro Carvalho Chehab88e4fcda2014-03-04 20:49:07 -03002192 .leds = pctv_80e_leds,
Devin Heitmueller38b2df92012-08-13 21:18:02 -03002193 },
Frank Schaefer0c37e732013-12-01 18:06:57 -03002194 /* 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
2195 * Empia EM2765 + OmniVision OV2640 */
2196 [EM2765_BOARD_SPEEDLINK_VAD_LAPLACE] = {
2197 .name = "SpeedLink Vicious And Devine Laplace webcam",
2198 .xclk = EM28XX_XCLK_FREQUENCY_24MHZ,
2199 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
2200 EM28XX_I2C_FREQ_100_KHZ,
2201 .def_i2c_bus = 1,
2202 .tuner_type = TUNER_ABSENT,
2203 .is_webcam = 1,
2204 .input = { {
2205 .type = EM28XX_VMUX_COMPOSITE1,
2206 .amux = EM28XX_AMUX_VIDEO,
2207 .gpio = speedlink_vad_laplace_reg_seq,
2208 } },
2209 .buttons = speedlink_vad_laplace_buttons,
2210 .leds = speedlink_vad_laplace_leds,
2211 },
Antti Palosaariec573362013-02-25 09:01:13 -03002212 /* 2013:0258 PCTV DVB-S2 Stick (461e)
2213 * Empia EM28178, Montage M88DS3103, Montage M88TS2022, Allegro A8293 */
2214 [EM28178_BOARD_PCTV_461E] = {
2215 .def_i2c_bus = 1,
2216 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
2217 .name = "PCTV DVB-S2 Stick (461e)",
2218 .tuner_type = TUNER_ABSENT,
2219 .tuner_gpio = pctv_461e,
2220 .has_dvb = 1,
2221 .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
2222 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002223};
Mauro Carvalho Chehab01c28192013-12-22 13:27:02 -03002224EXPORT_SYMBOL_GPL(em28xx_boards);
2225
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08002226const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002227
2228/* table of devices that work with this driver */
Nicola Soranzoa1a6ee72009-02-10 23:28:24 -03002229struct usb_device_id em28xx_id_table[] = {
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002230 { USB_DEVICE(0xeb1a, 0x2750),
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002231 .driver_info = EM2750_BOARD_UNKNOWN },
2232 { USB_DEVICE(0xeb1a, 0x2751),
2233 .driver_info = EM2750_BOARD_UNKNOWN },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002234 { USB_DEVICE(0xeb1a, 0x2800),
2235 .driver_info = EM2800_BOARD_UNKNOWN },
Mauro Carvalho Chehab9b4e8452009-08-07 12:08:02 -03002236 { USB_DEVICE(0xeb1a, 0x2710),
2237 .driver_info = EM2820_BOARD_UNKNOWN },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002238 { USB_DEVICE(0xeb1a, 0x2820),
2239 .driver_info = EM2820_BOARD_UNKNOWN },
2240 { USB_DEVICE(0xeb1a, 0x2821),
Devin Heitmuellerc665f4d2008-12-16 23:35:23 -03002241 .driver_info = EM2820_BOARD_UNKNOWN },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002242 { USB_DEVICE(0xeb1a, 0x2860),
2243 .driver_info = EM2820_BOARD_UNKNOWN },
2244 { USB_DEVICE(0xeb1a, 0x2861),
2245 .driver_info = EM2820_BOARD_UNKNOWN },
Devin Heitmuellerf91cb652009-09-30 22:44:19 -03002246 { USB_DEVICE(0xeb1a, 0x2862),
2247 .driver_info = EM2820_BOARD_UNKNOWN },
Devin Heitmueller443fed92010-03-19 23:53:12 -03002248 { USB_DEVICE(0xeb1a, 0x2863),
2249 .driver_info = EM2820_BOARD_UNKNOWN },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002250 { USB_DEVICE(0xeb1a, 0x2870),
2251 .driver_info = EM2820_BOARD_UNKNOWN },
2252 { USB_DEVICE(0xeb1a, 0x2881),
2253 .driver_info = EM2820_BOARD_UNKNOWN },
2254 { USB_DEVICE(0xeb1a, 0x2883),
2255 .driver_info = EM2820_BOARD_UNKNOWN },
Antti Palosaari285eb1a2009-09-15 14:42:13 -03002256 { USB_DEVICE(0xeb1a, 0x2868),
2257 .driver_info = EM2820_BOARD_UNKNOWN },
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -03002258 { USB_DEVICE(0xeb1a, 0x2875),
2259 .driver_info = EM2820_BOARD_UNKNOWN },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002260 { USB_DEVICE(0xeb1a, 0xe300),
2261 .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
Mauro Carvalho Chehab0bf4f6c2009-02-11 14:13:20 -03002262 { USB_DEVICE(0xeb1a, 0xe303),
2263 .driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002264 { USB_DEVICE(0xeb1a, 0xe305),
2265 .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
2266 { USB_DEVICE(0xeb1a, 0xe310),
2267 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
Franklin Mengd7de5d82009-06-06 17:05:02 -03002268 { USB_DEVICE(0xeb1a, 0xa313),
2269 .driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002270 { USB_DEVICE(0xeb1a, 0xa316),
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03002271 .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002272 { USB_DEVICE(0xeb1a, 0xe320),
2273 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
2274 { USB_DEVICE(0xeb1a, 0xe323),
2275 .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
2276 { USB_DEVICE(0xeb1a, 0xe350),
2277 .driver_info = EM2870_BOARD_KWORLD_350U },
2278 { USB_DEVICE(0xeb1a, 0xe355),
2279 .driver_info = EM2870_BOARD_KWORLD_355U },
2280 { USB_DEVICE(0xeb1a, 0x2801),
2281 .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
2282 { USB_DEVICE(0xeb1a, 0xe357),
2283 .driver_info = EM2870_BOARD_KWORLD_355U },
Aivar Päkk1985f6f2011-12-11 18:15:00 -03002284 { USB_DEVICE(0xeb1a, 0xe359),
2285 .driver_info = EM2870_BOARD_KWORLD_355U },
Douglas Schilling Landgrafac40d9e2009-02-25 16:55:48 -03002286 { USB_DEVICE(0x1b80, 0xe302),
2287 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */
Douglas Schilling Landgrafea476892009-09-06 18:41:59 -03002288 { USB_DEVICE(0x1b80, 0xe304),
2289 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kworld DVD Maker 2 */
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002290 { USB_DEVICE(0x0ccd, 0x0036),
2291 .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002292 { USB_DEVICE(0x0ccd, 0x004c),
2293 .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
2294 { USB_DEVICE(0x0ccd, 0x004f),
2295 .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
2296 { USB_DEVICE(0x0ccd, 0x005e),
2297 .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2298 { USB_DEVICE(0x0ccd, 0x0042),
Philippe Bourdin91245442010-10-31 09:57:58 -03002299 .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002300 { USB_DEVICE(0x0ccd, 0x0043),
Mauro Carvalho Chehab4e145342011-11-16 14:38:28 -02002301 .driver_info = EM2870_BOARD_TERRATEC_XS },
Holger Nelson6c3b9062011-12-23 23:15:32 -03002302 { USB_DEVICE(0x0ccd, 0x008e), /* Cinergy HTC USB XS Rev. 1 */
Martin Blumenstingl89040132012-10-04 14:22:54 -03002303 .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
Holger Nelson6c3b9062011-12-23 23:15:32 -03002304 { USB_DEVICE(0x0ccd, 0x00ac), /* Cinergy HTC USB XS Rev. 2 */
Martin Blumenstingl89040132012-10-04 14:22:54 -03002305 .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
Mauro Carvalho Chehab4e145342011-11-16 14:38:28 -02002306 { USB_DEVICE(0x0ccd, 0x10a2), /* H5 Rev. 1 */
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -03002307 .driver_info = EM2884_BOARD_TERRATEC_H5 },
Mauro Carvalho Chehab4e145342011-11-16 14:38:28 -02002308 { USB_DEVICE(0x0ccd, 0x10ad), /* H5 Rev. 2 */
Mauro Carvalho Chehab33ba28e2011-07-14 21:48:00 -03002309 .driver_info = EM2884_BOARD_TERRATEC_H5 },
Roland Scheidegger676fa7d2013-02-08 21:08:55 -03002310 { USB_DEVICE(0x0ccd, 0x10b6), /* H5 Rev. 3 */
2311 .driver_info = EM2884_BOARD_TERRATEC_H5 },
Mauro Carvalho Chehab766ed642009-05-24 00:46:01 -03002312 { USB_DEVICE(0x0ccd, 0x0084),
2313 .driver_info = EM2860_BOARD_TERRATEC_AV350 },
Mauro Carvalho Chehab4557af92009-05-23 09:58:52 -03002314 { USB_DEVICE(0x0ccd, 0x0096),
2315 .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
Tekaefabaaf2011-10-14 05:40:29 -03002316 { USB_DEVICE(0x0ccd, 0x10AF),
2317 .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
Andreas Oberrittera1ed02e2011-11-16 11:06:50 -03002318 { USB_DEVICE(0x0ccd, 0x00b2),
2319 .driver_info = EM2884_BOARD_CINERGY_HTC_STICK },
Adrian Taylor8298f2f2010-10-20 07:55:33 -03002320 { USB_DEVICE(0x0fd9, 0x0033),
2321 .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE},
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002322 { USB_DEVICE(0x185b, 0x2870),
2323 .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
Vitaly Woold3603342008-07-27 14:10:11 -03002324 { USB_DEVICE(0x185b, 0x2041),
Mauro Carvalho Chehabee281b82008-07-27 16:58:04 -03002325 .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002326 { USB_DEVICE(0x2040, 0x4200),
2327 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
Mauro Carvalho Chehab15b9bec2008-01-13 12:02:20 -03002328 { USB_DEVICE(0x2040, 0x4201),
2329 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002330 { USB_DEVICE(0x2040, 0x6500),
2331 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
Luc Saillard427d20c2008-01-30 17:23:00 -03002332 { USB_DEVICE(0x2040, 0x6502),
Devin Heitmueller17d9d552008-06-08 10:22:03 -03002333 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
Michael Krufky74ee0512008-05-01 18:02:30 -03002334 { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03002335 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
Michael Krufky74ee0512008-05-01 18:02:30 -03002336 { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03002337 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
Michael Krufky74ee0512008-05-01 18:02:30 -03002338 { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03002339 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
Douglas Schilling Landgraff89bc322008-12-01 21:01:04 -03002340 { USB_DEVICE(0x2040, 0x651f),
2341 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
Devin Heitmuellere14b3652008-07-26 11:04:33 -03002342 { USB_DEVICE(0x0438, 0xb002),
2343 .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002344 { USB_DEVICE(0x2001, 0xf112),
2345 .driver_info = EM2820_BOARD_DLINK_USB_TV },
2346 { USB_DEVICE(0x2304, 0x0207),
2347 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2348 { USB_DEVICE(0x2304, 0x0208),
2349 .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
2350 { USB_DEVICE(0x2304, 0x021a),
2351 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2352 { USB_DEVICE(0x2304, 0x0226),
Devin Heitmueller09bc1942011-03-13 02:07:54 -03002353 .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002354 { USB_DEVICE(0x2304, 0x0227),
2355 .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
Devin Heitmueller38b2df92012-08-13 21:18:02 -03002356 { USB_DEVICE(0x2304, 0x023f),
2357 .driver_info = EM2874_BOARD_PCTV_HD_MINI_80E },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002358 { USB_DEVICE(0x0413, 0x6023),
2359 .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
Don Kramer74e07f32012-01-02 16:15:44 -03002360 { USB_DEVICE(0x093b, 0xa003),
2361 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002362 { USB_DEVICE(0x093b, 0xa005),
2363 .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
Indika Katugampalaf74a61e32009-02-11 11:13:05 -03002364 { USB_DEVICE(0x04bb, 0x0515),
2365 .driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
Zhenyu Wang7c8b5672009-07-05 10:51:21 -03002366 { USB_DEVICE(0xeb1a, 0x50a6),
2367 .driver_info = EM2860_BOARD_GADMEI_UTV330 },
Jarod Wilson7e48b302010-03-07 17:55:43 -03002368 { USB_DEVICE(0x1b80, 0xa340),
2369 .driver_info = EM2870_BOARD_KWORLD_A340 },
Jean-Francois Thibert6dbea9f2013-10-09 11:18:05 -03002370 { USB_DEVICE(0x1b80, 0xe346),
2371 .driver_info = EM2874_BOARD_KWORLD_UB435Q_V2 },
Mauro Carvalho Chehab02bc1f52014-03-03 16:28:39 -03002372 { USB_DEVICE(0x1b80, 0xe34c),
2373 .driver_info = EM2874_BOARD_KWORLD_UB435Q_V3 },
Antti Palosaarid6a5f922011-04-07 16:34:44 -03002374 { USB_DEVICE(0x2013, 0x024f),
2375 .driver_info = EM28174_BOARD_PCTV_290E },
Antti Palosaari36588712011-08-01 01:15:30 -03002376 { USB_DEVICE(0x2013, 0x024c),
2377 .driver_info = EM28174_BOARD_PCTV_460E },
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -03002378 { USB_DEVICE(0x2040, 0x1605),
2379 .driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
Mauro Carvalho Chehab4159d012013-02-28 10:35:56 -03002380 { USB_DEVICE(0x1b80, 0xe755),
2381 .driver_info = EM2884_BOARD_C3TECH_DIGITAL_DUO },
Gareth Williams4d28d3d2011-12-24 05:47:29 -03002382 { USB_DEVICE(0xeb1a, 0x5006),
2383 .driver_info = EM2860_BOARD_HT_VIDBOX_NW03 },
Mario Ceresa2f786042012-01-06 16:00:12 -03002384 { USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */
2385 .driver_info = EM2860_BOARD_EASYCAP },
Antti Palosaari35530852012-03-18 18:09:01 -03002386 { USB_DEVICE(0x1b80, 0xe425),
2387 .driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
Ivan Kalvachevfa5527c2012-03-19 20:09:55 -03002388 { USB_DEVICE(0x2304, 0x0242),
2389 .driver_info = EM2884_BOARD_PCTV_510E },
Antti Palosaaric247d7b2012-03-19 11:48:19 -03002390 { USB_DEVICE(0x2013, 0x0251),
2391 .driver_info = EM2884_BOARD_PCTV_520E },
Jakob Haufe7c1dfdb2013-04-13 11:03:37 -03002392 { USB_DEVICE(0x1b80, 0xe1cc),
2393 .driver_info = EM2874_BOARD_DELOCK_61959 },
Frank Schaefer0c37e732013-12-01 18:06:57 -03002394 { USB_DEVICE(0x1ae7, 0x9003),
2395 .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
2396 { USB_DEVICE(0x1ae7, 0x9004),
2397 .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
Antti Palosaariec573362013-02-25 09:01:13 -03002398 { USB_DEVICE(0x2013, 0x0258),
2399 .driver_info = EM28178_BOARD_PCTV_461E },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002400 { },
2401};
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002402MODULE_DEVICE_TABLE(usb, em28xx_id_table);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002403
Mauro Carvalho Chehab102a0b02008-04-17 21:40:45 -03002404/*
Mauro Carvalho Chehab102a0b02008-04-17 21:40:45 -03002405 * EEPROM hash table for devices with generic USB IDs
2406 */
Nicola Soranzoa1a6ee72009-02-10 23:28:24 -03002407static struct em28xx_hash_table em28xx_eeprom_hash[] = {
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -03002408 /* P/N: SA 60002070465 Tuner: TVF7533-MF */
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002409 {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
Douglas Schilling Landgraf1e1addd2008-12-27 21:38:14 -03002410 {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
Darron Broadda3808e2008-09-30 02:46:41 -03002411 {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
Douglas Schilling Landgrafa35c87c2009-08-06 12:52:11 -03002412 {0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
Devin Heitmueller19859222009-06-19 00:33:54 -03002413 {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
Devin Heitmuellerd5b3ba92009-07-08 21:51:35 -03002414 {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
Antti Palosaari285eb1a2009-09-15 14:42:13 -03002415 {0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT},
Andrea.Amorosi76@gmail.com7ca7ef62010-02-09 17:53:38 -03002416 {0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028},
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002417};
2418
Mauro Carvalho Chehabd2ba0552007-11-04 08:32:42 -03002419/* I2C devicelist hash table for devices with generic USB IDs */
Sascha Sommerfad7b952007-11-04 08:06:48 -03002420static struct em28xx_hash_table em28xx_i2c_hash[] = {
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002421 {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
2422 {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
Devin Heitmueller3ed58ba2009-05-27 23:27:26 -03002423 {0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
Devin Heitmueller443fed92010-03-19 23:53:12 -03002424 {0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
Douglas Schilling Landgraff7fe3e62009-01-19 09:31:55 -03002425 {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
Mauro Carvalho Chehab6d888a62009-08-30 13:05:56 -03002426 {0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
Mauro Carvalho Chehabebaefdb2011-06-01 10:16:25 -03002427 {0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT},
Sascha Sommerfad7b952007-11-04 08:06:48 -03002428};
Frank Schaefer87b52432013-03-03 15:37:40 -03002429/* NOTE: introduce a separate hash table for devices with 16 bit eeproms */
Sascha Sommerfad7b952007-11-04 08:06:48 -03002430
Michael Krufkyd7cba042008-09-12 13:31:45 -03002431int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03002432{
Hans Verkuilbc3d2922013-03-22 09:54:00 -03002433 struct em28xx_i2c_bus *i2c_bus = ptr;
2434 struct em28xx *dev = i2c_bus->dev;
Mauro Carvalho Chehab102a0b02008-04-17 21:40:45 -03002435 int rc = 0;
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03002436
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -03002437 if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03002438 return 0;
2439
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -03002440 if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03002441 return 0;
2442
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03002443 rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03002444
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03002445 return rc;
2446}
2447EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
2448
Nicola Soranzoa1a6ee72009-02-10 23:28:24 -03002449static inline void em28xx_set_model(struct em28xx *dev)
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03002450{
Ezequiel Garciae0f6e4d2012-09-26 06:25:12 -03002451 dev->board = em28xx_boards[dev->model];
Devin Heitmuellered14e1c2008-12-29 22:27:30 -03002452
2453 /* Those are the default values for the majority of boards
2454 Use those values if not specified otherwise at boards entry
2455 */
2456 if (!dev->board.xclk)
2457 dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE |
2458 EM28XX_XCLK_FREQUENCY_12MHZ;
2459
2460 if (!dev->board.i2c_speed)
2461 dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
2462 EM28XX_I2C_FREQ_100_KHZ;
Mauro Carvalho Chehab3aa2b3b2013-03-05 06:55:27 -03002463
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -03002464 /* Should be initialized early, for I2C to work */
2465 dev->def_i2c_bus = dev->board.def_i2c_bus;
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03002466}
2467
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002468/* Since em28xx_pre_card_setup() requires a proper dev->model,
2469 * this won't work for boards with generic PCI IDs
2470 */
Ezequiel Garcia60332f02012-04-28 09:57:01 -03002471static void em28xx_pre_card_setup(struct em28xx *dev)
Markus Rechbergera94e95b2006-01-23 17:11:10 -02002472{
Devin Heitmuellered14e1c2008-12-29 22:27:30 -03002473 /* Set the initial XCLK and I2C clock values based on the board
2474 definition */
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03002475 em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
Sascha Sommerca80cf62012-01-08 16:32:09 -03002476 if (!dev->board.is_em2800)
2477 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -03002478 msleep(50);
2479
Markus Rechbergera94e95b2006-01-23 17:11:10 -02002480 /* request some modules */
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002481 switch (dev->model) {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002482 case EM2861_BOARD_PLEXTOR_PX_TV100U:
Mauro Carvalho Chehab0a6e44d2009-07-29 01:39:12 -03002483 /* Sets the msp34xx I2S speed */
2484 dev->i2s_speed = 2048000;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002485 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002486 case EM2861_BOARD_KWORLD_PVRTV_300U:
2487 case EM2880_BOARD_KWORLD_DVB_305U:
Frank Schaeferc074fc42013-06-03 14:12:03 -03002488 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x6d);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002489 msleep(10);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002490 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x7d);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002491 msleep(10);
2492 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002493 case EM2870_BOARD_COMPRO_VIDEOMATE:
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002494 /* TODO: someone can do some cleanup here...
2495 not everything's needed */
Devin Heitmueller6d676d82008-11-25 06:04:02 -03002496 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002497 msleep(10);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03002498 em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002499 msleep(10);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002500 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002501 mdelay(70);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002502 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002503 mdelay(70);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002504 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xdc);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002505 mdelay(70);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002506 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002507 mdelay(70);
2508 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002509 case EM2870_BOARD_TERRATEC_XS_MT2060:
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002510 /* this device needs some gpio writes to get the DVB-T
2511 demod work */
Frank Schaeferc074fc42013-06-03 14:12:03 -03002512 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002513 mdelay(70);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002514 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002515 mdelay(70);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002516 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002517 mdelay(70);
2518 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002519 case EM2870_BOARD_PINNACLE_PCTV_DVB:
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002520 /* this device needs some gpio writes to get the
2521 DVB-T demod work */
Frank Schaeferc074fc42013-06-03 14:12:03 -03002522 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002523 mdelay(70);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002524 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002525 mdelay(70);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002526 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002527 mdelay(70);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002528 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002529 case EM2820_BOARD_GADMEI_UTV310:
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002530 case EM2820_BOARD_MSI_VOX_USB_2:
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -03002531 /* enables audio for that devices */
Frank Schaeferc074fc42013-06-03 14:12:03 -03002532 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
Mauro Carvalho Chehab102a0b02008-04-17 21:40:45 -03002533 break;
Mauro Carvalho Chehab0bf4f6c2009-02-11 14:13:20 -03002534
Franklin Mengd7de5d82009-06-06 17:05:02 -03002535 case EM2882_BOARD_KWORLD_ATSC_315U:
Frank Schaeferc074fc42013-06-03 14:12:03 -03002536 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
Franklin Mengd7de5d82009-06-06 17:05:02 -03002537 msleep(10);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002538 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
Franklin Mengd7de5d82009-06-06 17:05:02 -03002539 msleep(10);
2540 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
2541 msleep(10);
2542 em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
2543 msleep(10);
2544 break;
2545
Mauro Carvalho Chehab0bf4f6c2009-02-11 14:13:20 -03002546 case EM2860_BOARD_KAIOMY_TVNPC_U2:
2547 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
2548 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
2549 em28xx_write_regs(dev, 0x0d, "\x42", 1);
2550 em28xx_write_regs(dev, 0x08, "\xfd", 1);
2551 msleep(10);
2552 em28xx_write_regs(dev, 0x08, "\xff", 1);
2553 msleep(10);
2554 em28xx_write_regs(dev, 0x08, "\x7f", 1);
2555 msleep(10);
2556 em28xx_write_regs(dev, 0x08, "\x6b", 1);
2557
2558 break;
Mauro Carvalho Chehab56ee3802009-02-11 14:18:36 -03002559 case EM2860_BOARD_EASYCAP:
2560 em28xx_write_regs(dev, 0x08, "\xf8", 1);
2561 break;
2562
Indika Katugampalaf74a61e32009-02-11 11:13:05 -03002563 case EM2820_BOARD_IODATA_GVMVP_SZ:
Frank Schaeferc074fc42013-06-03 14:12:03 -03002564 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
Indika Katugampalaf74a61e32009-02-11 11:13:05 -03002565 msleep(70);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002566 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
Indika Katugampalaf74a61e32009-02-11 11:13:05 -03002567 msleep(10);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002568 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
Indika Katugampalaf74a61e32009-02-11 11:13:05 -03002569 msleep(70);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002570 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
Indika Katugampalaf74a61e32009-02-11 11:13:05 -03002571 msleep(70);
2572 break;
Mauro Carvalho Chehab102a0b02008-04-17 21:40:45 -03002573 }
Mauro Carvalho Chehabc67ec532008-04-17 21:48:00 -03002574
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03002575 em28xx_gpio_set(dev, dev->board.tuner_gpio);
Mauro Carvalho Chehabc67ec532008-04-17 21:48:00 -03002576 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
2577
2578 /* Unlock device */
Mauro Carvalho Chehab2fe3e2e2008-11-27 09:10:40 -03002579 em28xx_set_mode(dev, EM28XX_SUSPEND);
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002580}
2581
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002582static int em28xx_hint_board(struct em28xx *dev)
2583{
2584 int i;
2585
Frank Schaefer2d466e12013-03-27 17:06:28 -03002586 if (dev->board.is_webcam) {
2587 if (dev->em28xx_sensor == EM28XX_MT9V011) {
2588 dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
2589 } else if (dev->em28xx_sensor == EM28XX_MT9M001 ||
2590 dev->em28xx_sensor == EM28XX_MT9M111) {
2591 dev->model = EM2750_BOARD_UNKNOWN;
2592 }
2593 /* FIXME: IMPROVE ! */
2594
2595 return 0;
2596 }
2597
Mauro Carvalho Chehabd2ba0552007-11-04 08:32:42 -03002598 /* HINT method: EEPROM
2599 *
2600 * This method works only for boards with eeprom.
2601 * Uses a hash of all eeprom bytes. The hash should be
2602 * unique for a vendor/tuner pair.
2603 * There are a high chance that tuners for different
2604 * video standards produce different hashes.
2605 */
2606 for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
2607 if (dev->hash == em28xx_eeprom_hash[i].hash) {
2608 dev->model = em28xx_eeprom_hash[i].model;
2609 dev->tuner_type = em28xx_eeprom_hash[i].tuner;
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002610
2611 em28xx_errdev("Your board has no unique USB ID.\n");
2612 em28xx_errdev("A hint were successfully done, "
2613 "based on eeprom hash.\n");
2614 em28xx_errdev("This method is not 100%% failproof.\n");
2615 em28xx_errdev("If the board were missdetected, "
2616 "please email this log to:\n");
2617 em28xx_errdev("\tV4L Mailing List "
Alexey Klimov51caf912009-01-25 12:53:09 -03002618 " <linux-media@vger.kernel.org>\n");
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002619 em28xx_errdev("Board detected as %s\n",
2620 em28xx_boards[dev->model].name);
2621
2622 return 0;
2623 }
2624 }
Sascha Sommerfad7b952007-11-04 08:06:48 -03002625
Mauro Carvalho Chehabd2ba0552007-11-04 08:32:42 -03002626 /* HINT method: I2C attached devices
2627 *
2628 * This method works for all boards.
2629 * Uses a hash of i2c scanned devices.
2630 * Devices with the same i2c attached chips will
2631 * be considered equal.
2632 * This method is less precise than the eeprom one.
2633 */
2634
Sascha Sommerfad7b952007-11-04 08:06:48 -03002635 /* user did not request i2c scanning => do it now */
2636 if (!dev->i2c_hash)
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -03002637 em28xx_do_i2c_scan(dev, dev->def_i2c_bus);
Sascha Sommerfad7b952007-11-04 08:06:48 -03002638
2639 for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
2640 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
2641 dev->model = em28xx_i2c_hash[i].model;
2642 dev->tuner_type = em28xx_i2c_hash[i].tuner;
2643 em28xx_errdev("Your board has no unique USB ID.\n");
2644 em28xx_errdev("A hint were successfully done, "
2645 "based on i2c devicelist hash.\n");
2646 em28xx_errdev("This method is not 100%% failproof.\n");
2647 em28xx_errdev("If the board were missdetected, "
2648 "please email this log to:\n");
2649 em28xx_errdev("\tV4L Mailing List "
Alexey Klimov51caf912009-01-25 12:53:09 -03002650 " <linux-media@vger.kernel.org>\n");
Sascha Sommerfad7b952007-11-04 08:06:48 -03002651 em28xx_errdev("Board detected as %s\n",
2652 em28xx_boards[dev->model].name);
2653
2654 return 0;
2655 }
2656 }
2657
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002658 em28xx_errdev("Your board has no unique USB ID and thus need a "
2659 "hint to be detected.\n");
2660 em28xx_errdev("You may try to use card=<n> insmod option to "
2661 "workaround that.\n");
2662 em28xx_errdev("Please send an email with this log to:\n");
Alexey Klimov51caf912009-01-25 12:53:09 -03002663 em28xx_errdev("\tV4L Mailing List <linux-media@vger.kernel.org>\n");
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002664 em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
Sascha Sommerfad7b952007-11-04 08:06:48 -03002665 em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002666
2667 em28xx_errdev("Here is a list of valid choices for the card=<n>"
2668 " insmod option:\n");
2669 for (i = 0; i < em28xx_bcount; i++) {
2670 em28xx_errdev(" card=%d -> %s\n",
2671 i, em28xx_boards[i].name);
2672 }
2673 return -1;
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -03002674}
2675
Ezequiel Garcia60332f02012-04-28 09:57:01 -03002676static void em28xx_card_setup(struct em28xx *dev)
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002677{
Mauro Carvalho Chehab3d3215c2009-08-10 10:29:27 -03002678 /*
2679 * If the device can be a webcam, seek for a sensor.
2680 * If sensor is not found, then it isn't a webcam.
2681 */
2682 if (dev->board.is_webcam) {
Frank Schaeferb3944c82013-03-27 17:06:30 -03002683 if (em28xx_detect_sensor(dev) < 0)
Mauro Carvalho Chehab3d3215c2009-08-10 10:29:27 -03002684 dev->board.is_webcam = 0;
2685 else
2686 dev->progressive = 1;
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -03002687 }
2688
Frank Schaefer2d466e12013-03-27 17:06:28 -03002689 switch (dev->model) {
2690 case EM2750_BOARD_UNKNOWN:
2691 case EM2820_BOARD_UNKNOWN:
2692 case EM2800_BOARD_UNKNOWN:
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -03002693 /*
2694 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
2695 *
2696 * This occurs because they share identical USB vendor and
2697 * product IDs.
2698 *
2699 * What we do here is look up the EEPROM hash of the K-WORLD
2700 * and if it is found then we decide that we do not have
2701 * a DIGIVOX and reset the device to the K-WORLD instead.
2702 *
2703 * This solution is only valid if they do not share eeprom
2704 * hash identities which has not been determined as yet.
2705 */
2706 if (em28xx_hint_board(dev) < 0)
2707 em28xx_errdev("Board not discovered\n");
2708 else {
2709 em28xx_set_model(dev);
2710 em28xx_pre_card_setup(dev);
2711 }
2712 break;
Frank Schaefer2d466e12013-03-27 17:06:28 -03002713 default:
2714 em28xx_set_model(dev);
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -03002715 }
Mauro Carvalho Chehab3d3215c2009-08-10 10:29:27 -03002716
2717 em28xx_info("Identified as %s (card=%d)\n",
2718 dev->board.name, dev->model);
Mauro Carvalho Chehabf8b60302007-11-05 08:42:55 -03002719
2720 dev->tuner_type = em28xx_boards[dev->model].tuner_type;
Mauro Carvalho Chehab31e05302008-11-20 18:47:37 -03002721 if (em28xx_boards[dev->model].tuner_addr)
2722 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr;
Mauro Carvalho Chehabf8b60302007-11-05 08:42:55 -03002723
Franklin Mengae3340c2009-06-06 16:34:01 -03002724 if (em28xx_boards[dev->model].tda9887_conf)
2725 dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf;
2726
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002727 /* request some modules */
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002728 switch (dev->model) {
2729 case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
Mauro Carvalho Chehab98ae1272007-11-05 09:30:39 -03002730 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
Devin Heitmueller17d9d552008-06-08 10:22:03 -03002731 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
Douglas Schilling Landgraff89bc322008-12-01 21:01:04 -03002732 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03002733 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
Frank Schaefera6166012013-03-03 15:37:44 -03002734 case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002735 {
2736 struct tveeprom tv;
Frank Schaefera2179682013-03-03 15:37:42 -03002737
2738 if (dev->eedata == NULL)
2739 break;
Mauro Carvalho Chehabac07bb72009-09-08 14:04:41 -03002740#if defined(CONFIG_MODULES) && defined(MODULE)
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002741 request_module("tveeprom");
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002742#endif
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002743 /* Call first TVeeprom */
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002744
Mauro Carvalho Chehabc7a45e52013-03-05 06:55:26 -03002745 dev->i2c_client[dev->def_i2c_bus].addr = 0xa0 >> 1;
2746 tveeprom_hauppauge_analog(&dev->i2c_client[dev->def_i2c_bus], &tv, dev->eedata);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002747
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002748 dev->tuner_type = tv.tuner_type;
Mauro Carvalho Chehabed086312008-01-24 06:59:20 -03002749
Hans Verkuil33001012013-05-29 06:59:45 -03002750 if (tv.audio_processor == TVEEPROM_AUDPROC_MSP) {
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002751 dev->i2s_speed = 2048000;
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03002752 dev->board.has_msp34xx = 1;
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002753 }
2754 break;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002755 }
Franklin Mengd7de5d82009-06-06 17:05:02 -03002756 case EM2882_BOARD_KWORLD_ATSC_315U:
2757 em28xx_write_reg(dev, 0x0d, 0x42);
2758 msleep(10);
Frank Schaeferc074fc42013-06-03 14:12:03 -03002759 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
Franklin Mengd7de5d82009-06-06 17:05:02 -03002760 msleep(10);
2761 break;
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002762 case EM2820_BOARD_KWORLD_PVRTV2800RF:
2763 /* GPIO enables sound on KWORLD PVR TV 2800RF */
Frank Schaeferc074fc42013-06-03 14:12:03 -03002764 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf9);
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002765 break;
2766 case EM2820_BOARD_UNKNOWN:
2767 case EM2800_BOARD_UNKNOWN:
Darron Broadda3808e2008-09-30 02:46:41 -03002768 /*
2769 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
2770 *
2771 * This occurs because they share identical USB vendor and
2772 * product IDs.
2773 *
2774 * What we do here is look up the EEPROM hash of the K-WORLD
2775 * and if it is found then we decide that we do not have
2776 * a DIGIVOX and reset the device to the K-WORLD instead.
2777 *
2778 * This solution is only valid if they do not share eeprom
2779 * hash identities which has not been determined as yet.
2780 */
2781 case EM2880_BOARD_MSI_DIGIVOX_AD:
Mauro Carvalho Chehabf8b60302007-11-05 08:42:55 -03002782 if (!em28xx_hint_board(dev))
2783 em28xx_set_model(dev);
Devin Heitmuellercdf7bfa2009-06-19 00:20:28 -03002784
2785 /* In cases where we had to use a board hint, the call to
2786 em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
2787 so make the call now so the analog GPIOs are set properly
2788 before probing the i2c bus. */
Devin Heitmueller5343e442009-07-15 00:35:47 -03002789 em28xx_gpio_set(dev, dev->board.tuner_gpio);
Devin Heitmuellercdf7bfa2009-06-19 00:20:28 -03002790 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002791 break;
Andrea.Amorosi76@gmail.com7ca7ef62010-02-09 17:53:38 -03002792
Frank Schaefera2179682013-03-03 15:37:42 -03002793 /*
Andrea.Amorosi76@gmail.com7ca7ef62010-02-09 17:53:38 -03002794 * The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR.
2795 *
2796 * This occurs because they share identical USB vendor and
2797 * product IDs.
2798 *
2799 * What we do here is look up the EEPROM hash of the Dikom
2800 * and if it is found then we decide that we do not have
2801 * a Kworld and reset the device to the Dikom instead.
2802 *
2803 * This solution is only valid if they do not share eeprom
2804 * hash identities which has not been determined as yet.
2805 */
2806 case EM2882_BOARD_KWORLD_VS_DVBT:
2807 if (!em28xx_hint_board(dev))
2808 em28xx_set_model(dev);
2809
2810 /* In cases where we had to use a board hint, the call to
2811 em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
2812 so make the call now so the analog GPIOs are set properly
2813 before probing the i2c bus. */
2814 em28xx_gpio_set(dev, dev->board.tuner_gpio);
2815 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
2816 break;
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002817 }
2818
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03002819 if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03002820 em28xx_errdev("\n\n");
2821 em28xx_errdev("The support for this board weren't "
2822 "valid yet.\n");
2823 em28xx_errdev("Please send a report of having this working\n");
2824 em28xx_errdev("not to V4L mailing list (and/or to other "
2825 "addresses)\n\n");
2826 }
2827
Frank Schaefera2179682013-03-03 15:37:42 -03002828 /* Free eeprom data memory */
2829 kfree(dev->eedata);
2830 dev->eedata = NULL;
2831
Mauro Carvalho Chehabf8b60302007-11-05 08:42:55 -03002832 /* Allow override tuner type by a module parameter */
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03002833 if (tuner >= 0)
2834 dev->tuner_type = tuner;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002835}
Mauro Carvalho Chehabc8644052008-11-25 13:10:14 -03002836
Mauro Carvalho Chehabee972072014-01-12 11:08:22 -03002837void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
2838{
2839 memset(ctl, 0, sizeof(*ctl));
2840
2841 ctl->fname = XC2028_DEFAULT_FIRMWARE;
2842 ctl->max_len = 64;
2843 ctl->mts = em28xx_boards[dev->model].mts_firmware;
2844
2845 switch (dev->model) {
2846 case EM2880_BOARD_EMPIRE_DUAL_TV:
2847 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
2848 case EM2882_BOARD_TERRATEC_HYBRID_XS:
2849 ctl->demod = XC3028_FE_ZARLINK456;
2850 break;
2851 case EM2880_BOARD_TERRATEC_HYBRID_XS:
2852 case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
2853 case EM2881_BOARD_PINNACLE_HYBRID_PRO:
2854 ctl->demod = XC3028_FE_ZARLINK456;
2855 break;
2856 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
2857 case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:
2858 ctl->demod = XC3028_FE_DEFAULT;
2859 break;
2860 case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
2861 ctl->demod = XC3028_FE_DEFAULT;
2862 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
2863 break;
2864 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
2865 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
2866 case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
2867 /* FIXME: Better to specify the needed IF */
2868 ctl->demod = XC3028_FE_DEFAULT;
2869 break;
2870 case EM2883_BOARD_KWORLD_HYBRID_330U:
2871 case EM2882_BOARD_DIKOM_DK300:
2872 case EM2882_BOARD_KWORLD_VS_DVBT:
2873 ctl->demod = XC3028_FE_CHINA;
2874 ctl->fname = XC2028_DEFAULT_FIRMWARE;
2875 break;
2876 case EM2882_BOARD_EVGA_INDTUBE:
2877 ctl->demod = XC3028_FE_CHINA;
2878 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
2879 break;
2880 default:
2881 ctl->demod = XC3028_FE_OREN538;
2882 }
2883}
2884EXPORT_SYMBOL_GPL(em28xx_setup_xc3028);
2885
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002886static void request_module_async(struct work_struct *work)
2887{
2888 struct em28xx *dev = container_of(work,
2889 struct em28xx, request_module_wk);
2890
Mauro Carvalho Chehab6ae5e062012-10-02 15:35:27 -03002891 /*
2892 * The em28xx extensions can be modules or builtin. If the
2893 * modules are already loaded or are built in, those extensions
2894 * can be initialised right now. Otherwise, the module init
2895 * code will do it.
2896 */
Mauro Carvalho Chehabe63fa182014-01-06 05:50:07 -03002897
2898 /*
2899 * Devicdes with an audio-only interface also have a V4L/DVB/RC
2900 * interface. Don't register extensions twice on those devices.
2901 */
2902 if (dev->is_audio_only) {
2903#if defined(CONFIG_MODULES) && defined(MODULE)
2904 request_module("em28xx-alsa");
2905#endif
2906 return;
2907 }
2908
Mauro Carvalho Chehab6ae5e062012-10-02 15:35:27 -03002909 em28xx_init_extension(dev);
2910
2911#if defined(CONFIG_MODULES) && defined(MODULE)
Mauro Carvalho Chehab01c28192013-12-22 13:27:02 -03002912 if (dev->has_video)
2913 request_module("em28xx-v4l");
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002914 if (dev->has_audio_class)
2915 request_module("snd-usb-audio");
2916 else if (dev->has_alsa_audio)
2917 request_module("em28xx-alsa");
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002918 if (dev->board.has_dvb)
2919 request_module("em28xx-dvb");
Frank Schaeferf52226092013-12-01 18:06:52 -03002920 if (dev->board.buttons ||
Frank Schaefer2b64cbd2013-04-11 15:56:01 -03002921 ((dev->board.ir_codes || dev->board.has_ir_i2c) && !disable_ir))
Ezequiel Garcíaf4d4e762012-03-26 09:13:35 -03002922 request_module("em28xx-rc");
Mauro Carvalho Chehab6ae5e062012-10-02 15:35:27 -03002923#endif /* CONFIG_MODULES */
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002924}
2925
2926static void request_modules(struct em28xx *dev)
2927{
2928 INIT_WORK(&dev->request_module_wk, request_module_async);
2929 schedule_work(&dev->request_module_wk);
2930}
Tejun Heo707bcf32010-12-24 16:14:20 +01002931
2932static void flush_request_modules(struct em28xx *dev)
2933{
Linus Torvalds0b8e74c2012-10-07 17:49:05 +09002934 flush_work(&dev->request_module_wk);
Tejun Heo707bcf32010-12-24 16:14:20 +01002935}
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002936
2937/*
Chris Rankind7222e72011-09-24 11:02:32 -03002938 * em28xx_release_resources()
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002939 * unregisters the v4l2,i2c and usb devices
Chris Rankind7222e72011-09-24 11:02:32 -03002940 * called when the device gets disconnected or at module unload
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002941*/
Mauro Carvalho Chehab47677e52014-03-05 11:21:07 -03002942static void em28xx_release_resources(struct em28xx *dev)
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002943{
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002944 /*FIXME: I2C IR should be disconnected */
2945
Frank Schaefer5a620c72014-01-12 13:24:24 -03002946 mutex_lock(&dev->lock);
2947
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -03002948 if (dev->def_i2c_bus)
2949 em28xx_i2c_unregister(dev, 1);
2950 em28xx_i2c_unregister(dev, 0);
Douglas Schilling Landgraff2cf2502009-03-31 17:10:58 -03002951
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002952 usb_put_dev(dev->udev);
2953
2954 /* Mark device as unused */
Mauro Carvalho Chehabc3aed262014-01-14 17:35:15 -03002955 clear_bit(dev->devno, em28xx_devused);
Frank Schaefer5a620c72014-01-12 13:24:24 -03002956
2957 mutex_unlock(&dev->lock);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002958};
Mauro Carvalho Chehab47677e52014-03-05 11:21:07 -03002959
2960/**
2961 * em28xx_free_device() - Free em28xx device
2962 *
2963 * @ref: struct kref for em28xx device
2964 *
2965 * This is called when all extensions and em28xx core unregisters a device
2966 */
2967void em28xx_free_device(struct kref *ref)
2968{
2969 struct em28xx *dev = kref_to_dev(ref);
2970
2971 em28xx_info("Freeing device\n");
2972
2973 if (!dev->disconnected)
2974 em28xx_release_resources(dev);
2975
2976 kfree(dev->alt_max_pkt_size_isoc);
2977 kfree(dev);
2978}
2979EXPORT_SYMBOL_GPL(em28xx_free_device);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002980
2981/*
2982 * em28xx_init_dev()
2983 * allocates and inits the device structs, registers i2c bus and v4l device
2984 */
Thomas Petazzoni622c2fc2012-01-07 10:18:45 -03002985static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
Mauro Carvalho Chehab36fa6742009-04-05 08:02:15 -03002986 struct usb_interface *interface,
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002987 int minor)
2988{
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03002989 int retval;
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02002990 static const char *default_chip_name = "em28xx";
2991 const char *chip_name = default_chip_name;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002992
2993 dev->udev = udev;
Devin Heitmuellerd3829fa2013-01-04 16:16:24 -03002994 mutex_init(&dev->vb_queue_lock);
2995 mutex_init(&dev->vb_vbi_queue_lock);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002996 mutex_init(&dev->ctrl_urb_lock);
2997 spin_lock_init(&dev->slock);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002998
2999 dev->em28xx_write_regs = em28xx_write_regs;
3000 dev->em28xx_read_reg = em28xx_read_reg;
3001 dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
3002 dev->em28xx_write_regs_req = em28xx_write_regs_req;
3003 dev->em28xx_read_reg_req = em28xx_read_reg_req;
3004 dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
3005
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003006 em28xx_set_model(dev);
3007
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003008 dev->wait_after_write = 5;
3009
3010 /* Based on the Chip ID, set the device configuration */
3011 retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
3012 if (retval > 0) {
3013 dev->chip_id = retval;
3014
3015 switch (dev->chip_id) {
Mauro Carvalho Chehabf57b17c32009-11-12 11:21:05 -03003016 case CHIP_ID_EM2800:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003017 chip_name = "em2800";
Mauro Carvalho Chehabf57b17c32009-11-12 11:21:05 -03003018 break;
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003019 case CHIP_ID_EM2710:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003020 chip_name = "em2710";
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003021 break;
3022 case CHIP_ID_EM2750:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003023 chip_name = "em2750";
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003024 break;
Frank Schaefer736a3202013-03-26 13:38:37 -03003025 case CHIP_ID_EM2765:
3026 chip_name = "em2765";
3027 dev->wait_after_write = 0;
3028 dev->is_em25xx = 1;
3029 dev->eeprom_addrwidth_16bit = 1;
3030 break;
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003031 case CHIP_ID_EM2820:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003032 chip_name = "em2710/2820";
Frank Schaefer1552fb32013-04-19 17:09:46 -03003033 if (le16_to_cpu(dev->udev->descriptor.idVendor)
3034 == 0xeb1a) {
Frank Schaefer61ff5d62013-04-11 15:56:47 -03003035 __le16 idProd = dev->udev->descriptor.idProduct;
3036 if (le16_to_cpu(idProd) == 0x2710)
3037 chip_name = "em2710";
3038 else if (le16_to_cpu(idProd) == 0x2820)
3039 chip_name = "em2820";
3040 }
3041 /* NOTE: the em2820 is used in webcams, too ! */
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003042 break;
3043 case CHIP_ID_EM2840:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003044 chip_name = "em2840";
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003045 break;
3046 case CHIP_ID_EM2860:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003047 chip_name = "em2860";
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003048 break;
3049 case CHIP_ID_EM2870:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003050 chip_name = "em2870";
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003051 dev->wait_after_write = 0;
3052 break;
3053 case CHIP_ID_EM2874:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003054 chip_name = "em2874";
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003055 dev->wait_after_write = 0;
Frank Schaefer87b52432013-03-03 15:37:40 -03003056 dev->eeprom_addrwidth_16bit = 1;
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003057 break;
Antti Palosaaribc022692011-04-07 16:04:48 -03003058 case CHIP_ID_EM28174:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003059 chip_name = "em28174";
Antti Palosaaribc022692011-04-07 16:04:48 -03003060 dev->wait_after_write = 0;
Frank Schaefer87b52432013-03-03 15:37:40 -03003061 dev->eeprom_addrwidth_16bit = 1;
Antti Palosaaribc022692011-04-07 16:04:48 -03003062 break;
Antti Palosaari9f1d0bd2013-02-25 08:19:04 -03003063 case CHIP_ID_EM28178:
3064 chip_name = "em28178";
3065 dev->wait_after_write = 0;
3066 dev->eeprom_addrwidth_16bit = 1;
3067 break;
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003068 case CHIP_ID_EM2883:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003069 chip_name = "em2882/3";
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003070 dev->wait_after_write = 0;
3071 break;
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -03003072 case CHIP_ID_EM2884:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003073 chip_name = "em2884";
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -03003074 dev->wait_after_write = 0;
Frank Schaefer87b52432013-03-03 15:37:40 -03003075 dev->eeprom_addrwidth_16bit = 1;
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -03003076 break;
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003077 default:
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003078 printk(KERN_INFO DRIVER_NAME
3079 ": unknown em28xx chip ID (%d)\n", dev->chip_id);
Mauro Carvalho Chehabfcd20e32009-08-10 02:57:57 -03003080 }
3081 }
3082
Mauro Carvalho Chehabb99f0aa2013-12-27 00:16:13 -03003083 if (dev->chip_id == CHIP_ID_EM2870 ||
3084 dev->chip_id == CHIP_ID_EM2874 ||
3085 dev->chip_id == CHIP_ID_EM28174 ||
3086 dev->chip_id == CHIP_ID_EM28178) {
3087 /* Digital only device - don't load any alsa module */
3088 dev->audio_mode.has_audio = false;
3089 dev->has_audio_class = false;
3090 dev->has_alsa_audio = false;
3091 }
3092
Mauro Carvalho Chehaba3efa1c2012-12-23 16:32:03 -02003093 if (chip_name != default_chip_name)
3094 printk(KERN_INFO DRIVER_NAME
3095 ": chip ID is %s\n", chip_name);
3096
3097 /*
3098 * For em2820/em2710, the name may change latter, after checking
3099 * if the device has a sensor (so, it is em2710) or not.
3100 */
3101 snprintf(dev->name, sizeof(dev->name), "%s #%d", chip_name, dev->devno);
3102
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003103 if (dev->is_audio_only) {
Chris Rankin6c03e382011-08-20 08:28:17 -03003104 retval = em28xx_audio_setup(dev);
3105 if (retval)
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003106 return -ENODEV;
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003107 em28xx_init_extension(dev);
3108
3109 return 0;
3110 }
3111
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003112 em28xx_pre_card_setup(dev);
3113
3114 if (!dev->board.is_em2800) {
Mauro Carvalho Chehabca3dfd62010-09-10 17:29:14 -03003115 /* Resets I2C speed */
Sascha Sommer0903bb52012-01-08 16:19:30 -03003116 retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003117 if (retval < 0) {
Chris Rankin6c03e382011-08-20 08:28:17 -03003118 em28xx_errdev("%s: em28xx_write_reg failed!"
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003119 " retval [%d]\n",
3120 __func__, retval);
3121 return retval;
3122 }
3123 }
3124
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -03003125 rt_mutex_init(&dev->i2c_bus_lock);
3126
3127 /* register i2c bus 0 */
Frank Schaefera3ea4bf2013-03-26 13:38:36 -03003128 if (dev->board.is_em2800)
3129 retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM2800);
3130 else
3131 retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM28XX);
Chris Rankin6c03e382011-08-20 08:28:17 -03003132 if (retval < 0) {
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -03003133 em28xx_errdev("%s: em28xx_i2c_register bus 0 - error [%d]!\n",
Chris Rankin6c03e382011-08-20 08:28:17 -03003134 __func__, retval);
Mauro Carvalho Chehabb64f8e92013-12-22 13:16:49 -03003135 return retval;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003136 }
3137
Frank Schaefera3ea4bf2013-03-26 13:38:36 -03003138 /* register i2c bus 1 */
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -03003139 if (dev->def_i2c_bus) {
Frank Schaefer736a3202013-03-26 13:38:37 -03003140 if (dev->is_em25xx)
3141 retval = em28xx_i2c_register(dev, 1,
3142 EM28XX_I2C_ALGO_EM25XX_BUS_B);
3143 else
3144 retval = em28xx_i2c_register(dev, 1,
3145 EM28XX_I2C_ALGO_EM28XX);
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -03003146 if (retval < 0) {
3147 em28xx_errdev("%s: em28xx_i2c_register bus 1 - error [%d]!\n",
3148 __func__, retval);
Mauro Carvalho Chehab1f0ee652014-01-05 08:43:40 -03003149
3150 em28xx_i2c_unregister(dev, 0);
3151
Mauro Carvalho Chehabb64f8e92013-12-22 13:16:49 -03003152 return retval;
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -03003153 }
3154 }
3155
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003156 /* Do board specific init and eeprom reading */
3157 em28xx_card_setup(dev);
3158
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003159 return 0;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003160}
3161
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003162/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
3163#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
3164
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003165/*
3166 * em28xx_usb_probe()
3167 * checks for supported devices
3168 */
3169static int em28xx_usb_probe(struct usb_interface *interface,
3170 const struct usb_device_id *id)
3171{
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003172 struct usb_device *udev;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003173 struct em28xx *dev = NULL;
Douglas Schilling Landgraff2cf2502009-03-31 17:10:58 -03003174 int retval;
Holger Nelson8ab33622011-12-28 18:55:41 -03003175 bool has_audio = false, has_video = false, has_dvb = false;
Mauro Carvalho Chehab8b2aea72012-12-23 13:25:38 -02003176 int i, nr, try_bulk;
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003177 const int ifnum = interface->altsetting[0].desc.bInterfaceNumber;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003178 char *speed;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003179
3180 udev = usb_get_dev(interface_to_usbdev(interface));
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003181
3182 /* Check to see next free device and mark as used */
Chris Rankin38b61eb2011-08-20 08:21:03 -03003183 do {
Mauro Carvalho Chehabc3aed262014-01-14 17:35:15 -03003184 nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
Chris Rankin38b61eb2011-08-20 08:21:03 -03003185 if (nr >= EM28XX_MAXBOARDS) {
3186 /* No free device slots */
3187 printk(DRIVER_NAME ": Supports only %i em28xx boards.\n",
3188 EM28XX_MAXBOARDS);
3189 retval = -ENOMEM;
3190 goto err_no_slot;
3191 }
Mauro Carvalho Chehabc3aed262014-01-14 17:35:15 -03003192 } while (test_and_set_bit(nr, em28xx_devused));
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003193
3194 /* Don't register audio interfaces */
3195 if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3196 em28xx_err(DRIVER_NAME " audio device (%04x:%04x): "
3197 "interface %i, class %i\n",
3198 le16_to_cpu(udev->descriptor.idVendor),
3199 le16_to_cpu(udev->descriptor.idProduct),
3200 ifnum,
3201 interface->altsetting[0].desc.bInterfaceClass);
3202
Douglas Schilling Landgraff2cf2502009-03-31 17:10:58 -03003203 retval = -ENODEV;
3204 goto err;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003205 }
3206
Holger Nelson8ab33622011-12-28 18:55:41 -03003207 /* allocate memory for our device state and initialize it */
3208 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
3209 if (dev == NULL) {
3210 em28xx_err(DRIVER_NAME ": out of memory!\n");
3211 retval = -ENOMEM;
3212 goto err;
3213 }
3214
3215 /* compute alternate max packet sizes */
Frank Schaefer0cf544a2012-11-08 14:11:49 -03003216 dev->alt_max_pkt_size_isoc =
3217 kmalloc(sizeof(dev->alt_max_pkt_size_isoc[0]) *
Holger Nelson8ab33622011-12-28 18:55:41 -03003218 interface->num_altsetting, GFP_KERNEL);
Frank Schaefer0cf544a2012-11-08 14:11:49 -03003219 if (dev->alt_max_pkt_size_isoc == NULL) {
Holger Nelson8ab33622011-12-28 18:55:41 -03003220 em28xx_errdev("out of memory!\n");
3221 kfree(dev);
3222 retval = -ENOMEM;
3223 goto err;
3224 }
3225
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003226 /* Get endpoints */
3227 for (i = 0; i < interface->num_altsetting; i++) {
3228 int ep;
3229
3230 for (ep = 0; ep < interface->altsetting[i].desc.bNumEndpoints; ep++) {
Holger Nelson8ab33622011-12-28 18:55:41 -03003231 const struct usb_endpoint_descriptor *e;
3232 int sizedescr, size;
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003233
Holger Nelson8ab33622011-12-28 18:55:41 -03003234 e = &interface->altsetting[i].endpoint[ep].desc;
3235
3236 sizedescr = le16_to_cpu(e->wMaxPacketSize);
3237 size = sizedescr & 0x7ff;
3238
3239 if (udev->speed == USB_SPEED_HIGH)
3240 size = size * hb_mult(sizedescr);
3241
Frank Schaeferc647a912012-11-08 14:11:52 -03003242 if (usb_endpoint_dir_in(e)) {
Holger Nelson8ab33622011-12-28 18:55:41 -03003243 switch (e->bEndpointAddress) {
Frank Schaeferc647a912012-11-08 14:11:52 -03003244 case 0x82:
Holger Nelson8ab33622011-12-28 18:55:41 -03003245 has_video = true;
Frank Schaeferc647a912012-11-08 14:11:52 -03003246 if (usb_endpoint_xfer_isoc(e)) {
3247 dev->analog_ep_isoc =
3248 e->bEndpointAddress;
3249 dev->alt_max_pkt_size_isoc[i] = size;
3250 } else if (usb_endpoint_xfer_bulk(e)) {
3251 dev->analog_ep_bulk =
3252 e->bEndpointAddress;
3253 }
Holger Nelson8ab33622011-12-28 18:55:41 -03003254 break;
Frank Schaeferc647a912012-11-08 14:11:52 -03003255 case 0x83:
3256 if (usb_endpoint_xfer_isoc(e)) {
3257 has_audio = true;
3258 } else {
3259 printk(KERN_INFO DRIVER_NAME
3260 ": error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
3261 }
3262 break;
3263 case 0x84:
3264 if (has_video &&
3265 (usb_endpoint_xfer_bulk(e))) {
3266 dev->analog_ep_bulk =
3267 e->bEndpointAddress;
3268 } else {
Frank Schaeferc647a912012-11-08 14:11:52 -03003269 if (usb_endpoint_xfer_isoc(e)) {
Frank Schaeferc647a912012-11-08 14:11:52 -03003270 if (size > dev->dvb_max_pkt_size_isoc) {
Frank Schaefer72cc9ba2013-03-27 16:07:41 -03003271 has_dvb = true; /* see NOTE (~) */
Frank Schaeferb3404a82013-04-08 13:06:59 -03003272 dev->dvb_ep_isoc = e->bEndpointAddress;
Frank Schaeferc647a912012-11-08 14:11:52 -03003273 dev->dvb_max_pkt_size_isoc = size;
3274 dev->dvb_alt_isoc = i;
3275 }
3276 } else {
Frank Schaefer72cc9ba2013-03-27 16:07:41 -03003277 has_dvb = true;
Frank Schaeferc647a912012-11-08 14:11:52 -03003278 dev->dvb_ep_bulk = e->bEndpointAddress;
3279 }
Holger Nelson8ab33622011-12-28 18:55:41 -03003280 }
3281 break;
3282 }
3283 }
Frank Schaeferc647a912012-11-08 14:11:52 -03003284 /* NOTE:
3285 * Old logic with support for isoc transfers only was:
3286 * 0x82 isoc => analog
3287 * 0x83 isoc => audio
3288 * 0x84 isoc => digital
3289 *
3290 * New logic with support for bulk transfers
3291 * 0x82 isoc => analog
3292 * 0x82 bulk => analog
3293 * 0x83 isoc* => audio
3294 * 0x84 isoc => digital
3295 * 0x84 bulk => analog or digital**
3296 * (*: audio should always be isoc)
3297 * (**: analog, if ep 0x82 is isoc, otherwise digital)
3298 *
3299 * The new logic preserves backwards compatibility and
3300 * reflects the endpoint configurations we have seen
3301 * so far. But there might be devices for which this
3302 * logic is not sufficient...
3303 */
Frank Schaefer72cc9ba2013-03-27 16:07:41 -03003304 /*
3305 * NOTE (~): some manufacturers (e.g. Terratec) disable
3306 * endpoints by setting wMaxPacketSize to 0 bytes for
3307 * all alt settings. So far, we've seen this for
3308 * DVB isoc endpoints only.
3309 */
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003310 }
3311 }
3312
Holger Nelson8ab33622011-12-28 18:55:41 -03003313 if (!(has_audio || has_video || has_dvb)) {
3314 retval = -ENODEV;
3315 goto err_free;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003316 }
3317
3318 switch (udev->speed) {
3319 case USB_SPEED_LOW:
3320 speed = "1.5";
3321 break;
3322 case USB_SPEED_UNKNOWN:
3323 case USB_SPEED_FULL:
3324 speed = "12";
3325 break;
3326 case USB_SPEED_HIGH:
3327 speed = "480";
3328 break;
3329 default:
3330 speed = "unknown";
3331 }
3332
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003333 printk(KERN_INFO DRIVER_NAME
Ezequiel García401a5822012-03-13 10:27:09 -03003334 ": New device %s %s @ %s Mbps "
3335 "(%04x:%04x, interface %d, class %d)\n",
3336 udev->manufacturer ? udev->manufacturer : "",
3337 udev->product ? udev->product : "",
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003338 speed,
3339 le16_to_cpu(udev->descriptor.idVendor),
3340 le16_to_cpu(udev->descriptor.idProduct),
3341 ifnum,
3342 interface->altsetting->desc.bInterfaceNumber);
3343
Devin Heitmueller64a00b42009-05-27 23:23:37 -03003344 /*
3345 * Make sure we have 480 Mbps of bandwidth, otherwise things like
3346 * video stream wouldn't likely work, since 12 Mbps is generally
3347 * not enough even for most Digital TV streams.
3348 */
Devin Heitmuellere2a1b792009-05-27 23:44:10 -03003349 if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
Devin Heitmueller64a00b42009-05-27 23:23:37 -03003350 printk(DRIVER_NAME ": Device initialization failed.\n");
3351 printk(DRIVER_NAME ": Device must be connected to a high-speed"
3352 " USB 2.0 port.\n");
Devin Heitmueller64a00b42009-05-27 23:23:37 -03003353 retval = -ENODEV;
Holger Nelson8ab33622011-12-28 18:55:41 -03003354 goto err_free;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003355 }
3356
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003357 dev->devno = nr;
3358 dev->model = id->driver_info;
3359 dev->alt = -1;
Holger Nelson8ab33622011-12-28 18:55:41 -03003360 dev->is_audio_only = has_audio && !(has_video || has_dvb);
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003361 dev->has_alsa_audio = has_audio;
Mauro Carvalho Chehabb99f0aa2013-12-27 00:16:13 -03003362 dev->audio_mode.has_audio = has_audio;
Mauro Carvalho Chehab01c28192013-12-22 13:27:02 -03003363 dev->has_video = has_video;
Frank Schaefer961717b2014-01-13 19:02:06 -03003364 dev->ifnum = ifnum;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003365
3366 /* Checks if audio is provided by some interface */
3367 for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003368 struct usb_interface *uif = udev->config->interface[i];
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003369 if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3370 dev->has_audio_class = 1;
3371 break;
3372 }
3373 }
3374
Mauro Carvalho Chehabaa514962012-12-23 13:15:47 -02003375 if (has_audio)
3376 printk(KERN_INFO DRIVER_NAME
3377 ": Audio interface %i found %s\n",
3378 ifnum,
3379 dev->has_audio_class ? "(USB Audio Class)" : "(Vendor Class)");
3380 if (has_video)
3381 printk(KERN_INFO DRIVER_NAME
3382 ": Video interface %i found:%s%s\n",
3383 ifnum,
3384 dev->analog_ep_bulk ? " bulk" : "",
3385 dev->analog_ep_isoc ? " isoc" : "");
3386 if (has_dvb)
3387 printk(KERN_INFO DRIVER_NAME
3388 ": DVB interface %i found:%s%s\n",
3389 ifnum,
3390 dev->dvb_ep_bulk ? " bulk" : "",
3391 dev->dvb_ep_isoc ? " isoc" : "");
3392
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003393 dev->num_alt = interface->num_altsetting;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003394
Mauro Carvalho Chehabd3e4ea02012-10-27 16:29:20 -03003395 if ((unsigned)card[nr] < em28xx_bcount)
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003396 dev->model = card[nr];
3397
Mauro Carvalho Chehab4f83e7b2011-06-17 15:15:12 -03003398 /* save our data pointer in this interface device */
3399 usb_set_intfdata(interface, dev);
3400
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003401 /* allocate device struct */
3402 mutex_init(&dev->lock);
Thomas Petazzoni622c2fc2012-01-07 10:18:45 -03003403 retval = em28xx_init_dev(dev, udev, interface, nr);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003404 if (retval) {
Mauro Carvalho Chehab01c28192013-12-22 13:27:02 -03003405 goto err_free;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003406 }
3407
Frank Schaefer7e5d74e2012-12-26 15:12:37 -03003408 if (usb_xfer_mode < 0) {
Mauro Carvalho Chehab8b2aea72012-12-23 13:25:38 -02003409 if (dev->board.is_webcam)
3410 try_bulk = 1;
3411 else
3412 try_bulk = 0;
3413 } else {
Frank Schaefer7e5d74e2012-12-26 15:12:37 -03003414 try_bulk = usb_xfer_mode > 0;
Mauro Carvalho Chehab8b2aea72012-12-23 13:25:38 -02003415 }
3416
3417 /* Select USB transfer types to use */
3418 if (has_video) {
3419 if (!dev->analog_ep_isoc || (try_bulk && dev->analog_ep_bulk))
3420 dev->analog_xfer_bulk = 1;
Dan Carpenter73a8ca42014-03-05 08:09:37 -03003421 em28xx_info("analog set to %s mode.\n",
3422 dev->analog_xfer_bulk ? "bulk" : "isoc");
Mauro Carvalho Chehab8b2aea72012-12-23 13:25:38 -02003423 }
Gianluca Gennari86d38d12012-02-13 13:59:22 -03003424 if (has_dvb) {
Mauro Carvalho Chehab8b2aea72012-12-23 13:25:38 -02003425 if (!dev->dvb_ep_isoc || (try_bulk && dev->dvb_ep_bulk))
3426 dev->dvb_xfer_bulk = 1;
3427
3428 em28xx_info("dvb set to %s mode.\n",
3429 dev->dvb_xfer_bulk ? "bulk" : "isoc");
Gianluca Gennari86d38d12012-02-13 13:59:22 -03003430 }
3431
Mauro Carvalho Chehab47677e52014-03-05 11:21:07 -03003432 kref_init(&dev->ref);
3433
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003434 request_modules(dev);
3435
3436 /* Should be the last thing to do, to avoid newer udev's to
3437 open the device before fully initializing it
3438 */
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003439
3440 return 0;
Douglas Schilling Landgraff2cf2502009-03-31 17:10:58 -03003441
Holger Nelson8ab33622011-12-28 18:55:41 -03003442err_free:
Frank Schaefer0cf544a2012-11-08 14:11:49 -03003443 kfree(dev->alt_max_pkt_size_isoc);
Holger Nelson8ab33622011-12-28 18:55:41 -03003444 kfree(dev);
3445
Douglas Schilling Landgraff2cf2502009-03-31 17:10:58 -03003446err:
Mauro Carvalho Chehabc3aed262014-01-14 17:35:15 -03003447 clear_bit(nr, em28xx_devused);
Chris Rankin38b61eb2011-08-20 08:21:03 -03003448
3449err_no_slot:
3450 usb_put_dev(udev);
Douglas Schilling Landgraff2cf2502009-03-31 17:10:58 -03003451 return retval;
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003452}
3453
3454/*
3455 * em28xx_usb_disconnect()
Chris Rankind7222e72011-09-24 11:02:32 -03003456 * called when the device gets disconnected
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003457 * video device will be unregistered on v4l2_close in case it is still open
3458 */
3459static void em28xx_usb_disconnect(struct usb_interface *interface)
3460{
3461 struct em28xx *dev;
3462
3463 dev = usb_get_intfdata(interface);
3464 usb_set_intfdata(interface, NULL);
3465
3466 if (!dev)
3467 return;
3468
Frank Schaefer05fe2172012-12-27 19:02:44 -03003469 dev->disconnected = 1;
3470
Mauro Carvalho Chehab6582af42014-01-12 22:44:23 -03003471 em28xx_info("Disconnecting %s\n", dev->name);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003472
Tejun Heo707bcf32010-12-24 16:14:20 +01003473 flush_request_modules(dev);
3474
Frank Schaefer05fe2172012-12-27 19:02:44 -03003475 em28xx_close_extension(dev);
Mauro Carvalho Chehab54a2a842013-12-27 13:01:04 -03003476
Frank Schaefer5a620c72014-01-12 13:24:24 -03003477 em28xx_release_resources(dev);
Mauro Carvalho Chehab47677e52014-03-05 11:21:07 -03003478 kref_put(&dev->ref, em28xx_free_device);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003479}
3480
Shuah Khancd701c82014-02-21 21:50:18 -03003481static int em28xx_usb_suspend(struct usb_interface *interface,
3482 pm_message_t message)
3483{
3484 struct em28xx *dev;
3485
3486 dev = usb_get_intfdata(interface);
3487 if (!dev)
3488 return 0;
3489 em28xx_suspend_extension(dev);
3490 return 0;
3491}
3492
3493static int em28xx_usb_resume(struct usb_interface *interface)
3494{
3495 struct em28xx *dev;
3496
3497 dev = usb_get_intfdata(interface);
3498 if (!dev)
3499 return 0;
3500 em28xx_resume_extension(dev);
3501 return 0;
3502}
3503
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003504static struct usb_driver em28xx_usb_driver = {
3505 .name = "em28xx",
3506 .probe = em28xx_usb_probe,
3507 .disconnect = em28xx_usb_disconnect,
Shuah Khancd701c82014-02-21 21:50:18 -03003508 .suspend = em28xx_usb_suspend,
3509 .resume = em28xx_usb_resume,
3510 .reset_resume = em28xx_usb_resume,
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03003511 .id_table = em28xx_id_table,
3512};
3513
Greg Kroah-Hartmanecb3b2b2011-11-18 09:46:12 -08003514module_usb_driver(em28xx_usb_driver);