em28xx-cards.c 111.8 KB
Newer Older
1
/*
2 3
   em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
		    video capture devices
4

5 6
   Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
		      Markus Rechberger <mrechberger@gmail.com>
7
		      Mauro Carvalho Chehab <mchehab@infradead.org>
8
		      Sascha Sommer <saschasommer@freenet.de>
9
   Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

26 27
#include "em28xx.h"

28 29
#include <linux/init.h>
#include <linux/module.h>
30
#include <linux/slab.h>
31 32 33 34
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/usb.h>
#include <media/tuner.h>
35
#include <media/drv-intf/msp3400.h>
36
#include <media/i2c/saa7115.h>
37
#include <dt-bindings/media/tvp5150.h>
38
#include <media/i2c/tvaudio.h>
39
#include <media/i2c-addr.h>
40
#include <media/tveeprom.h>
41
#include <media/v4l2-common.h>
42
#include <sound/ac97_codec.h>
43 44


45 46
#define DRIVER_NAME         "em28xx"

47 48 49 50
static int tuner = -1;
module_param(tuner, int, 0444);
MODULE_PARM_DESC(tuner, "tuner type");

51 52 53 54
static unsigned int disable_ir;
module_param(disable_ir, int, 0444);
MODULE_PARM_DESC(disable_ir, "disable infrared remote support");

55 56 57 58 59
static unsigned int disable_usb_speed_check;
module_param(disable_usb_speed_check, int, 0444);
MODULE_PARM_DESC(disable_usb_speed_check,
		 "override min bandwidth requirement of 480M bps");

60
static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
61 62 63
module_param_array(card,  int, NULL, 0444);
MODULE_PARM_DESC(card,     "card type");

64 65 66 67
static int usb_xfer_mode = -1;
module_param(usb_xfer_mode, int, 0444);
MODULE_PARM_DESC(usb_xfer_mode,
		 "USB transfer mode for frame data (-1 = auto, 0 = prefer isoc, 1 = prefer bulk)");
68

69
/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */
70
static DECLARE_BITMAP(em28xx_devused, EM28XX_MAXBOARDS);
71

72 73 74 75 76 77
struct em28xx_hash_table {
	unsigned long hash;
	unsigned int  model;
	unsigned int  tuner;
};

78 79
static void em28xx_pre_card_setup(struct em28xx *dev);

80 81 82 83 84 85
/*
 *  Reset sequences for analog/digital modes
 */

/* Reset for the most [analog] boards */
static struct em28xx_reg_seq default_analog[] = {
86
	{EM2820_R08_GPIO_CTRL,	0x6d,   ~EM_GPIO_4,	10},
87 88 89 90 91
	{	-1,		-1,	-1,		-1},
};

/* Reset for the most [digital] boards */
static struct em28xx_reg_seq default_digital[] = {
92
	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
93 94 95 96 97
	{	-1,		-1,	-1,		-1},
};

/* Board Hauppauge WinTV HVR 900 analog */
static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
98
	{EM2820_R08_GPIO_CTRL,	0x2d,	~EM_GPIO_4,	10},
99 100
	{	0x05,		0xff,	0x10,		10},
	{	-1,		-1,	-1,		-1},
101 102 103 104
};

/* Board Hauppauge WinTV HVR 900 digital */
static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
105
	{EM2820_R08_GPIO_CTRL,	0x2e,	~EM_GPIO_4,	10},
106 107
	{EM2880_R04_GPO,	0x04,	0x0f,		10},
	{EM2880_R04_GPO,	0x0c,	0x0f,		10},
108
	{	-1,		-1,	-1,		-1},
109 110
};

111 112
/* Board Hauppauge WinTV HVR 900 (R2) digital */
static struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {
113
	{EM2820_R08_GPIO_CTRL,	0x2e,	~EM_GPIO_4,	10},
114
	{EM2880_R04_GPO,	0x0c,	0x0f,		10},
115
	{	-1,		-1,	-1,		-1},
116 117
};

118 119
/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
120 121
	{EM2820_R08_GPIO_CTRL,	0x69,   ~EM_GPIO_4,	10},
	{	-1,		-1,	-1,		-1},
122 123 124 125 126 127 128
};

/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */

/* Board  - EM2870 Kworld 355u
   Analog - No input analog */

129 130
/* Board - EM2882 Kworld 315U digital */
static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
131 132
	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
	{EM2820_R08_GPIO_CTRL,	0xfe,	0xff,		10},
133 134
	{EM2880_R04_GPO,	0x04,	0xff,		10},
	{EM2880_R04_GPO,	0x0c,	0xff,		10},
135
	{EM2820_R08_GPIO_CTRL,	0x7e,	0xff,		10},
136
	{	-1,		-1,	-1,		-1},
137 138 139 140 141 142 143
};

static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
	{EM2880_R04_GPO,	0x08,	0xff,		10},
	{EM2880_R04_GPO,	0x0c,	0xff,		10},
	{EM2880_R04_GPO,	0x08,	0xff,		10},
	{EM2880_R04_GPO,	0x0c,	0xff,		10},
144
	{	-1,		-1,	-1,		-1},
145 146
};

147
static struct em28xx_reg_seq kworld_330u_analog[] = {
148
	{EM2820_R08_GPIO_CTRL,	0x6d,	~EM_GPIO_4,	10},
149
	{EM2880_R04_GPO,	0x00,	0xff,		10},
150
	{	-1,		-1,	-1,		-1},
151 152 153
};

static struct em28xx_reg_seq kworld_330u_digital[] = {
154
	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
155
	{EM2880_R04_GPO,	0x08,	0xff,		10},
156
	{	-1,		-1,	-1,		-1},
157 158
};

159 160 161 162 163 164 165
/* Evga inDtube
   GPIO0 - Enable digital power (s5h1409) - low to enable
   GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
   GPIO4 - xc3028 reset
   GOP3  - s5h1409 reset
 */
static struct em28xx_reg_seq evga_indtube_analog[] = {
166
	{EM2820_R08_GPIO_CTRL,	0x79,   0xff,		60},
167 168 169 170
	{	-1,		-1,	-1,		-1},
};

static struct em28xx_reg_seq evga_indtube_digital[] = {
171
	{EM2820_R08_GPIO_CTRL,	0x7a,	0xff,		 1},
172 173
	{EM2880_R04_GPO,	0x04,	0xff,		10},
	{EM2880_R04_GPO,	0x0c,	0xff,		 1},
174
	{	-1,		-1,	-1,		-1},
175 176
};

177
/*
178
 * KWorld PlusTV 340U, UB435-Q and UB435-Q V2 (ATSC) GPIOs map:
179 180 181 182 183 184 185 186 187 188
 * EM_GPIO_0 - currently unknown
 * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
 * EM_GPIO_2 - currently unknown
 * EM_GPIO_3 - currently unknown
 * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
 * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
 * EM_GPIO_6 - currently unknown
 * EM_GPIO_7 - currently unknown
 */
static struct em28xx_reg_seq kworld_a340_digital[] = {
189 190
	{EM2820_R08_GPIO_CTRL,	0x6d,	~EM_GPIO_4,	10},
	{	-1,		-1,	-1,		-1},
191 192
};

193
static struct em28xx_reg_seq kworld_ub435q_v3_digital[] = {
194 195
	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	100},
196 197 198 199 200
	{EM2874_R80_GPIO_P0_CTRL,	0xbe,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	100},
	{	-1,			-1,	-1,	-1},
};

201 202
/* Pinnacle Hybrid Pro eb1a:2881 */
static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
203
	{EM2820_R08_GPIO_CTRL,	0xfd,   ~EM_GPIO_4,	10},
204 205 206 207
	{	-1,		-1,	-1,		-1},
};

static struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
208
	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
209 210 211 212 213
	{EM2880_R04_GPO,	0x04,	0xff,	       100},/* zl10353 reset */
	{EM2880_R04_GPO,	0x0c,	0xff,		 1},
	{	-1,		-1,	-1,		-1},
};

214
static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
215
	{EM2820_R08_GPIO_CTRL,	0x6d,	~EM_GPIO_4,	10},
216
	{EM2880_R04_GPO,	0x00,	0xff,		10},
217
	{	-1,		-1,	-1,		-1},
218 219 220
};

static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
221
	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
222
	{EM2880_R04_GPO,	0x08,	0xff,		10},
223
	{	-1,		-1,	-1,		-1},
224 225
};

226 227 228 229 230 231
/* PCTV HD Mini (80e) GPIOs
   0-5: not used
   6:   demod reset, active low
   7:   LED on, active high */
static struct em28xx_reg_seq em2874_pctv_80e_digital[] = {
	{EM28XX_R06_I2C_CLK,    0x45,   0xff,		  10}, /*400 KHz*/
232 233
	{EM2874_R80_GPIO_P0_CTRL, 0x00,   0xff,		  100},/*Demod reset*/
	{EM2874_R80_GPIO_P0_CTRL, 0x40,   0xff,		  10},
234 235 236
	{  -1,			-1,	-1,		  -1},
};

237 238 239 240
/* eb1a:2868 Reddo DVB-C USB TV Box
   GPIO4 - CU1216L NIM
   Other GPIOs seems to be don't care. */
static struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
241 242 243 244 245 246 247
	{EM2820_R08_GPIO_CTRL,	0xfe,	0xff,		10},
	{EM2820_R08_GPIO_CTRL,	0xde,	0xff,		10},
	{EM2820_R08_GPIO_CTRL,	0xfe,	0xff,		10},
	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
	{EM2820_R08_GPIO_CTRL,	0x7f,	0xff,		10},
	{EM2820_R08_GPIO_CTRL,	0x6f,	0xff,		10},
	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
248
	{	-1,		-1,	-1,		-1},
249
};
250

251
/* Callback for the most boards */
252
static struct em28xx_reg_seq default_tuner_gpio[] = {
253 254 255
	{EM2820_R08_GPIO_CTRL,	EM_GPIO_4,	EM_GPIO_4,	10},
	{EM2820_R08_GPIO_CTRL,	0,		EM_GPIO_4,	10},
	{EM2820_R08_GPIO_CTRL,	EM_GPIO_4,	EM_GPIO_4,	10},
256
	{	-1,		-1,		-1,		-1},
257 258
};

259 260
/* Mute/unmute */
static struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
261 262
	{EM2820_R08_GPIO_CTRL,	5,	7,	10},
	{	-1,		-1,	-1,	-1},
263 264 265
};

static struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
266 267
	{EM2820_R08_GPIO_CTRL,	4,	7,	10},
	{	-1,		-1,	-1,	-1},
268 269 270
};

static struct em28xx_reg_seq compro_mute_gpio[] = {
271 272
	{EM2820_R08_GPIO_CTRL,	6,	7,	10},
	{	-1,		-1,	-1,	-1},
273 274
};

275 276
/* Terratec AV350 */
static struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
277
	{EM2820_R08_GPIO_CTRL,	0xff,	0x7f,		10},
278 279 280 281
	{	-1,		-1,	-1,		-1},
};

static struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
282
	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
283 284
	{	-1,		-1,	-1,		-1},
};
285 286

static struct em28xx_reg_seq silvercrest_reg_seq[] = {
287 288
	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
	{EM2820_R08_GPIO_CTRL,	0x01,	0xf7,		10},
289 290 291
	{	-1,		-1,	-1,		-1},
};

292
static struct em28xx_reg_seq vc211a_enable[] = {
293 294 295
	{EM2820_R08_GPIO_CTRL,	0xff,	0x07,		10},
	{EM2820_R08_GPIO_CTRL,	0xff,	0x0f,		10},
	{EM2820_R08_GPIO_CTRL,	0xff,	0x0b,		10},
296 297 298
	{	-1,		-1,	-1,		-1},
};

299
static struct em28xx_reg_seq dikom_dk300_digital[] = {
300
	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
301
	{EM2880_R04_GPO,	0x08,	0xff,		10},
302
	{	-1,		-1,	-1,		-1},
303 304
};

305 306
/* Reset for the most [digital] boards */
static struct em28xx_reg_seq leadership_digital[] = {
307
	{EM2874_R80_GPIO_P0_CTRL,	0x70,	0xff,	10},
308
	{	-1,			-1,	-1,	-1},
309 310 311
};

static struct em28xx_reg_seq leadership_reset[] = {
312 313 314
	{EM2874_R80_GPIO_P0_CTRL,	0xf0,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xb0,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xf0,	0xff,	10},
315
	{	-1,			-1,	-1,	-1},
316 317
};

318
/* 2013:024f PCTV nanoStick T2 290e
319 320 321 322
 * GPIO_6 - demod reset
 * GPIO_7 - LED
 */
static struct em28xx_reg_seq pctv_290e[] = {
323 324 325
	{EM2874_R80_GPIO_P0_CTRL,	0x00,	0xff,	80},
	{EM2874_R80_GPIO_P0_CTRL,	0x40,	0xff,	80}, /* GPIO_6 = 1 */
	{EM2874_R80_GPIO_P0_CTRL,	0xc0,	0xff,	80}, /* GPIO_7 = 1 */
326
	{	-1,			-1,	-1,	-1},
327
};
328

329 330
#if 0
static struct em28xx_reg_seq terratec_h5_gpio[] = {
331
	{EM2820_R08_GPIO_CTRL,		0xff,	0xff,	10},
332 333 334
	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0xf2,	0xff,	50},
	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	50},
335
	{	-1,			-1,	-1,	-1},
336 337 338
};

static struct em28xx_reg_seq terratec_h5_digital[] = {
339 340 341
	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xe6,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0xa6,	0xff,	10},
342
	{	-1,			-1,	-1,	-1},
343 344 345
};
#endif

346 347 348 349 350 351 352 353 354 355 356
/* 2013:024f PCTV DVB-S2 Stick 460e
 * GPIO_0 - POWER_ON
 * GPIO_1 - BOOST
 * GPIO_2 - VUV_LNB (red LED)
 * GPIO_3 - EXT_12V
 * GPIO_4 - INT_DEM (DEMOD GPIO_0)
 * GPIO_5 - INT_LNB
 * GPIO_6 - RESET_DEM
 * GPIO_7 - LED (green LED)
 */
static struct em28xx_reg_seq pctv_460e[] = {
357 358 359 360 361 362
	{EM2874_R80_GPIO_P0_CTRL,	0x01,	0xff,	50},
	{	0x0d,			0xff,	0xff,	50},
	{EM2874_R80_GPIO_P0_CTRL,	0x41,	0xff,	50}, /* GPIO_6=1 */
	{	0x0d,			0x42,	0xff,	50},
	{EM2874_R80_GPIO_P0_CTRL,	0x61,	0xff,	50}, /* GPIO_5=1 */
	{	-1,			-1,	-1,	-1},
363 364
};

365
static struct em28xx_reg_seq c3tech_digital_duo_digital[] = {
366 367 368 369 370 371 372 373
	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	10}, /* xc5000 reset */
	{EM2874_R80_GPIO_P0_CTRL,	0xf9,	0xff,	35},
	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xbe,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	20},
374
	{	-1,			-1,	-1,	-1},
375 376
};

377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
/*
 * 2013:0258 PCTV DVB-S2 Stick (461e)
 * GPIO 0 = POWER_ON
 * GPIO 1 = BOOST
 * GPIO 2 = VUV_LNB (red LED)
 * GPIO 3 = #EXT_12V
 * GPIO 4 = INT_DEM
 * GPIO 5 = INT_LNB
 * GPIO 6 = #RESET_DEM
 * GPIO 7 = P07_LED (green LED)
 */
static struct em28xx_reg_seq pctv_461e[] = {
	{EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,    0},
	{0x0d,                 0xff, 0xff,    0},
	{EM2874_R80_GPIO_P0_CTRL,      0x3f, 0xff,  100}, /* reset demod */
	{EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,  200}, /* reset demod */
	{0x0d,                 0x42, 0xff,    0},
	{EM2874_R80_GPIO_P0_CTRL,      0xeb, 0xff,    0},
	{EM2874_R5F_TS_ENABLE, 0x84, 0x84,    0}, /* parallel? | null discard */
	{                  -1,   -1,   -1,   -1},
};

399
#if 0
400
static struct em28xx_reg_seq hauppauge_930c_gpio[] = {
401 402 403 404
	{EM2874_R80_GPIO_P0_CTRL,	0x6f,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0x4f,	0xff,	10}, /* xc5000 reset */
	{EM2874_R80_GPIO_P0_CTRL,	0x6f,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0x4f,	0xff,	10},
405
	{	-1,			-1,	-1,	-1},
406 407 408
};

static struct em28xx_reg_seq hauppauge_930c_digital[] = {
409 410 411
	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xe6,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0xa6,	0xff,	10},
412
	{	-1,			-1,	-1,	-1},
413 414 415
};
#endif

416
/* 1b80:e425 MaxMedia UB425-TC
417
 * 1b80:e1cc Delock 61959
418 419 420 421
 * GPIO_6 - demod reset, 0=active
 * GPIO_7 - LED, 0=active
 */
static struct em28xx_reg_seq maxmedia_ub425_tc[] = {
422 423 424 425
	{EM2874_R80_GPIO_P0_CTRL,	0x83,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0xc3,	0xff,	100}, /* GPIO_6 = 1 */
	{EM2874_R80_GPIO_P0_CTRL,	0x43,	0xff,	000}, /* GPIO_7 = 0 */
	{	-1,			-1,	-1,	-1},
426 427
};

428 429 430 431 432 433 434
/* 2304:0242 PCTV QuatroStick (510e)
 * GPIO_2: decoder reset, 0=active
 * GPIO_4: decoder suspend, 0=active
 * GPIO_6: demod reset, 0=active
 * GPIO_7: LED, 1=active
 */
static struct em28xx_reg_seq pctv_510e[] = {
435 436 437 438
	{EM2874_R80_GPIO_P0_CTRL,	0x10,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0x14,	0xff,	100}, /* GPIO_2 = 1 */
	{EM2874_R80_GPIO_P0_CTRL,	0x54,	0xff,	050}, /* GPIO_6 = 1 */
	{	-1,			-1,	-1,	-1},
439 440
};

441 442 443 444 445 446 447
/* 2013:0251 PCTV QuatroStick nano (520e)
 * GPIO_2: decoder reset, 0=active
 * GPIO_4: decoder suspend, 0=active
 * GPIO_6: demod reset, 0=active
 * GPIO_7: LED, 1=active
 */
static struct em28xx_reg_seq pctv_520e[] = {
448 449 450 451 452
	{EM2874_R80_GPIO_P0_CTRL,	0x10,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0x14,	0xff,	100}, /* GPIO_2 = 1 */
	{EM2874_R80_GPIO_P0_CTRL,	0x54,	0xff,	050}, /* GPIO_6 = 1 */
	{EM2874_R80_GPIO_P0_CTRL,	0xd4,	0xff,	000}, /* GPIO_7 = 1 */
	{	-1,			-1,	-1,	-1},
453 454
};

455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
/* 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
 * reg 0x80/0x84:
 * GPIO_0: capturing LED, 0=on, 1=off
 * GPIO_2: AV mute button, 0=pressed, 1=unpressed
 * GPIO 3: illumination button, 0=pressed, 1=unpressed
 * GPIO_6: illumination/flash LED, 0=on, 1=off
 * reg 0x81/0x85:
 * GPIO_7: snapshot button, 0=pressed, 1=unpressed
 */
static struct em28xx_reg_seq speedlink_vad_laplace_reg_seq[] = {
	{EM2820_R08_GPIO_CTRL,		0xf7,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xb2,	10},
	{	-1,			-1,	-1,	-1},
};

470 471 472 473 474 475 476 477 478 479 480 481
static struct em28xx_reg_seq pctv_292e[] = {
	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
	{0x0d,                         0xff, 0xff,    950},
	{EM2874_R80_GPIO_P0_CTRL,      0xbd, 0xff,    100},
	{EM2874_R80_GPIO_P0_CTRL,      0xfd, 0xff,    410},
	{EM2874_R80_GPIO_P0_CTRL,      0x7d, 0xff,    300},
	{EM2874_R80_GPIO_P0_CTRL,      0x7c, 0xff,     60},
	{0x0d,                         0x42, 0xff,     50},
	{EM2874_R5F_TS_ENABLE,         0x85, 0xff,      0},
	{-1,                             -1,   -1,     -1},
};

482 483 484 485 486 487 488 489 490 491 492 493 494 495
static struct em28xx_reg_seq terratec_t2_stick_hd[] = {
	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	0},
	{0x0d,				0xff,	0xff,	600},
	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xbc,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0x00,	0xff,	300},
	{EM2874_R80_GPIO_P0_CTRL,	0xf8,	0xff,	100},
	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	300},
	{0x0d,				0x42,	0xff,	1000},
	{EM2874_R5F_TS_ENABLE,		0x85,	0xff,	0},
	{-1,                             -1,   -1,     -1},
};

496 497 498 499 500 501 502 503 504 505 506 507 508 509
static struct em28xx_reg_seq plex_px_bcud[] = {
	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	0},
	{0x0d,				0xff,	0xff,	0},
	{EM2874_R50_IR_CONFIG,		0x01,	0xff,	0},
	{EM28XX_R06_I2C_CLK,		0x40,	0xff,	0},
	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	100},
	{EM28XX_R12_VINENABLE,		0x20,	0x20,	0},
	{0x0d,				0x42,	0xff,	1000},
	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	10},
	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	10},
	{0x73,				0xfd,	0xff,	100},
	{-1,				-1,	-1,	-1},
};

510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533
/*
 * 2040:0265 Hauppauge WinTV-dualHD DVB
 * reg 0x80/0x84:
 * GPIO_0: Yellow LED tuner 1, 0=on, 1=off
 * GPIO_1: Green LED tuner 1, 0=on, 1=off
 * GPIO_2: Yellow LED tuner 2, 0=on, 1=off
 * GPIO_3: Green LED tuner 2, 0=on, 1=off
 * GPIO_5: Reset #2, 0=active
 * GPIO_6: Reset #1, 0=active
 */
static struct em28xx_reg_seq hauppauge_dualhd_dvb[] = {
	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
	{0x0d,                         0xff, 0xff,    200},
	{0x50,                         0x04, 0xff,    300},
	{EM2874_R80_GPIO_P0_CTRL,      0xbf, 0xff,    100}, /* demod 1 reset */
	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},
	{EM2874_R80_GPIO_P0_CTRL,      0xdf, 0xff,    100}, /* demod 2 reset */
	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},
	{EM2874_R5F_TS_ENABLE,         0x44, 0xff,     50},
	{EM2874_R5D_TS1_PKT_SIZE,      0x05, 0xff,     50},
	{EM2874_R5E_TS2_PKT_SIZE,      0x05, 0xff,     50},
	{-1,                             -1,   -1,     -1},
};

534 535 536 537 538 539 540 541 542 543 544 545 546 547
/*
 *  Button definitions
 */
static struct em28xx_button std_snapshot_button[] = {
	{
		.role         = EM28XX_BUTTON_SNAPSHOT,
		.reg_r        = EM28XX_R0C_USBSUSP,
		.reg_clearing = EM28XX_R0C_USBSUSP,
		.mask         = EM28XX_R0C_USBSUSP_SNAPSHOT,
		.inverted     = 0,
	},
	{-1, 0, 0, 0, 0},
};

548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
static struct em28xx_button speedlink_vad_laplace_buttons[] = {
	{
		.role     = EM28XX_BUTTON_SNAPSHOT,
		.reg_r    = EM2874_R85_GPIO_P1_STATE,
		.mask     = 0x80,
		.inverted = 1,
	},
	{
		.role     = EM28XX_BUTTON_ILLUMINATION,
		.reg_r    = EM2874_R84_GPIO_P0_STATE,
		.mask     = 0x08,
		.inverted = 1,
	},
	{-1, 0, 0, 0, 0},
};

/*
 *  LED definitions
 */
static struct em28xx_led speedlink_vad_laplace_leds[] = {
	{
		.role      = EM28XX_LED_ANALOG_CAPTURING,
		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
		.gpio_mask = 0x01,
		.inverted  = 1,
	},
	{
		.role      = EM28XX_LED_ILLUMINATION,
		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
		.gpio_mask = 0x40,
		.inverted  = 1,
	},
	{-1, 0, 0, 0},
};

583 584 585 586 587 588 589 590 591 592
static struct em28xx_led kworld_ub435q_v3_leds[] = {
	{
		.role      = EM28XX_LED_DIGITAL_CAPTURING,
		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
		.gpio_mask = 0x80,
		.inverted  = 1,
	},
	{-1, 0, 0, 0},
};

593 594 595 596 597 598 599 600 601 602
static struct em28xx_led pctv_80e_leds[] = {
	{
		.role      = EM28XX_LED_DIGITAL_CAPTURING,
		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
		.gpio_mask = 0x80,
		.inverted  = 0,
	},
	{-1, 0, 0, 0},
};

603 604 605 606 607 608 609 610 611 612
static struct em28xx_led terratec_grabby_leds[] = {
	{
		.role      = EM28XX_LED_ANALOG_CAPTURING,
		.gpio_reg  = EM2820_R08_GPIO_CTRL,
		.gpio_mask = EM_GPIO_3,
		.inverted  = 1,
	},
	{-1, 0, 0, 0},
};

613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628
static struct em28xx_led hauppauge_dualhd_leds[] = {
	{
		.role      = EM28XX_LED_DIGITAL_CAPTURING,
		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
		.gpio_mask = EM_GPIO_1,
		.inverted  = 1,
	},
	{
		.role      = EM28XX_LED_DIGITAL_CAPTURING_TS2,
		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
		.gpio_mask = EM_GPIO_3,
		.inverted  = 1,
	},
	{-1, 0, 0, 0},
};

629 630 631
/*
 *  Board definitions
 */
632
struct em28xx_board em28xx_boards[] = {
633
	[EM2750_BOARD_UNKNOWN] = {
634
		.name          = "EM2710/EM2750/EM2751 webcam grabber",
635
		.xclk          = EM28XX_XCLK_FREQUENCY_20MHZ,
636 637
		.tuner_type    = TUNER_ABSENT,
		.is_webcam     = 1,
638
		.input         = { {
639
			.type     = EM28XX_VMUX_COMPOSITE,
640
			.vmux     = 0,
641
			.amux     = EM28XX_AMUX_VIDEO,
642
			.gpio     = silvercrest_reg_seq,
643 644
		} },
	},
645 646 647 648
	[EM2800_BOARD_UNKNOWN] = {
		.name         = "Unknown EM2800 video grabber",
		.is_em2800    = 1,
		.tda9887_conf = TDA9887_PRESENT,
649
		.decoder      = EM28XX_SAA711X,
650
		.tuner_type   = TUNER_ABSENT,
651
		.input        = { {
652
			.type     = EM28XX_VMUX_COMPOSITE,
653
			.vmux     = SAA7115_COMPOSITE0,
654
			.amux     = EM28XX_AMUX_LINE_IN,
655
		}, {
656
			.type     = EM28XX_VMUX_SVIDEO,
657
			.vmux     = SAA7115_SVIDEO3,
658
			.amux     = EM28XX_AMUX_LINE_IN,
659
		} },
660 661
	},
	[EM2820_BOARD_UNKNOWN] = {
662 663
		.name          = "Unknown EM2750/28xx video grabber",
		.tuner_type    = TUNER_ABSENT,
664
		.is_webcam     = 1,	/* To enable sensor probe */
665
	},
666 667 668 669
	[EM2750_BOARD_DLCW_130] = {
		/* Beijing Huaqi Information Digital Technology Co., Ltd */
		.name          = "Huaqi DLCW-130",
		.valid         = EM28XX_BOARD_NOT_VALIDATED,
670
		.xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
671 672
		.tuner_type    = TUNER_ABSENT,
		.is_webcam     = 1,
673
		.input         = { {
674
			.type     = EM28XX_VMUX_COMPOSITE,
675
			.vmux     = 0,
676
			.amux     = EM28XX_AMUX_VIDEO,
677 678
		} },
	},
679
	[EM2820_BOARD_KWORLD_PVRTV2800RF] = {
680
		.name         = "Kworld PVR TV 2800 RF",
681
		.tuner_type   = TUNER_TEMIC_PAL,
682
		.tda9887_conf = TDA9887_PRESENT,
683
		.decoder      = EM28XX_SAA711X,
684
		.input        = { {
685
			.type     = EM28XX_VMUX_COMPOSITE,
686
			.vmux     = SAA7115_COMPOSITE0,
687
			.amux     = EM28XX_AMUX_LINE_IN,
688
		}, {
689
			.type     = EM28XX_VMUX_SVIDEO,
690
			.vmux     = SAA7115_SVIDEO3,
691
			.amux     = EM28XX_AMUX_LINE_IN,
692
		} },
693
	},
694 695 696 697 698 699 700 701 702 703
	[EM2820_BOARD_GADMEI_TVR200] = {
		.name         = "Gadmei TVR200",
		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
		.tda9887_conf = TDA9887_PRESENT,
		.decoder      = EM28XX_SAA711X,
		.input        = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
704
			.type     = EM28XX_VMUX_COMPOSITE,
705 706 707 708 709 710 711 712
			.vmux     = SAA7115_COMPOSITE0,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
			.amux     = EM28XX_AMUX_LINE_IN,
		} },
	},
713 714 715
	[EM2820_BOARD_TERRATEC_CINERGY_250] = {
		.name         = "Terratec Cinergy 250 USB",
		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
716
		.has_ir_i2c   = 1,
717
		.tda9887_conf = TDA9887_PRESENT,
718
		.decoder      = EM28XX_SAA711X,
719
		.input        = { {
720
			.type     = EM28XX_VMUX_TELEVISION,
721
			.vmux     = SAA7115_COMPOSITE2,
722
			.amux     = EM28XX_AMUX_VIDEO,
723
		}, {
724
			.type     = EM28XX_VMUX_COMPOSITE,
725
			.vmux     = SAA7115_COMPOSITE0,
726
			.amux     = EM28XX_AMUX_LINE_IN,
727
		}, {
728
			.type     = EM28XX_VMUX_SVIDEO,
729
			.vmux     = SAA7115_SVIDEO3,
730
			.amux     = EM28XX_AMUX_LINE_IN,
731
		} },
732 733 734 735
	},
	[EM2820_BOARD_PINNACLE_USB_2] = {
		.name         = "Pinnacle PCTV USB 2",
		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
736
		.has_ir_i2c   = 1,
737
		.tda9887_conf = TDA9887_PRESENT,
738
		.decoder      = EM28XX_SAA711X,
739
		.input        = { {
740
			.type     = EM28XX_VMUX_TELEVISION,
741
			.vmux     = SAA7115_COMPOSITE2,
742
			.amux     = EM28XX_AMUX_VIDEO,
743
		}, {
744
			.type     = EM28XX_VMUX_COMPOSITE,
745
			.vmux     = SAA7115_COMPOSITE0,
746
			.amux     = EM28XX_AMUX_LINE_IN,
747
		}, {
748
			.type     = EM28XX_VMUX_SVIDEO,
749
			.vmux     = SAA7115_SVIDEO3,
750
			.amux     = EM28XX_AMUX_LINE_IN,
751
		} },
752 753 754 755
	},
	[EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
		.name         = "Hauppauge WinTV USB 2",
		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,
756
		.tda9887_conf = TDA9887_PRESENT |
757
				TDA9887_PORT1_ACTIVE |
758
				TDA9887_PORT2_ACTIVE,
759
		.decoder      = EM28XX_TVP5150,
760
		.has_msp34xx  = 1,
761
		.has_ir_i2c   = 1,
762
		.input        = { {
763
			.type     = EM28XX_VMUX_TELEVISION,
764
			.vmux     = TVP5150_COMPOSITE0,
765
			.amux     = MSP_INPUT_DEFAULT,
766
		}, {
767
			.type     = EM28XX_VMUX_SVIDEO,
768
			.vmux     = TVP5150_SVIDEO,
769 770
			.amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
					MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
771
		} },
772
	},
773 774 775 776 777
	[EM2820_BOARD_DLINK_USB_TV] = {
		.name         = "D-Link DUB-T210 TV Tuner",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
		.tda9887_conf = TDA9887_PRESENT,
778
		.decoder      = EM28XX_SAA711X,
779
		.input        = { {
780 781
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
782
			.amux     = EM28XX_AMUX_LINE_IN,
783
		}, {
784
			.type     = EM28XX_VMUX_COMPOSITE,
785
			.vmux     = SAA7115_COMPOSITE0,
786
			.amux     = EM28XX_AMUX_LINE_IN,
787 788 789
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
790
			.amux     = EM28XX_AMUX_LINE_IN,
791 792 793 794 795 796 797
		} },
	},
	[EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
		.name         = "Hercules Smart TV USB 2.0",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
		.tda9887_conf = TDA9887_PRESENT,
798
		.decoder      = EM28XX_SAA711X,
799 800 801
		.input        = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
802
			.amux     = EM28XX_AMUX_LINE_IN,
803
		}, {
804
			.type     = EM28XX_VMUX_COMPOSITE,
805
			.vmux     = SAA7115_COMPOSITE0,
806
			.amux     = EM28XX_AMUX_LINE_IN,
807 808 809
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
810
			.amux     = EM28XX_AMUX_LINE_IN,
811 812 813 814 815 816 817
		} },
	},
	[EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
		.name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
		.tda9887_conf = TDA9887_PRESENT,
818
		.decoder      = EM28XX_SAA711X,
819
		.input        = { {
820 821
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
822
			.amux     = EM28XX_AMUX_VIDEO,
823
		}, {
824
			.type     = EM28XX_VMUX_COMPOSITE,
825
			.vmux     = SAA7115_COMPOSITE0,
826
			.amux     = EM28XX_AMUX_LINE_IN,
827 828 829
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
830
			.amux     = EM28XX_AMUX_LINE_IN,
831 832 833 834 835 836 837
		} },
	},
	[EM2820_BOARD_GADMEI_UTV310] = {
		.name         = "Gadmei UTV310",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_TNF_5335MF,
		.tda9887_conf = TDA9887_PRESENT,
838
		.decoder      = EM28XX_SAA711X,
839
		.input        = { {
840 841
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE1,
842
			.amux     = EM28XX_AMUX_LINE_IN,
843
		}, {
844
			.type     = EM28XX_VMUX_COMPOSITE,
845
			.vmux     = SAA7115_COMPOSITE0,
846
			.amux     = EM28XX_AMUX_LINE_IN,
847 848 849
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
850
			.amux     = EM28XX_AMUX_LINE_IN,
851 852 853 854 855 856
		} },
	},
	[EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
		.name         = "Leadtek Winfast USB II Deluxe",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
857 858 859 860 861
		.has_ir_i2c   = 1,
		.tvaudio_addr = 0x58,
		.tda9887_conf = TDA9887_PRESENT |
				TDA9887_PORT2_ACTIVE |
				TDA9887_QSS,
862
		.decoder      = EM28XX_SAA711X,
863
		.adecoder     = EM28XX_TVAUDIO,
864
		.input        = { {
865
			.type     = EM28XX_VMUX_TELEVISION,
866 867
			.vmux     = SAA7115_COMPOSITE4,
			.amux     = EM28XX_AMUX_AUX,
868
		}, {
869
			.type     = EM28XX_VMUX_COMPOSITE,
870
			.vmux     = SAA7115_COMPOSITE5,
871
			.amux     = EM28XX_AMUX_LINE_IN,
872 873
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
874
			.vmux     = SAA7115_SVIDEO3,
875
			.amux     = EM28XX_AMUX_LINE_IN,
876
		} },
877 878 879 880
			.radio	  = {
			.type     = EM28XX_RADIO,
			.amux     = EM28XX_AMUX_AUX,
			}
881 882
	},
	[EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
883
		.name         = "Videology 20K14XUSB USB2.0",
884
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
885 886
		.tuner_type   = TUNER_ABSENT,
		.is_webcam    = 1,
887
		.input        = { {
888
			.type     = EM28XX_VMUX_COMPOSITE,
889
			.vmux     = 0,
890
			.amux     = EM28XX_AMUX_VIDEO,
891 892
		} },
	},
893 894 895
	[EM2820_BOARD_SILVERCREST_WEBCAM] = {
		.name         = "Silvercrest Webcam 1.3mpix",
		.tuner_type   = TUNER_ABSENT,
896
		.is_webcam    = 1,
897
		.input        = { {
898
			.type     = EM28XX_VMUX_COMPOSITE,
899 900 901 902 903
			.vmux     = 0,
			.amux     = EM28XX_AMUX_VIDEO,
			.gpio     = silvercrest_reg_seq,
		} },
	},
904 905 906 907 908 909 910
	[EM2821_BOARD_SUPERCOMP_USB_2] = {
		.name         = "Supercomp USB 2.0 TV",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,
		.tda9887_conf = TDA9887_PRESENT |
				TDA9887_PORT1_ACTIVE |
				TDA9887_PORT2_ACTIVE,
911
		.decoder      = EM28XX_SAA711X,
912
		.input        = { {
913 914
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
915
			.amux     = EM28XX_AMUX_LINE_IN,
916
		}, {
917
			.type     = EM28XX_VMUX_COMPOSITE,
918
			.vmux     = SAA7115_COMPOSITE0,
919
			.amux     = EM28XX_AMUX_VIDEO,
920 921 922
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
923
			.amux     = EM28XX_AMUX_LINE_IN,
924 925 926
		} },
	},
	[EM2821_BOARD_USBGEAR_VD204] = {
927
		.name         = "Usbgear VD204v9",
928
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
929
		.tuner_type   = TUNER_ABSENT,	/* Capture only device */
930
		.decoder      = EM28XX_SAA711X,
931
		.input        = { {
932
			.type  = EM28XX_VMUX_COMPOSITE,
933
			.vmux  = SAA7115_COMPOSITE0,
934
			.amux  = EM28XX_AMUX_LINE_IN,
935 936 937
		}, {
			.type  = EM28XX_VMUX_SVIDEO,
			.vmux  = SAA7115_SVIDEO3,
938
			.amux  = EM28XX_AMUX_LINE_IN,
939 940 941 942
		} },
	},
	[EM2860_BOARD_NETGMBH_CAM] = {
		/* Beijing Huaqi Information Digital Technology Co., Ltd */
943 944
		.name         = "NetGMBH Cam",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
945 946
		.tuner_type   = TUNER_ABSENT,
		.is_webcam    = 1,
947
		.input        = { {
948
			.type     = EM28XX_VMUX_COMPOSITE,
949
			.vmux     = 0,
950
			.amux     = EM28XX_AMUX_VIDEO,
951 952 953
		} },
	},
	[EM2860_BOARD_TYPHOON_DVD_MAKER] = {
954
		.name         = "Typhoon DVD Maker",
955
		.decoder      = EM28XX_SAA711X,
956
		.tuner_type   = TUNER_ABSENT,	/* Capture only device */
957
		.input        = { {
958
			.type  = EM28XX_VMUX_COMPOSITE,
959
			.vmux  = SAA7115_COMPOSITE0,
960
			.amux  = EM28XX_AMUX_LINE_IN,
961 962 963
		}, {
			.type  = EM28XX_VMUX_SVIDEO,
			.vmux  = SAA7115_SVIDEO3,
964
			.amux  = EM28XX_AMUX_LINE_IN,
965 966 967 968 969 970
		} },
	},
	[EM2860_BOARD_GADMEI_UTV330] = {
		.name         = "Gadmei UTV330",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_TNF_5335MF,
971
		.tda9887_conf = TDA9887_PRESENT,
972
		.decoder      = EM28XX_SAA711X,
973
		.input        = { {
974 975
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
976
			.amux     = EM28XX_AMUX_VIDEO,
977
		}, {
978
			.type     = EM28XX_VMUX_COMPOSITE,
979
			.vmux     = SAA7115_COMPOSITE0,
980
			.amux     = EM28XX_AMUX_LINE_IN,
981 982 983
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
984
			.amux     = EM28XX_AMUX_LINE_IN,
985 986
		} },
	},
987 988 989 990
	[EM2861_BOARD_GADMEI_UTV330PLUS] = {
		.name         = "Gadmei UTV330+",
		.tuner_type   = TUNER_TNF_5335MF,
		.tda9887_conf = TDA9887_PRESENT,
991
		.ir_codes     = RC_MAP_GADMEI_RM008Z,
992 993 994 995 996 997 998
		.decoder      = EM28XX_SAA711X,
		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
		.input        = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
			.amux     = EM28XX_AMUX_VIDEO,
		}, {
999
			.type     = EM28XX_VMUX_COMPOSITE,
1000 1001 1002 1003 1004 1005 1006 1007
			.vmux     = SAA7115_COMPOSITE0,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
			.amux     = EM28XX_AMUX_LINE_IN,
		} },
	},
1008 1009 1010
	[EM2860_BOARD_TERRATEC_HYBRID_XS] = {
		.name         = "Terratec Cinergy A Hybrid XS",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1011
		.tuner_type   = TUNER_XC2028,
1012
		.tuner_gpio   = default_tuner_gpio,
1013
		.decoder      = EM28XX_TVP5150,
1014

1015
		.input        = { {
1016 1017
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1018
			.amux     = EM28XX_AMUX_VIDEO,
1019
			.gpio     = hauppauge_wintv_hvr_900_analog,
1020
		}, {
1021
			.type     = EM28XX_VMUX_COMPOSITE,
1022
			.vmux     = TVP5150_COMPOSITE1,
1023
			.amux     = EM28XX_AMUX_LINE_IN,
1024
			.gpio     = hauppauge_wintv_hvr_900_analog,
1025
		}, {
1026 1027
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1028
			.amux     = EM28XX_AMUX_LINE_IN,
1029
			.gpio     = hauppauge_wintv_hvr_900_analog,
1030
		} },
1031
	},
1032 1033 1034
	[EM2861_BOARD_KWORLD_PVRTV_300U] = {
		.name	      = "KWorld PVRTV 300U",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1035
		.tuner_type   = TUNER_XC2028,
1036
		.tuner_gpio   = default_tuner_gpio,
1037
		.decoder      = EM28XX_TVP5150,
1038
		.input        = { {
1039 1040
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1041
			.amux     = EM28XX_AMUX_VIDEO,
1042
		}, {
1043
			.type     = EM28XX_VMUX_COMPOSITE,
1044
			.vmux     = TVP5150_COMPOSITE1,
1045
			.amux     = EM28XX_AMUX_LINE_IN,
1046 1047 1048
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1049
			.amux     = EM28XX_AMUX_LINE_IN,
1050 1051
		} },
	},
1052 1053
	[EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
		.name          = "Yakumo MovieMixer",
1054
		.tuner_type    = TUNER_ABSENT,	/* Capture only device */
1055 1056
		.decoder       = EM28XX_TVP5150,
		.input         = { {
1057 1058
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1059
			.amux     = EM28XX_AMUX_VIDEO,
1060
		}, {
1061
			.type     = EM28XX_VMUX_COMPOSITE,
1062
			.vmux     = TVP5150_COMPOSITE1,
1063
			.amux     = EM28XX_AMUX_LINE_IN,
1064
		}, {
1065 1066
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1067
			.amux     = EM28XX_AMUX_LINE_IN,
1068
		} },
1069
	},
1070 1071 1072 1073 1074
	[EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = {
		.name          = "EM2860/TVP5150 Reference Design",
		.tuner_type    = TUNER_ABSENT,	/* Capture only device */
		.decoder       = EM28XX_TVP5150,
		.input         = { {
1075
			.type     = EM28XX_VMUX_COMPOSITE,
1076 1077 1078 1079 1080 1081 1082 1083
			.vmux     = TVP5150_COMPOSITE1,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
			.amux     = EM28XX_AMUX_LINE_IN,
		} },
	},
1084 1085 1086
	[EM2861_BOARD_PLEXTOR_PX_TV100U] = {
		.name         = "Plextor ConvertX PX-TV100U",
		.tuner_type   = TUNER_TNF_5335MF,
1087 1088
		.xclk         = EM28XX_XCLK_I2S_MSB_TIMING |
				EM28XX_XCLK_FREQUENCY_12MHZ,
1089 1090
		.tda9887_conf = TDA9887_PRESENT,
		.decoder      = EM28XX_TVP5150,
1091
		.has_msp34xx  = 1,
1092
		.input        = { {
1093 1094
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1095
			.amux     = EM28XX_AMUX_LINE_IN,
1096
			.gpio     = pinnacle_hybrid_pro_analog,
1097
		}, {
1098
			.type     = EM28XX_VMUX_COMPOSITE,
1099
			.vmux     = TVP5150_COMPOSITE1,
1100
			.amux     = EM28XX_AMUX_LINE_IN,
1101
			.gpio     = pinnacle_hybrid_pro_analog,
1102 1103 1104
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1105
			.amux     = EM28XX_AMUX_LINE_IN,
1106
			.gpio     = pinnacle_hybrid_pro_analog,
1107 1108
		} },
	},
1109 1110 1111

	/* Those boards with em2870 are DVB Only*/

1112 1113 1114 1115
	[EM2870_BOARD_TERRATEC_XS] = {
		.name         = "Terratec Cinergy T XS",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_XC2028,
1116
		.tuner_gpio   = default_tuner_gpio,
1117 1118 1119
	},
	[EM2870_BOARD_TERRATEC_XS_MT2060] = {
		.name         = "Terratec Cinergy T XS (MT2060)",
1120 1121 1122
		.xclk         = EM28XX_XCLK_IR_RC5_MODE |
				EM28XX_XCLK_FREQUENCY_12MHZ,
		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,
1123
		.tuner_type   = TUNER_ABSENT, /* MT2060 */
1124 1125
		.has_dvb      = 1,
		.tuner_gpio   = default_tuner_gpio,
1126 1127 1128 1129 1130
	},
	[EM2870_BOARD_KWORLD_350U] = {
		.name         = "Kworld 350 U DVB-T",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_XC2028,
1131
		.tuner_gpio   = default_tuner_gpio,
1132 1133 1134 1135
	},
	[EM2870_BOARD_KWORLD_355U] = {
		.name         = "Kworld 355 U DVB-T",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
A
Aivar Päkk 已提交
1136 1137 1138 1139
		.tuner_type   = TUNER_ABSENT,
		.tuner_gpio   = default_tuner_gpio,
		.has_dvb      = 1,
		.dvb_gpio     = default_digital,
1140 1141 1142 1143 1144
	},
	[EM2870_BOARD_PINNACLE_PCTV_DVB] = {
		.name         = "Pinnacle PCTV DVB-T",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_ABSENT, /* MT2060 */
1145 1146 1147
		/* djh - I have serious doubts this is right... */
		.xclk         = EM28XX_XCLK_IR_RC5_MODE |
				EM28XX_XCLK_FREQUENCY_10MHZ,
1148 1149 1150 1151 1152 1153
	},
	[EM2870_BOARD_COMPRO_VIDEOMATE] = {
		.name         = "Compro, VideoMate U3",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_ABSENT, /* MT2060 */
	},
1154

1155 1156 1157 1158
	[EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
		.name         = "Terratec Hybrid XS Secam",
		.has_msp34xx  = 1,
		.tuner_type   = TUNER_XC2028,
1159
		.tuner_gpio   = default_tuner_gpio,
1160
		.decoder      = EM28XX_TVP5150,
1161
		.has_dvb      = 1,
1162
		.dvb_gpio     = terratec_cinergy_USB_XS_FR_digital,
1163
		.input        = { {
1164 1165
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1166
			.amux     = EM28XX_AMUX_VIDEO,
1167
			.gpio     = terratec_cinergy_USB_XS_FR_analog,
1168
		}, {
1169
			.type     = EM28XX_VMUX_COMPOSITE,
1170
			.vmux     = TVP5150_COMPOSITE1,
1171
			.amux     = EM28XX_AMUX_LINE_IN,
1172
			.gpio     = terratec_cinergy_USB_XS_FR_analog,
1173 1174 1175
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1176
			.amux     = EM28XX_AMUX_LINE_IN,
1177
			.gpio     = terratec_cinergy_USB_XS_FR_analog,
1178 1179
		} },
	},
1180 1181 1182 1183 1184 1185 1186 1187
	[EM2884_BOARD_TERRATEC_H5] = {
		.name         = "Terratec Cinergy H5",
		.has_dvb      = 1,
#if 0
		.tuner_type   = TUNER_PHILIPS_TDA8290,
		.tuner_addr   = 0x41,
		.dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */
		.tuner_gpio   = terratec_h5_gpio,
1188 1189
#else
		.tuner_type   = TUNER_ABSENT,
1190
#endif
1191 1192
		.def_i2c_bus  = 1,
		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1193 1194
				EM28XX_I2C_FREQ_400_KHZ,
	},
1195 1196 1197
	[EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
		.name         = "Hauppauge WinTV HVR 930C",
		.has_dvb      = 1,
1198 1199 1200 1201
#if 0 /* FIXME: Add analog support */
		.tuner_type   = TUNER_XC5000,
		.tuner_addr   = 0x41,
		.dvb_gpio     = hauppauge_930c_digital,
1202
		.tuner_gpio   = hauppauge_930c_gpio,
1203 1204 1205
#else
		.tuner_type   = TUNER_ABSENT,
#endif
1206
		.ir_codes     = RC_MAP_HAUPPAUGE,
1207 1208
		.def_i2c_bus  = 1,
		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1209 1210
				EM28XX_I2C_FREQ_400_KHZ,
	},
1211 1212 1213 1214 1215 1216 1217 1218 1219 1220
	[EM2884_BOARD_C3TECH_DIGITAL_DUO] = {
		.name         = "C3 Tech Digital Duo HDTV/SDTV USB",
		.has_dvb      = 1,
		/* FIXME: Add analog support - need a saa7136 driver */
		.tuner_type = TUNER_ABSENT,	/* Digital-only TDA18271HD */
		.ir_codes     = RC_MAP_EMPTY,
		.def_i2c_bus  = 1,
		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,
		.dvb_gpio     = c3tech_digital_duo_digital,
	},
1221 1222 1223
	[EM2884_BOARD_CINERGY_HTC_STICK] = {
		.name         = "Terratec Cinergy HTC Stick",
		.has_dvb      = 1,
1224
		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
1225
		.tuner_type   = TUNER_ABSENT,
1226 1227
		.def_i2c_bus  = 1,
		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1228 1229
				EM28XX_I2C_FREQ_400_KHZ,
	},
1230 1231 1232 1233 1234 1235 1236 1237 1238
	[EM2884_BOARD_ELGATO_EYETV_HYBRID_2008] = {
		.name         = "Elgato EyeTV Hybrid 2008 INT",
		.has_dvb      = 1,
		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
		.tuner_type   = TUNER_ABSENT,
		.def_i2c_bus  = 1,
		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
				EM28XX_I2C_FREQ_400_KHZ,
	},
1239 1240 1241 1242
	[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
		.name         = "Hauppauge WinTV HVR 900",
		.tda9887_conf = TDA9887_PRESENT,
		.tuner_type   = TUNER_XC2028,
1243
		.tuner_gpio   = default_tuner_gpio,
1244
		.mts_firmware = 1,
1245
		.has_dvb      = 1,
1246
		.dvb_gpio     = hauppauge_wintv_hvr_900_digital,
1247
		.ir_codes     = RC_MAP_HAUPPAUGE,
1248
		.decoder      = EM28XX_TVP5150,
1249
		.input        = { {
1250 1251
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1252
			.amux     = EM28XX_AMUX_VIDEO,
1253
			.gpio     = hauppauge_wintv_hvr_900_analog,
1254
		}, {
1255
			.type     = EM28XX_VMUX_COMPOSITE,
1256
			.vmux     = TVP5150_COMPOSITE1,
1257
			.amux     = EM28XX_AMUX_LINE_IN,
1258
			.gpio     = hauppauge_wintv_hvr_900_analog,
1259 1260 1261
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1262
			.amux     = EM28XX_AMUX_LINE_IN,
1263
			.gpio     = hauppauge_wintv_hvr_900_analog,
1264 1265 1266 1267 1268 1269
		} },
	},
	[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
		.name         = "Hauppauge WinTV HVR 900 (R2)",
		.tda9887_conf = TDA9887_PRESENT,
		.tuner_type   = TUNER_XC2028,
1270
		.tuner_gpio   = default_tuner_gpio,
1271
		.mts_firmware = 1,
1272
		.has_dvb      = 1,
1273
		.dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
1274
		.ir_codes     = RC_MAP_HAUPPAUGE,
1275
		.decoder      = EM28XX_TVP5150,
1276
		.input        = { {
1277 1278
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1279
			.amux     = EM28XX_AMUX_VIDEO,
1280
			.gpio     = hauppauge_wintv_hvr_900_analog,
1281
		}, {
1282
			.type     = EM28XX_VMUX_COMPOSITE,
1283
			.vmux     = TVP5150_COMPOSITE1,
1284
			.amux     = EM28XX_AMUX_LINE_IN,
1285
			.gpio     = hauppauge_wintv_hvr_900_analog,
1286 1287 1288
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1289
			.amux     = EM28XX_AMUX_LINE_IN,
1290
			.gpio     = hauppauge_wintv_hvr_900_analog,
1291 1292
		} },
	},
1293 1294 1295 1296 1297 1298 1299
	[EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
		.name           = "Hauppauge WinTV HVR 850",
		.tuner_type     = TUNER_XC2028,
		.tuner_gpio     = default_tuner_gpio,
		.mts_firmware   = 1,
		.has_dvb        = 1,
		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1300
		.ir_codes       = RC_MAP_HAUPPAUGE,
1301 1302 1303 1304 1305 1306 1307
		.decoder        = EM28XX_TVP5150,
		.input          = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
			.amux     = EM28XX_AMUX_VIDEO,
			.gpio     = hauppauge_wintv_hvr_900_analog,
		}, {
1308
			.type     = EM28XX_VMUX_COMPOSITE,
1309 1310 1311 1312 1313 1314 1315 1316 1317 1318
			.vmux     = TVP5150_COMPOSITE1,
			.amux     = EM28XX_AMUX_LINE_IN,
			.gpio     = hauppauge_wintv_hvr_900_analog,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
			.amux     = EM28XX_AMUX_LINE_IN,
			.gpio     = hauppauge_wintv_hvr_900_analog,
		} },
	},
1319
	[EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
1320 1321
		.name           = "Hauppauge WinTV HVR 950",
		.tuner_type     = TUNER_XC2028,
1322
		.tuner_gpio     = default_tuner_gpio,
1323 1324
		.mts_firmware   = 1,
		.has_dvb        = 1,
1325
		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1326
		.ir_codes       = RC_MAP_HAUPPAUGE,
1327 1328 1329 1330
		.decoder        = EM28XX_TVP5150,
		.input          = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1331
			.amux     = EM28XX_AMUX_VIDEO,
1332
			.gpio     = hauppauge_wintv_hvr_900_analog,
1333
		}, {
1334
			.type     = EM28XX_VMUX_COMPOSITE,
1335
			.vmux     = TVP5150_COMPOSITE1,
1336
			.amux     = EM28XX_AMUX_LINE_IN,
1337
			.gpio     = hauppauge_wintv_hvr_900_analog,
1338 1339 1340
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1341
			.amux     = EM28XX_AMUX_LINE_IN,
1342
			.gpio     = hauppauge_wintv_hvr_900_analog,
1343 1344 1345 1346 1347
		} },
	},
	[EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
		.name           = "Pinnacle PCTV HD Pro Stick",
		.tuner_type     = TUNER_XC2028,
1348
		.tuner_gpio   = default_tuner_gpio,
1349 1350
		.mts_firmware   = 1,
		.has_dvb        = 1,
1351
		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1352
		.ir_codes       = RC_MAP_PINNACLE_PCTV_HD,
1353 1354 1355 1356
		.decoder        = EM28XX_TVP5150,
		.input          = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1357
			.amux     = EM28XX_AMUX_VIDEO,
1358
			.gpio     = hauppauge_wintv_hvr_900_analog,
1359
		}, {
1360
			.type     = EM28XX_VMUX_COMPOSITE,
1361
			.vmux     = TVP5150_COMPOSITE1,
1362
			.amux     = EM28XX_AMUX_LINE_IN,
1363
			.gpio     = hauppauge_wintv_hvr_900_analog,
1364 1365 1366
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1367
			.amux     = EM28XX_AMUX_LINE_IN,
1368
			.gpio     = hauppauge_wintv_hvr_900_analog,
1369 1370 1371 1372 1373
		} },
	},
	[EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
		.name           = "AMD ATI TV Wonder HD 600",
		.tuner_type     = TUNER_XC2028,
1374
		.tuner_gpio     = default_tuner_gpio,
1375 1376
		.mts_firmware   = 1,
		.has_dvb        = 1,
1377
		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1378
		.ir_codes       = RC_MAP_ATI_TV_WONDER_HD_600,
1379 1380 1381 1382
		.decoder        = EM28XX_TVP5150,
		.input          = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1383
			.amux     = EM28XX_AMUX_VIDEO,
1384
			.gpio     = hauppauge_wintv_hvr_900_analog,
1385
		}, {
1386
			.type     = EM28XX_VMUX_COMPOSITE,
1387
			.vmux     = TVP5150_COMPOSITE1,
1388
			.amux     = EM28XX_AMUX_LINE_IN,
1389
			.gpio     = hauppauge_wintv_hvr_900_analog,
1390 1391 1392
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1393
			.amux     = EM28XX_AMUX_LINE_IN,
1394
			.gpio     = hauppauge_wintv_hvr_900_analog,
1395 1396 1397
		} },
	},
	[EM2880_BOARD_TERRATEC_HYBRID_XS] = {
1398 1399
		.name           = "Terratec Hybrid XS",
		.tuner_type     = TUNER_XC2028,
1400
		.tuner_gpio     = default_tuner_gpio,
1401
		.decoder        = EM28XX_TVP5150,
1402
		.has_dvb        = 1,
1403
		.dvb_gpio       = default_digital,
1404
		.ir_codes       = RC_MAP_TERRATEC_CINERGY_XS,
1405
		.xclk           = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1406 1407 1408
		.input          = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1409
			.amux     = EM28XX_AMUX_VIDEO,
1410
			.gpio     = default_analog,
1411
		}, {
1412
			.type     = EM28XX_VMUX_COMPOSITE,
1413
			.vmux     = TVP5150_COMPOSITE1,
1414
			.amux     = EM28XX_AMUX_LINE_IN,
1415
			.gpio     = default_analog,
1416 1417 1418
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1419
			.amux     = EM28XX_AMUX_LINE_IN,
1420
			.gpio     = default_analog,
1421 1422 1423 1424 1425 1426 1427 1428
		} },
	},
	/* maybe there's a reason behind it why Terratec sells the Hybrid XS
	   as Prodigy XS with a different PID, let's keep it separated for now
	   maybe we'll need it lateron */
	[EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
		.name         = "Terratec Prodigy XS",
		.tuner_type   = TUNER_XC2028,
1429
		.tuner_gpio   = default_tuner_gpio,
1430
		.decoder      = EM28XX_TVP5150,
1431
		.input        = { {
1432 1433
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1434
			.amux     = EM28XX_AMUX_VIDEO,
1435
			.gpio     = hauppauge_wintv_hvr_900_analog,
1436
		}, {
1437
			.type     = EM28XX_VMUX_COMPOSITE,
1438
			.vmux     = TVP5150_COMPOSITE1,
1439
			.amux     = EM28XX_AMUX_LINE_IN,
1440
			.gpio     = hauppauge_wintv_hvr_900_analog,
1441 1442 1443
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1444
			.amux     = EM28XX_AMUX_LINE_IN,
1445
			.gpio     = hauppauge_wintv_hvr_900_analog,
1446 1447 1448 1449 1450 1451 1452 1453 1454
		} },
	},
	[EM2820_BOARD_MSI_VOX_USB_2] = {
		.name		   = "MSI VOX USB 2.0",
		.tuner_type	   = TUNER_LG_PAL_NEW_TAPC,
		.tda9887_conf	   = TDA9887_PRESENT      |
				     TDA9887_PORT1_ACTIVE |
				     TDA9887_PORT2_ACTIVE,
		.max_range_640_480 = 1,
1455
		.decoder           = EM28XX_SAA711X,
1456 1457 1458
		.input             = { {
			.type      = EM28XX_VMUX_TELEVISION,
			.vmux      = SAA7115_COMPOSITE4,
1459
			.amux      = EM28XX_AMUX_VIDEO,
1460
		}, {
1461
			.type      = EM28XX_VMUX_COMPOSITE,
1462
			.vmux      = SAA7115_COMPOSITE0,
1463
			.amux      = EM28XX_AMUX_LINE_IN,
1464 1465 1466
		}, {
			.type      = EM28XX_VMUX_SVIDEO,
			.vmux      = SAA7115_SVIDEO3,
1467
			.amux      = EM28XX_AMUX_LINE_IN,
1468 1469 1470 1471 1472
		} },
	},
	[EM2800_BOARD_TERRATEC_CINERGY_200] = {
		.name         = "Terratec Cinergy 200 USB",
		.is_em2800    = 1,
1473
		.has_ir_i2c   = 1,
1474
		.tuner_type   = TUNER_LG_TALN,
1475
		.tda9887_conf = TDA9887_PRESENT,
1476
		.decoder      = EM28XX_SAA711X,
1477
		.input        = { {
1478 1479
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
1480
			.amux     = EM28XX_AMUX_VIDEO,
1481
		}, {
1482
			.type     = EM28XX_VMUX_COMPOSITE,
1483
			.vmux     = SAA7115_COMPOSITE0,
1484
			.amux     = EM28XX_AMUX_LINE_IN,
1485 1486 1487
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
1488
			.amux     = EM28XX_AMUX_LINE_IN,
1489 1490 1491
		} },
	},
	[EM2800_BOARD_GRABBEEX_USB2800] = {
1492 1493 1494 1495 1496
		.name       = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
		.is_em2800  = 1,
		.decoder    = EM28XX_SAA711X,
		.tuner_type = TUNER_ABSENT, /* capture only board */
		.input      = { {
1497
			.type     = EM28XX_VMUX_COMPOSITE,
1498
			.vmux     = SAA7115_COMPOSITE0,
1499
			.amux     = EM28XX_AMUX_LINE_IN,
1500 1501 1502
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
1503
			.amux     = EM28XX_AMUX_LINE_IN,
1504 1505
		} },
	},
1506 1507 1508 1509 1510 1511
	[EM2800_BOARD_VC211A] = {
		.name         = "Actionmaster/LinXcel/Digitus VC211A",
		.is_em2800    = 1,
		.tuner_type   = TUNER_ABSENT,	/* Capture-only board */
		.decoder      = EM28XX_SAA711X,
		.input        = { {
1512
			.type     = EM28XX_VMUX_COMPOSITE,
1513 1514 1515 1516 1517 1518 1519 1520 1521 1522
			.vmux     = SAA7115_COMPOSITE0,
			.amux     = EM28XX_AMUX_LINE_IN,
			.gpio     = vc211a_enable,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
			.amux     = EM28XX_AMUX_LINE_IN,
			.gpio     = vc211a_enable,
		} },
	},
1523 1524 1525 1526 1527
	[EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
		.name         = "Leadtek Winfast USB II",
		.is_em2800    = 1,
		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
		.tda9887_conf = TDA9887_PRESENT,
1528
		.decoder      = EM28XX_SAA711X,
1529
		.input        = { {
1530 1531
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
1532
			.amux     = EM28XX_AMUX_VIDEO,
1533
		}, {
1534
			.type     = EM28XX_VMUX_COMPOSITE,
1535
			.vmux     = SAA7115_COMPOSITE0,
1536
			.amux     = EM28XX_AMUX_LINE_IN,
1537 1538 1539
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
1540
			.amux     = EM28XX_AMUX_LINE_IN,
1541 1542 1543 1544 1545 1546 1547
		} },
	},
	[EM2800_BOARD_KWORLD_USB2800] = {
		.name         = "Kworld USB2800",
		.is_em2800    = 1,
		.tuner_type   = TUNER_PHILIPS_FCV1236D,
		.tda9887_conf = TDA9887_PRESENT,
1548
		.decoder      = EM28XX_SAA711X,
1549
		.input        = { {
1550 1551
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
1552
			.amux     = EM28XX_AMUX_VIDEO,
1553
		}, {
1554
			.type     = EM28XX_VMUX_COMPOSITE,
1555
			.vmux     = SAA7115_COMPOSITE0,
1556
			.amux     = EM28XX_AMUX_LINE_IN,
1557 1558 1559
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
1560
			.amux     = EM28XX_AMUX_LINE_IN,
1561 1562 1563
		} },
	},
	[EM2820_BOARD_PINNACLE_DVC_90] = {
1564
		.name	      = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker / Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",
1565
		.tuner_type   = TUNER_ABSENT, /* capture only board */
1566
		.decoder      = EM28XX_SAA711X,
1567
		.input        = { {
1568
			.type     = EM28XX_VMUX_COMPOSITE,
1569
			.vmux     = SAA7115_COMPOSITE0,
1570
			.amux     = EM28XX_AMUX_LINE_IN,
1571 1572 1573
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
1574
			.amux     = EM28XX_AMUX_LINE_IN,
1575 1576 1577 1578 1579 1580 1581
		} },
	},
	[EM2800_BOARD_VGEAR_POCKETTV] = {
		.name         = "V-Gear PocketTV",
		.is_em2800    = 1,
		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
		.tda9887_conf = TDA9887_PRESENT,
1582
		.decoder      = EM28XX_SAA711X,
1583
		.input        = { {
1584 1585
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
1586
			.amux     = EM28XX_AMUX_VIDEO,
1587
		}, {
1588
			.type     = EM28XX_VMUX_COMPOSITE,
1589
			.vmux     = SAA7115_COMPOSITE0,
1590
			.amux     = EM28XX_AMUX_LINE_IN,
1591 1592 1593
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
1594
			.amux     = EM28XX_AMUX_LINE_IN,
1595 1596
		} },
	},
1597 1598 1599 1600 1601 1602 1603 1604 1605
	[EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
		.name         = "Pixelview PlayTV Box 4 USB 2.0",
		.tda9887_conf = TDA9887_PRESENT,
		.tuner_type   = TUNER_YMEC_TVF_5533MF,
		.decoder      = EM28XX_SAA711X,
		.input        = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
			.amux     = EM28XX_AMUX_VIDEO,
1606
			.aout     = EM28XX_AOUT_MONO |	/* I2S */
1607 1608
				    EM28XX_AOUT_MASTER,	/* Line out pin */
		}, {
1609
			.type     = EM28XX_VMUX_COMPOSITE,
1610 1611 1612 1613 1614 1615 1616 1617
			.vmux     = SAA7115_COMPOSITE0,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
			.amux     = EM28XX_AMUX_LINE_IN,
		} },
	},
1618
	[EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
1619
		.name         = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
1620
		.buttons = std_snapshot_button,
1621 1622
		.tda9887_conf = TDA9887_PRESENT,
		.tuner_type   = TUNER_YMEC_TVF_5533MF,
1623
		.tuner_addr   = 0x60,
1624
		.decoder      = EM28XX_SAA711X,
1625
		.input        = { {
1626 1627
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = SAA7115_COMPOSITE2,
1628
			.amux     = EM28XX_AMUX_VIDEO,
1629
			.aout     = EM28XX_AOUT_MONO |	/* I2S */
1630
				    EM28XX_AOUT_MASTER,	/* Line out pin */
1631
		}, {
1632
			.type     = EM28XX_VMUX_COMPOSITE,
1633 1634 1635 1636 1637 1638 1639 1640
			.vmux     = SAA7115_COMPOSITE0,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
			.amux     = EM28XX_AMUX_LINE_IN,
		} },
	},
1641 1642
	[EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
		.name                = "EM2860/SAA711X Reference Design",
1643
		.buttons = std_snapshot_button,
1644
		.tuner_type          = TUNER_ABSENT,
1645
		.decoder             = EM28XX_SAA711X,
1646
		.input               = { {
1647 1648
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
1649
		}, {
1650
			.type     = EM28XX_VMUX_COMPOSITE,
1651
			.vmux     = SAA7115_COMPOSITE0,
1652 1653
		} },
	},
1654

1655
	[EM2874_BOARD_LEADERSHIP_ISDBT] = {
1656 1657
		.def_i2c_bus	= 1,
		.i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |
1658 1659 1660 1661 1662 1663 1664 1665 1666
				  EM28XX_I2C_FREQ_100_KHZ,
		.xclk		= EM28XX_XCLK_FREQUENCY_10MHZ,
		.name		= "EM2874 Leadership ISDBT",
		.tuner_type	= TUNER_ABSENT,
		.tuner_gpio     = leadership_reset,
		.dvb_gpio       = leadership_digital,
		.has_dvb	= 1,
	},

1667 1668 1669 1670
	[EM2880_BOARD_MSI_DIGIVOX_AD] = {
		.name         = "MSI DigiVox A/D",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_XC2028,
1671
		.tuner_gpio   = default_tuner_gpio,
1672
		.decoder      = EM28XX_TVP5150,
1673
		.input        = { {
1674 1675
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1676
			.amux     = EM28XX_AMUX_VIDEO,
1677
			.gpio     = em2880_msi_digivox_ad_analog,
1678
		}, {
1679
			.type     = EM28XX_VMUX_COMPOSITE,
1680
			.vmux     = TVP5150_COMPOSITE1,
1681
			.amux     = EM28XX_AMUX_LINE_IN,
1682
			.gpio     = em2880_msi_digivox_ad_analog,
1683 1684 1685
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1686
			.amux     = EM28XX_AMUX_LINE_IN,
1687
			.gpio     = em2880_msi_digivox_ad_analog,
1688 1689 1690 1691 1692 1693
		} },
	},
	[EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
		.name         = "MSI DigiVox A/D II",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_XC2028,
1694
		.tuner_gpio   = default_tuner_gpio,
1695
		.decoder      = EM28XX_TVP5150,
1696
		.input        = { {
1697 1698
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1699
			.amux     = EM28XX_AMUX_VIDEO,
1700
			.gpio     = em2880_msi_digivox_ad_analog,
1701
		}, {
1702
			.type     = EM28XX_VMUX_COMPOSITE,
1703
			.vmux     = TVP5150_COMPOSITE1,
1704
			.amux     = EM28XX_AMUX_LINE_IN,
1705
			.gpio     = em2880_msi_digivox_ad_analog,
1706 1707 1708
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1709
			.amux     = EM28XX_AMUX_LINE_IN,
1710
			.gpio     = em2880_msi_digivox_ad_analog,
1711 1712
		} },
	},
1713 1714
	[EM2880_BOARD_KWORLD_DVB_305U] = {
		.name	      = "KWorld DVB-T 305U",
1715
		.tuner_type   = TUNER_XC2028,
1716
		.tuner_gpio   = default_tuner_gpio,
1717
		.decoder      = EM28XX_TVP5150,
1718
		.input        = { {
1719 1720
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1721
			.amux     = EM28XX_AMUX_VIDEO,
1722
		}, {
1723
			.type     = EM28XX_VMUX_COMPOSITE,
1724
			.vmux     = TVP5150_COMPOSITE1,
1725
			.amux     = EM28XX_AMUX_LINE_IN,
1726
		}, {
1727 1728
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1729
			.amux     = EM28XX_AMUX_LINE_IN,
1730
		} },
1731
	},
1732 1733
	[EM2880_BOARD_KWORLD_DVB_310U] = {
		.name	      = "KWorld DVB-T 310U",
1734
		.tuner_type   = TUNER_XC2028,
1735
		.tuner_gpio   = default_tuner_gpio,
1736
		.has_dvb      = 1,
1737
		.dvb_gpio     = default_digital,
1738
		.mts_firmware = 1,
1739
		.decoder      = EM28XX_TVP5150,
1740
		.input        = { {
1741 1742
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1743
			.amux     = EM28XX_AMUX_VIDEO,
1744
			.gpio     = default_analog,
1745
		}, {
1746
			.type     = EM28XX_VMUX_COMPOSITE,
1747
			.vmux     = TVP5150_COMPOSITE1,
1748
			.amux     = EM28XX_AMUX_LINE_IN,
1749
			.gpio     = default_analog,
1750
		}, {	/* S-video has not been tested yet */
1751 1752
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
1753
			.amux     = EM28XX_AMUX_LINE_IN,
1754
			.gpio     = default_analog,
1755
		} },
1756
	},
1757 1758 1759 1760 1761 1762 1763 1764 1765
	[EM2882_BOARD_KWORLD_ATSC_315U] = {
		.name		= "KWorld ATSC 315U HDTV TV Box",
		.valid		= EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type	= TUNER_THOMSON_DTT761X,
		.tuner_gpio	= em2882_kworld_315u_tuner_gpio,
		.tda9887_conf	= TDA9887_PRESENT,
		.decoder	= EM28XX_SAA711X,
		.has_dvb	= 1,
		.dvb_gpio	= em2882_kworld_315u_digital,
1766
		.ir_codes	= RC_MAP_KWORLD_315U,
1767 1768 1769 1770 1771 1772 1773 1774 1775 1776
		.xclk		= EM28XX_XCLK_FREQUENCY_12MHZ,
		.i2c_speed	= EM28XX_I2C_CLK_WAIT_ENABLE,
		/* Analog mode - still not ready */
		/*.input        = { {
			.type = EM28XX_VMUX_TELEVISION,
			.vmux = SAA7115_COMPOSITE2,
			.amux = EM28XX_AMUX_VIDEO,
			.gpio = em2882_kworld_315u_analog,
			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
		}, {
1777
			.type = EM28XX_VMUX_COMPOSITE,
1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
			.vmux = SAA7115_COMPOSITE0,
			.amux = EM28XX_AMUX_LINE_IN,
			.gpio = em2882_kworld_315u_analog1,
			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
		}, {
			.type = EM28XX_VMUX_SVIDEO,
			.vmux = SAA7115_SVIDEO3,
			.amux = EM28XX_AMUX_LINE_IN,
			.gpio = em2882_kworld_315u_analog1,
			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
		} }, */
	},
1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803
	[EM2880_BOARD_EMPIRE_DUAL_TV] = {
		.name = "Empire dual TV",
		.tuner_type = TUNER_XC2028,
		.tuner_gpio = default_tuner_gpio,
		.has_dvb = 1,
		.dvb_gpio = default_digital,
		.mts_firmware = 1,
		.decoder = EM28XX_TVP5150,
		.input = { {
			.type = EM28XX_VMUX_TELEVISION,
			.vmux = TVP5150_COMPOSITE0,
			.amux = EM28XX_AMUX_VIDEO,
			.gpio = default_analog,
		}, {
1804
			.type = EM28XX_VMUX_COMPOSITE,
1805 1806 1807 1808 1809 1810 1811 1812 1813 1814
			.vmux = TVP5150_COMPOSITE1,
			.amux = EM28XX_AMUX_LINE_IN,
			.gpio = default_analog,
		}, {
			.type = EM28XX_VMUX_SVIDEO,
			.vmux = TVP5150_SVIDEO,
			.amux = EM28XX_AMUX_LINE_IN,
			.gpio = default_analog,
		} },
	},
1815 1816 1817 1818
	[EM2881_BOARD_DNT_DA2_HYBRID] = {
		.name         = "DNT DA2 Hybrid",
		.valid        = EM28XX_BOARD_NOT_VALIDATED,
		.tuner_type   = TUNER_XC2028,
1819
		.tuner_gpio   = default_tuner_gpio,
1820
		.decoder      = EM28XX_TVP5150,
1821
		.input        = { {
1822
			.type     = EM28XX_VMUX_TELEVISION,
1823
			.vmux     = TVP5150_COMPOSITE0,
1824
			.amux     = EM28XX_AMUX_VIDEO,
1825
			.gpio     = default_analog,
1826
		}, {
1827
			.type     = EM28XX_VMUX_COMPOSITE,
1828
			.vmux     = TVP5150_COMPOSITE1,
1829
			.amux     = EM28XX_AMUX_LINE_IN,
1830
			.gpio     = default_analog,
1831
		}, {
1832
			.type     = EM28XX_VMUX_SVIDEO,
1833
			.vmux     = TVP5150_SVIDEO,
1834
			.amux     = EM28XX_AMUX_LINE_IN,
1835
			.gpio     = default_analog,
1836
		} },
1837
	},
1838 1839 1840
	[EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
		.name         = "Pinnacle Hybrid Pro",
		.tuner_type   = TUNER_XC2028,
1841
		.tuner_gpio   = default_tuner_gpio,
1842
		.decoder      = EM28XX_TVP5150,
1843 1844
		.has_dvb      = 1,
		.dvb_gpio     = pinnacle_hybrid_pro_digital,
1845
		.input        = { {
1846 1847
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1848
			.amux     = EM28XX_AMUX_VIDEO,
1849
			.gpio     = pinnacle_hybrid_pro_analog,
1850
		}, {
1851
			.type     = EM28XX_VMUX_COMPOSITE,
1852
			.vmux     = TVP5150_COMPOSITE1,
1853
			.amux     = EM28XX_AMUX_LINE_IN,
1854
			.gpio     = pinnacle_hybrid_pro_analog,
1855 1856
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
1857
			.vmux     = TVP5150_SVIDEO,
1858
			.amux     = EM28XX_AMUX_LINE_IN,
1859
			.gpio     = pinnacle_hybrid_pro_analog,
1860 1861
		} },
	},
1862 1863
	[EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {
		.name         = "Pinnacle Hybrid Pro (330e)",
1864
		.tuner_type   = TUNER_XC2028,
1865
		.tuner_gpio   = default_tuner_gpio,
1866
		.mts_firmware = 1,
1867 1868
		.has_dvb      = 1,
		.dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
1869
		.ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
1870
		.decoder      = EM28XX_TVP5150,
1871
		.input        = { {
1872
			.type     = EM28XX_VMUX_TELEVISION,
1873
			.vmux     = TVP5150_COMPOSITE0,
1874
			.amux     = EM28XX_AMUX_VIDEO,
1875
			.gpio     = hauppauge_wintv_hvr_900_analog,
1876
		}, {
1877
			.type     = EM28XX_VMUX_COMPOSITE,
1878
			.vmux     = TVP5150_COMPOSITE1,
1879
			.amux     = EM28XX_AMUX_LINE_IN,
1880
			.gpio     = hauppauge_wintv_hvr_900_analog,
1881
		}, {
1882
			.type     = EM28XX_VMUX_SVIDEO,
1883
			.vmux     = TVP5150_SVIDEO,
1884
			.amux     = EM28XX_AMUX_LINE_IN,
1885
			.gpio     = hauppauge_wintv_hvr_900_analog,
1886
		} },
1887
	},
1888 1889 1890
	[EM2882_BOARD_KWORLD_VS_DVBT] = {
		.name         = "Kworld VS-DVB-T 323UR",
		.tuner_type   = TUNER_XC2028,
1891
		.tuner_gpio   = default_tuner_gpio,
1892
		.decoder      = EM28XX_TVP5150,
1893 1894 1895 1896
		.mts_firmware = 1,
		.has_dvb      = 1,
		.dvb_gpio     = kworld_330u_digital,
		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1897
		.ir_codes     = RC_MAP_KWORLD_315U,
1898
		.input        = { {
1899
			.type     = EM28XX_VMUX_TELEVISION,
1900
			.vmux     = TVP5150_COMPOSITE0,
1901
			.amux     = EM28XX_AMUX_VIDEO,
1902
		}, {
1903
			.type     = EM28XX_VMUX_COMPOSITE,
1904
			.vmux     = TVP5150_COMPOSITE1,
1905
			.amux     = EM28XX_AMUX_LINE_IN,
1906
		}, {
1907
			.type     = EM28XX_VMUX_SVIDEO,
1908
			.vmux     = TVP5150_SVIDEO,
1909
			.amux     = EM28XX_AMUX_LINE_IN,
1910
		} },
1911
	},
1912
	[EM2882_BOARD_TERRATEC_HYBRID_XS] = {
1913
		.name         = "Terratec Cinnergy Hybrid T USB XS (em2882)",
1914
		.tuner_type   = TUNER_XC2028,
1915
		.tuner_gpio   = default_tuner_gpio,
1916
		.mts_firmware = 1,
1917
		.decoder      = EM28XX_TVP5150,
1918 1919
		.has_dvb      = 1,
		.dvb_gpio     = hauppauge_wintv_hvr_900_digital,
1920
		.ir_codes     = RC_MAP_TERRATEC_CINERGY_XS,
1921
		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
1922
		.input        = { {
1923 1924
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1925
			.amux     = EM28XX_AMUX_VIDEO,
1926
			.gpio     = hauppauge_wintv_hvr_900_analog,
1927
		}, {
1928
			.type     = EM28XX_VMUX_COMPOSITE,
1929
			.vmux     = TVP5150_COMPOSITE1,
1930
			.amux     = EM28XX_AMUX_LINE_IN,
1931
			.gpio     = hauppauge_wintv_hvr_900_analog,
1932
		}, {
1933
			.type     = EM28XX_VMUX_SVIDEO,
1934
			.vmux     = TVP5150_SVIDEO,
1935
			.amux     = EM28XX_AMUX_LINE_IN,
1936
			.gpio     = hauppauge_wintv_hvr_900_analog,
1937
		} },
1938
	},
1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953
	[EM2882_BOARD_DIKOM_DK300] = {
		.name         = "Dikom DK300",
		.tuner_type   = TUNER_XC2028,
		.tuner_gpio   = default_tuner_gpio,
		.decoder      = EM28XX_TVP5150,
		.mts_firmware = 1,
		.has_dvb      = 1,
		.dvb_gpio     = dikom_dk300_digital,
		.input        = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
			.amux     = EM28XX_AMUX_VIDEO,
			.gpio     = default_analog,
		} },
	},
1954
	[EM2883_BOARD_KWORLD_HYBRID_330U] = {
1955 1956
		.name         = "Kworld PlusTV HD Hybrid 330",
		.tuner_type   = TUNER_XC2028,
1957
		.tuner_gpio   = default_tuner_gpio,
1958
		.decoder      = EM28XX_TVP5150,
1959 1960
		.mts_firmware = 1,
		.has_dvb      = 1,
1961 1962
		.dvb_gpio     = kworld_330u_digital,
		.xclk             = EM28XX_XCLK_FREQUENCY_12MHZ,
1963 1964 1965
		.i2c_speed        = EM28XX_I2C_CLK_WAIT_ENABLE |
				    EM28XX_I2C_EEPROM_ON_BOARD |
				    EM28XX_I2C_EEPROM_KEY_VALID,
1966
		.input        = { {
1967
			.type     = EM28XX_VMUX_TELEVISION,
1968
			.vmux     = TVP5150_COMPOSITE0,
1969
			.amux     = EM28XX_AMUX_VIDEO,
1970 1971
			.gpio     = kworld_330u_analog,
			.aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1972
		}, {
1973
			.type     = EM28XX_VMUX_COMPOSITE,
1974
			.vmux     = TVP5150_COMPOSITE1,
1975
			.amux     = EM28XX_AMUX_LINE_IN,
1976 1977
			.gpio     = kworld_330u_analog,
			.aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1978
		}, {
1979
			.type     = EM28XX_VMUX_SVIDEO,
1980
			.vmux     = TVP5150_SVIDEO,
1981
			.amux     = EM28XX_AMUX_LINE_IN,
1982
			.gpio     = kworld_330u_analog,
1983 1984
		} },
	},
1985
	[EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
1986 1987
		.name         = "Compro VideoMate ForYou/Stereo",
		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1988
		.tvaudio_addr = 0xb0,
1989 1990
		.tda9887_conf = TDA9887_PRESENT,
		.decoder      = EM28XX_TVP5150,
1991
		.adecoder     = EM28XX_TVAUDIO,
1992
		.mute_gpio    = compro_mute_gpio,
1993
		.input        = { {
1994 1995
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
1996 1997
			.amux     = EM28XX_AMUX_VIDEO,
			.gpio     = compro_unmute_tv_gpio,
1998 1999 2000 2001
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
			.amux     = EM28XX_AMUX_LINE_IN,
2002
			.gpio     = compro_unmute_svid_gpio,
2003 2004
		} },
	},
2005 2006 2007 2008 2009 2010 2011 2012
	[EM2860_BOARD_KAIOMY_TVNPC_U2] = {
		.name	      = "Kaiomy TVnPC U2",
		.vchannels    = 3,
		.tuner_type   = TUNER_XC2028,
		.tuner_addr   = 0x61,
		.mts_firmware = 1,
		.decoder      = EM28XX_TVP5150,
		.tuner_gpio   = default_tuner_gpio,
2013
		.ir_codes     = RC_MAP_KAIOMY,
2014 2015 2016 2017 2018 2019
		.input          = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
			.amux     = EM28XX_AMUX_VIDEO,

		}, {
2020
			.type     = EM28XX_VMUX_COMPOSITE,
2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031
			.vmux     = TVP5150_COMPOSITE1,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
			.amux     = EM28XX_AMUX_LINE_IN,
		} },
		.radio		= {
			.type     = EM28XX_RADIO,
			.amux     = EM28XX_AMUX_LINE_IN,
		}
2032 2033 2034 2035 2036 2037 2038
	},
	[EM2860_BOARD_EASYCAP] = {
		.name         = "Easy Cap Capture DC-60",
		.vchannels    = 2,
		.tuner_type   = TUNER_ABSENT,
		.decoder      = EM28XX_SAA711X,
		.input           = { {
2039
			.type     = EM28XX_VMUX_COMPOSITE,
2040 2041 2042 2043 2044 2045 2046 2047
			.vmux     = SAA7115_COMPOSITE0,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
			.amux     = EM28XX_AMUX_LINE_IN,
		} },
	},
2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058
	[EM2820_BOARD_IODATA_GVMVP_SZ] = {
		.name       = "IO-DATA GV-MVP/SZ",
		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,
		.tuner_gpio   = default_tuner_gpio,
		.tda9887_conf = TDA9887_PRESENT,
		.decoder      = EM28XX_TVP5150,
		.input        = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
			.amux     = EM28XX_AMUX_VIDEO,
		}, { /* Composite has not been tested yet */
2059
			.type     = EM28XX_VMUX_COMPOSITE,
2060 2061 2062 2063 2064 2065 2066 2067
			.vmux     = TVP5150_COMPOSITE1,
			.amux     = EM28XX_AMUX_VIDEO,
		}, { /* S-video has not been tested yet */
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
			.amux     = EM28XX_AMUX_VIDEO,
		} },
	},
2068 2069 2070 2071 2072 2073 2074
	[EM2860_BOARD_TERRATEC_GRABBY] = {
		.name            = "Terratec Grabby",
		.vchannels       = 2,
		.tuner_type      = TUNER_ABSENT,
		.decoder         = EM28XX_SAA711X,
		.xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
		.input           = { {
2075
			.type     = EM28XX_VMUX_COMPOSITE,
2076
			.vmux     = SAA7115_COMPOSITE0,
2077
			.amux     = EM28XX_AMUX_LINE_IN,
2078 2079 2080
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,
2081
			.amux     = EM28XX_AMUX_LINE_IN,
2082
		} },
2083
		.buttons         = std_snapshot_button,
2084
		.leds            = terratec_grabby_leds,
2085
	},
2086 2087 2088 2089 2090 2091 2092 2093
	[EM2860_BOARD_TERRATEC_AV350] = {
		.name            = "Terratec AV350",
		.vchannels       = 2,
		.tuner_type      = TUNER_ABSENT,
		.decoder         = EM28XX_TVP5150,
		.xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
		.mute_gpio       = terratec_av350_mute_gpio,
		.input           = { {
2094
			.type     = EM28XX_VMUX_COMPOSITE,
2095 2096
			.vmux     = TVP5150_COMPOSITE1,
			.amux     = EM28XX_AUDIO_SRC_LINE,
2097
			.gpio     = terratec_av350_unmute_gpio,
2098 2099 2100 2101 2102

		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
			.amux     = EM28XX_AUDIO_SRC_LINE,
2103
			.gpio     = terratec_av350_unmute_gpio,
2104 2105
		} },
	},
2106 2107 2108 2109 2110 2111

	[EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = {
		.name         = "Elgato Video Capture",
		.decoder      = EM28XX_SAA711X,
		.tuner_type   = TUNER_ABSENT,   /* Capture only device */
		.input        = { {
2112
			.type  = EM28XX_VMUX_COMPOSITE,
2113 2114 2115 2116 2117 2118 2119 2120 2121
			.vmux  = SAA7115_COMPOSITE0,
			.amux  = EM28XX_AMUX_LINE_IN,
		}, {
			.type  = EM28XX_VMUX_SVIDEO,
			.vmux  = SAA7115_SVIDEO3,
			.amux  = EM28XX_AMUX_LINE_IN,
		} },
	},

2122 2123 2124 2125 2126
	[EM2882_BOARD_EVGA_INDTUBE] = {
		.name         = "Evga inDtube",
		.tuner_type   = TUNER_XC2028,
		.tuner_gpio   = default_tuner_gpio,
		.decoder      = EM28XX_TVP5150,
2127
		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
2128 2129 2130
		.mts_firmware = 1,
		.has_dvb      = 1,
		.dvb_gpio     = evga_indtube_digital,
2131
		.ir_codes     = RC_MAP_EVGA_INDTUBE,
2132 2133 2134 2135 2136 2137
		.input        = { {
			.type     = EM28XX_VMUX_TELEVISION,
			.vmux     = TVP5150_COMPOSITE0,
			.amux     = EM28XX_AMUX_VIDEO,
			.gpio     = evga_indtube_analog,
		}, {
2138
			.type     = EM28XX_VMUX_COMPOSITE,
2139 2140 2141 2142 2143 2144 2145 2146 2147 2148
			.vmux     = TVP5150_COMPOSITE1,
			.amux     = EM28XX_AMUX_LINE_IN,
			.gpio     = evga_indtube_analog,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
			.amux     = EM28XX_AMUX_LINE_IN,
			.gpio     = evga_indtube_analog,
		} },
	},
2149 2150 2151 2152 2153
	/* eb1a:2868 Empia EM2870 + Philips CU1216L NIM (Philips TDA10023 +
	   Infineon TUA6034) */
	[EM2870_BOARD_REDDO_DVB_C_USB_BOX] = {
		.name          = "Reddo DVB-C USB TV Box",
		.tuner_type    = TUNER_ABSENT,
2154
		.tuner_gpio    = reddo_dvb_c_usb_box,
2155 2156
		.has_dvb       = 1,
	},
2157 2158 2159 2160 2161 2162 2163 2164 2165 2166
	/* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
	 * initially as the KWorld PlusTV 340U, then as the UB435-Q.
	 * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */
	[EM2870_BOARD_KWORLD_A340] = {
		.name       = "KWorld PlusTV 340U or UB435-Q (ATSC)",
		.tuner_type = TUNER_ABSENT,	/* Digital-only TDA18271HD */
		.has_dvb    = 1,
		.dvb_gpio   = kworld_a340_digital,
		.tuner_gpio = default_tuner_gpio,
	},
2167
	/* 2013:024f PCTV nanoStick T2 290e.
2168 2169
	 * Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2 */
	[EM28174_BOARD_PCTV_290E] = {
2170
		.name          = "PCTV nanoStick T2 290e",
2171 2172
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ,
2173 2174 2175
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = pctv_290e,
		.has_dvb       = 1,
2176
		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2177
	},
2178 2179 2180
	/* 2013:024f PCTV DVB-S2 Stick 460e
	 * Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A8293 */
	[EM28174_BOARD_PCTV_460E] = {
2181 2182
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
2183 2184 2185 2186 2187 2188
		.name          = "PCTV DVB-S2 Stick (460e)",
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = pctv_460e,
		.has_dvb       = 1,
		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
	},
2189 2190 2191 2192 2193 2194 2195
	/* eb1a:5006 Honestech VIDBOX NW03
	 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner */
	[EM2860_BOARD_HT_VIDBOX_NW03] = {
		.name                = "Honestech Vidbox NW03",
		.tuner_type          = TUNER_ABSENT,
		.decoder             = EM28XX_SAA711X,
		.input               = { {
2196
			.type     = EM28XX_VMUX_COMPOSITE,
2197 2198 2199 2200 2201 2202 2203 2204
			.vmux     = SAA7115_COMPOSITE0,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = SAA7115_SVIDEO3,  /* S-VIDEO needs confirming */
			.amux     = EM28XX_AMUX_LINE_IN,
		} },
	},
2205 2206 2207 2208 2209 2210 2211
	/* 1b80:e425 MaxMedia UB425-TC
	 * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2 */
	[EM2874_BOARD_MAXMEDIA_UB425_TC] = {
		.name          = "MaxMedia UB425-TC",
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = maxmedia_ub425_tc,
		.has_dvb       = 1,
2212
		.ir_codes      = RC_MAP_REDDO,
2213 2214
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2215 2216
				EM28XX_I2C_FREQ_400_KHZ,
	},
2217 2218 2219 2220 2221 2222 2223 2224
	/* 2304:0242 PCTV QuatroStick (510e)
	 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
	[EM2884_BOARD_PCTV_510E] = {
		.name          = "PCTV QuatroStick (510e)",
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = pctv_510e,
		.has_dvb       = 1,
		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2225 2226
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2227 2228
				EM28XX_I2C_FREQ_400_KHZ,
	},
2229 2230 2231 2232 2233 2234 2235 2236
	/* 2013:0251 PCTV QuatroStick nano (520e)
	 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
	[EM2884_BOARD_PCTV_520E] = {
		.name          = "PCTV QuatroStick nano (520e)",
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = pctv_520e,
		.has_dvb       = 1,
		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2237 2238
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2239 2240
				EM28XX_I2C_FREQ_400_KHZ,
	},
2241 2242 2243 2244 2245
	[EM2884_BOARD_TERRATEC_HTC_USB_XS] = {
		.name         = "Terratec Cinergy HTC USB XS",
		.has_dvb      = 1,
		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
		.tuner_type   = TUNER_ABSENT,
2246 2247
		.def_i2c_bus  = 1,
		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
2248 2249
				EM28XX_I2C_FREQ_400_KHZ,
	},
2250 2251
	/* 1b80:e1cc Delock 61959
	 * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
2252
	 * mostly the same as MaxMedia UB-425-TC but different remote */
2253 2254 2255 2256 2257 2258 2259 2260 2261 2262
	[EM2874_BOARD_DELOCK_61959] = {
		.name          = "Delock 61959",
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = maxmedia_ub425_tc,
		.has_dvb       = 1,
		.ir_codes      = RC_MAP_DELOCK_61959,
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
				EM28XX_I2C_FREQ_400_KHZ,
	},
2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274
	/*
	 * 1b80:e346 KWorld USB ATSC TV Stick UB435-Q V2
	 * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
	 */
	[EM2874_BOARD_KWORLD_UB435Q_V2] = {
		.name		= "KWorld USB ATSC TV Stick UB435-Q V2",
		.tuner_type	= TUNER_ABSENT,
		.has_dvb	= 1,
		.dvb_gpio	= kworld_a340_digital,
		.tuner_gpio	= default_tuner_gpio,
		.def_i2c_bus	= 1,
	},
2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286
	/*
	 * 1b80:e34c KWorld USB ATSC TV Stick UB435-Q V3
	 * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
	 */
	[EM2874_BOARD_KWORLD_UB435Q_V3] = {
		.name		= "KWorld USB ATSC TV Stick UB435-Q V3",
		.tuner_type	= TUNER_ABSENT,
		.has_dvb	= 1,
		.tuner_gpio	= kworld_ub435q_v3_digital,
		.def_i2c_bus	= 1,
		.i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |
				  EM28XX_I2C_FREQ_100_KHZ,
2287
		.leds = kworld_ub435q_v3_leds,
2288
	},
2289 2290 2291 2292 2293 2294
	[EM2874_BOARD_PCTV_HD_MINI_80E] = {
		.name         = "Pinnacle PCTV HD Mini",
		.tuner_type   = TUNER_ABSENT,
		.has_dvb      = 1,
		.dvb_gpio     = em2874_pctv_80e_digital,
		.decoder      = EM28XX_NODECODER,
2295
		.ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
2296
		.leds         = pctv_80e_leds,
2297
	},
2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308
	/* 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
	 * Empia EM2765 + OmniVision OV2640 */
	[EM2765_BOARD_SPEEDLINK_VAD_LAPLACE] = {
		.name         = "SpeedLink Vicious And Devine Laplace webcam",
		.xclk         = EM28XX_XCLK_FREQUENCY_24MHZ,
		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
				EM28XX_I2C_FREQ_100_KHZ,
		.def_i2c_bus  = 1,
		.tuner_type   = TUNER_ABSENT,
		.is_webcam    = 1,
		.input        = { {
2309
			.type     = EM28XX_VMUX_COMPOSITE,
2310 2311 2312 2313 2314 2315
			.amux     = EM28XX_AMUX_VIDEO,
			.gpio     = speedlink_vad_laplace_reg_seq,
		} },
		.buttons = speedlink_vad_laplace_buttons,
		.leds = speedlink_vad_laplace_leds,
	},
2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326
	/* 2013:0258 PCTV DVB-S2 Stick (461e)
	 * Empia EM28178, Montage M88DS3103, Montage M88TS2022, Allegro A8293 */
	[EM28178_BOARD_PCTV_461E] = {
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
		.name          = "PCTV DVB-S2 Stick (461e)",
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = pctv_461e,
		.has_dvb       = 1,
		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
	},
2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337
	/* 2013:025f PCTV tripleStick (292e).
	 * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157 */
	[EM28178_BOARD_PCTV_292E] = {
		.name          = "PCTV tripleStick (292e)",
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = pctv_292e,
		.has_dvb       = 1,
		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
	},
2338 2339 2340 2341 2342
	[EM2861_BOARD_LEADTEK_VC100] = {
		.name          = "Leadtek VC100",
		.tuner_type    = TUNER_ABSENT,	/* Capture only device */
		.decoder       = EM28XX_TVP5150,
		.input         = { {
2343
			.type     = EM28XX_VMUX_COMPOSITE,
2344 2345 2346 2347 2348 2349 2350 2351
			.vmux     = TVP5150_COMPOSITE1,
			.amux     = EM28XX_AMUX_LINE_IN,
		}, {
			.type     = EM28XX_VMUX_SVIDEO,
			.vmux     = TVP5150_SVIDEO,
			.amux     = EM28XX_AMUX_LINE_IN,
		} },
	},
2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362
	/* eb1a:8179 Terratec Cinergy T2 Stick HD.
	 * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2146 */
	[EM28178_BOARD_TERRATEC_T2_STICK_HD] = {
		.name          = "Terratec Cinergy T2 Stick HD",
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = terratec_t2_stick_hd,
		.has_dvb       = 1,
		.ir_codes      = RC_MAP_TERRATEC_SLIM_2,
	},
2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376

	/*
	 * 3275:0085 PLEX PX-BCUD.
	 * Empia EM28178, TOSHIBA TC90532XBG, Sharp QM1D1C0042
	 */
	[EM28178_BOARD_PLEX_PX_BCUD] = {
		.name          = "PLEX PX-BCUD",
		.xclk          = EM28XX_XCLK_FREQUENCY_4_3MHZ,
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE,
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = plex_px_bcud,
		.has_dvb       = 1,
	},
2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391
	/*
	 * 2040:0265 Hauppauge WinTV-dualHD (DVB version).
	 * Empia EM28274, 2x Silicon Labs Si2168, 2x Silicon Labs Si2157
	 */
	[EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB] = {
		.name          = "Hauppauge WinTV-dualHD DVB",
		.def_i2c_bus   = 1,
		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
				 EM28XX_I2C_FREQ_400_KHZ,
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = hauppauge_dualhd_dvb,
		.has_dvb       = 1,
		.ir_codes      = RC_MAP_HAUPPAUGE,
		.leds          = hauppauge_dualhd_leds,
	},
2392
};
2393 2394
EXPORT_SYMBOL_GPL(em28xx_boards);

2395
static const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
2396 2397

/* table of devices that work with this driver */
2398
struct usb_device_id em28xx_id_table[] = {
2399
	{ USB_DEVICE(0xeb1a, 0x2750),
2400 2401 2402
			.driver_info = EM2750_BOARD_UNKNOWN },
	{ USB_DEVICE(0xeb1a, 0x2751),
			.driver_info = EM2750_BOARD_UNKNOWN },
2403 2404
	{ USB_DEVICE(0xeb1a, 0x2800),
			.driver_info = EM2800_BOARD_UNKNOWN },
2405 2406
	{ USB_DEVICE(0xeb1a, 0x2710),
			.driver_info = EM2820_BOARD_UNKNOWN },
2407 2408 2409
	{ USB_DEVICE(0xeb1a, 0x2820),
			.driver_info = EM2820_BOARD_UNKNOWN },
	{ USB_DEVICE(0xeb1a, 0x2821),
2410
			.driver_info = EM2820_BOARD_UNKNOWN },
2411 2412 2413 2414
	{ USB_DEVICE(0xeb1a, 0x2860),
			.driver_info = EM2820_BOARD_UNKNOWN },
	{ USB_DEVICE(0xeb1a, 0x2861),
			.driver_info = EM2820_BOARD_UNKNOWN },
2415 2416
	{ USB_DEVICE(0xeb1a, 0x2862),
			.driver_info = EM2820_BOARD_UNKNOWN },
2417 2418
	{ USB_DEVICE(0xeb1a, 0x2863),
			.driver_info = EM2820_BOARD_UNKNOWN },
2419 2420 2421 2422 2423 2424
	{ USB_DEVICE(0xeb1a, 0x2870),
			.driver_info = EM2820_BOARD_UNKNOWN },
	{ USB_DEVICE(0xeb1a, 0x2881),
			.driver_info = EM2820_BOARD_UNKNOWN },
	{ USB_DEVICE(0xeb1a, 0x2883),
			.driver_info = EM2820_BOARD_UNKNOWN },
2425 2426
	{ USB_DEVICE(0xeb1a, 0x2868),
			.driver_info = EM2820_BOARD_UNKNOWN },
2427 2428
	{ USB_DEVICE(0xeb1a, 0x2875),
			.driver_info = EM2820_BOARD_UNKNOWN },
2429 2430
	{ USB_DEVICE(0xeb1a, 0x2885), /* MSI Digivox Trio */
			.driver_info = EM2884_BOARD_TERRATEC_H5 },
2431 2432
	{ USB_DEVICE(0xeb1a, 0xe300),
			.driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
2433 2434
	{ USB_DEVICE(0xeb1a, 0xe303),
			.driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
2435 2436 2437 2438
	{ USB_DEVICE(0xeb1a, 0xe305),
			.driver_info = EM2880_BOARD_KWORLD_DVB_305U },
	{ USB_DEVICE(0xeb1a, 0xe310),
			.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
2439 2440
	{ USB_DEVICE(0xeb1a, 0xa313),
		.driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
2441
	{ USB_DEVICE(0xeb1a, 0xa316),
2442
			.driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454
	{ USB_DEVICE(0xeb1a, 0xe320),
			.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
	{ USB_DEVICE(0xeb1a, 0xe323),
			.driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
	{ USB_DEVICE(0xeb1a, 0xe350),
			.driver_info = EM2870_BOARD_KWORLD_350U },
	{ USB_DEVICE(0xeb1a, 0xe355),
			.driver_info = EM2870_BOARD_KWORLD_355U },
	{ USB_DEVICE(0xeb1a, 0x2801),
			.driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
	{ USB_DEVICE(0xeb1a, 0xe357),
			.driver_info = EM2870_BOARD_KWORLD_355U },
A
Aivar Päkk 已提交
2455 2456
	{ USB_DEVICE(0xeb1a, 0xe359),
			.driver_info = EM2870_BOARD_KWORLD_355U },
2457 2458
	{ USB_DEVICE(0x1b80, 0xe302),
			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */
2459 2460
	{ USB_DEVICE(0x1b80, 0xe304),
			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kworld DVD Maker 2 */
2461 2462
	{ USB_DEVICE(0x0ccd, 0x0036),
			.driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
2463 2464 2465 2466 2467 2468 2469
	{ USB_DEVICE(0x0ccd, 0x004c),
			.driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
	{ USB_DEVICE(0x0ccd, 0x004f),
			.driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
	{ USB_DEVICE(0x0ccd, 0x005e),
			.driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
	{ USB_DEVICE(0x0ccd, 0x0042),
2470
			.driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2471
	{ USB_DEVICE(0x0ccd, 0x0043),
2472
			.driver_info = EM2870_BOARD_TERRATEC_XS_MT2060 },
2473
	{ USB_DEVICE(0x0ccd, 0x008e),	/* Cinergy HTC USB XS Rev. 1 */
2474
			.driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2475
	{ USB_DEVICE(0x0ccd, 0x00ac),	/* Cinergy HTC USB XS Rev. 2 */
2476
			.driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2477
	{ USB_DEVICE(0x0ccd, 0x10a2),	/* H5 Rev. 1 */
2478
			.driver_info = EM2884_BOARD_TERRATEC_H5 },
2479
	{ USB_DEVICE(0x0ccd, 0x10ad),	/* H5 Rev. 2 */
2480
			.driver_info = EM2884_BOARD_TERRATEC_H5 },
2481 2482
	{ USB_DEVICE(0x0ccd, 0x10b6),	/* H5 Rev. 3 */
			.driver_info = EM2884_BOARD_TERRATEC_H5 },
2483 2484
	{ USB_DEVICE(0x0ccd, 0x0084),
			.driver_info = EM2860_BOARD_TERRATEC_AV350 },
2485 2486
	{ USB_DEVICE(0x0ccd, 0x0096),
			.driver_info = EM2860_BOARD_TERRATEC_GRABBY },
T
Teka 已提交
2487 2488
	{ USB_DEVICE(0x0ccd, 0x10AF),
			.driver_info = EM2860_BOARD_TERRATEC_GRABBY },
2489 2490
	{ USB_DEVICE(0x0ccd, 0x00b2),
			.driver_info = EM2884_BOARD_CINERGY_HTC_STICK },
2491 2492
	{ USB_DEVICE(0x0fd9, 0x0018),
			.driver_info = EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 },
2493
	{ USB_DEVICE(0x0fd9, 0x0033),
2494
			.driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE },
2495 2496
	{ USB_DEVICE(0x185b, 0x2870),
			.driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
2497
	{ USB_DEVICE(0x185b, 0x2041),
2498
			.driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
2499 2500
	{ USB_DEVICE(0x2040, 0x4200),
			.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2501 2502
	{ USB_DEVICE(0x2040, 0x4201),
			.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2503 2504
	{ USB_DEVICE(0x2040, 0x6500),
			.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
2505
	{ USB_DEVICE(0x2040, 0x6502),
2506
			.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
2507
	{ USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
2508
			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2509
	{ USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
2510
			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2511
	{ USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
2512
			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2513 2514
	{ USB_DEVICE(0x2040, 0x651f),
			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
2515 2516
	{ USB_DEVICE(0x2040, 0x0265),
			.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
2517 2518
	{ USB_DEVICE(0x0438, 0xb002),
			.driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
2519 2520 2521 2522 2523 2524 2525 2526 2527
	{ USB_DEVICE(0x2001, 0xf112),
			.driver_info = EM2820_BOARD_DLINK_USB_TV },
	{ USB_DEVICE(0x2304, 0x0207),
			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
	{ USB_DEVICE(0x2304, 0x0208),
			.driver_info = EM2820_BOARD_PINNACLE_USB_2 },
	{ USB_DEVICE(0x2304, 0x021a),
			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
	{ USB_DEVICE(0x2304, 0x0226),
2528
			.driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E },
2529 2530
	{ USB_DEVICE(0x2304, 0x0227),
			.driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
2531 2532
	{ USB_DEVICE(0x2304, 0x023f),
			.driver_info = EM2874_BOARD_PCTV_HD_MINI_80E },
2533 2534
	{ USB_DEVICE(0x0413, 0x6023),
			.driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
2535 2536
	{ USB_DEVICE(0x093b, 0xa003),
		       .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2537 2538
	{ USB_DEVICE(0x093b, 0xa005),
			.driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
2539 2540
	{ USB_DEVICE(0x04bb, 0x0515),
			.driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
2541 2542
	{ USB_DEVICE(0xeb1a, 0x50a6),
			.driver_info = EM2860_BOARD_GADMEI_UTV330 },
2543 2544
	{ USB_DEVICE(0x1b80, 0xa340),
			.driver_info = EM2870_BOARD_KWORLD_A340 },
2545 2546
	{ USB_DEVICE(0x1b80, 0xe346),
			.driver_info = EM2874_BOARD_KWORLD_UB435Q_V2 },
2547 2548
	{ USB_DEVICE(0x1b80, 0xe34c),
			.driver_info = EM2874_BOARD_KWORLD_UB435Q_V3 },
2549 2550
	{ USB_DEVICE(0x2013, 0x024f),
			.driver_info = EM28174_BOARD_PCTV_290E },
2551 2552
	{ USB_DEVICE(0x2013, 0x024c),
			.driver_info = EM28174_BOARD_PCTV_460E },
2553 2554
	{ USB_DEVICE(0x2040, 0x1605),
			.driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
2555 2556
	{ USB_DEVICE(0x1b80, 0xe755),
			.driver_info = EM2884_BOARD_C3TECH_DIGITAL_DUO },
2557 2558
	{ USB_DEVICE(0xeb1a, 0x5006),
			.driver_info = EM2860_BOARD_HT_VIDBOX_NW03 },
M
Mario Ceresa 已提交
2559 2560
	{ USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */
			.driver_info = EM2860_BOARD_EASYCAP },
2561 2562
	{ USB_DEVICE(0x1b80, 0xe425),
			.driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
2563 2564
	{ USB_DEVICE(0x2304, 0x0242),
			.driver_info = EM2884_BOARD_PCTV_510E },
2565 2566
	{ USB_DEVICE(0x2013, 0x0251),
			.driver_info = EM2884_BOARD_PCTV_520E },
2567 2568
	{ USB_DEVICE(0x1b80, 0xe1cc),
			.driver_info = EM2874_BOARD_DELOCK_61959 },
2569 2570 2571 2572
	{ USB_DEVICE(0x1ae7, 0x9003),
			.driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
	{ USB_DEVICE(0x1ae7, 0x9004),
			.driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
2573 2574
	{ USB_DEVICE(0x2013, 0x0258),
			.driver_info = EM28178_BOARD_PCTV_461E },
2575 2576
	{ USB_DEVICE(0x2013, 0x025f),
			.driver_info = EM28178_BOARD_PCTV_292E },
2577 2578
	{ USB_DEVICE(0x2040, 0x0264), /* Hauppauge WinTV-soloHD */
			.driver_info = EM28178_BOARD_PCTV_292E },
2579 2580
	{ USB_DEVICE(0x0413, 0x6f07),
			.driver_info = EM2861_BOARD_LEADTEK_VC100 },
2581 2582
	{ USB_DEVICE(0xeb1a, 0x8179),
			.driver_info = EM28178_BOARD_TERRATEC_T2_STICK_HD },
2583 2584
	{ USB_DEVICE(0x3275, 0x0085),
			.driver_info = EM28178_BOARD_PLEX_PX_BCUD },
2585 2586
	{ },
};
2587
MODULE_DEVICE_TABLE(usb, em28xx_id_table);
2588

2589 2590 2591
/*
 * EEPROM hash table for devices with generic USB IDs
 */
2592
static struct em28xx_hash_table em28xx_eeprom_hash[] = {
2593
	/* P/N: SA 60002070465 Tuner: TVF7533-MF */
2594
	{0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
2595
	{0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
2596
	{0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
2597
	{0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
2598
	{0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
2599
	{0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
2600
	{0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT},
2601
	{0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028},
2602
};
2603

2604
/* I2C devicelist hash table for devices with generic USB IDs */
2605
static struct em28xx_hash_table em28xx_i2c_hash[] = {
2606 2607
	{0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
	{0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
2608
	{0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
2609
	{0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
2610
	{0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
2611
	{0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
2612
	{0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT},
2613
};
2614

2615
/* NOTE: introduce a separate hash table for devices with 16 bit eeproms */
2616

2617
int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
2618
{
2619 2620
	struct em28xx_i2c_bus *i2c_bus = ptr;
	struct em28xx *dev = i2c_bus->dev;
2621
	int rc = 0;
2622

2623
	if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
2624 2625
		return 0;

2626
	if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
2627 2628
		return 0;

2629
	rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
2630 2631 2632 2633 2634

	return rc;
}
EXPORT_SYMBOL_GPL(em28xx_tuner_callback);

2635
static inline void em28xx_set_model(struct em28xx *dev)
2636
{
2637
	dev->board = em28xx_boards[dev->model];
2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648

	/* Those are the default values for the majority of boards
	   Use those values if not specified otherwise at boards entry
	 */
	if (!dev->board.xclk)
		dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE |
				  EM28XX_XCLK_FREQUENCY_12MHZ;

	if (!dev->board.i2c_speed)
		dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
				       EM28XX_I2C_FREQ_100_KHZ;
2649

2650 2651
	/* Should be initialized early, for I2C to work */
	dev->def_i2c_bus = dev->board.def_i2c_bus;
2652 2653
}

2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679
/* Wait until AC97_RESET reports the expected value reliably before proceeding.
 * We also check that two unrelated registers accesses don't return the same
 * value to avoid premature return.
 * This procedure helps ensuring AC97 register accesses are reliable.
 */
static int em28xx_wait_until_ac97_features_equals(struct em28xx *dev,
						  int expected_feat)
{
	unsigned long timeout = jiffies + msecs_to_jiffies(2000);
	int feat, powerdown;

	while (time_is_after_jiffies(timeout)) {
		feat = em28xx_read_ac97(dev, AC97_RESET);
		if (feat < 0)
			return feat;

		powerdown = em28xx_read_ac97(dev, AC97_POWERDOWN);
		if (powerdown < 0)
			return powerdown;

		if (feat == expected_feat && feat != powerdown)
			return 0;

		msleep(50);
	}

2680
	dev_warn(&dev->udev->dev, "AC97 registers access is not reliable !\n");
2681 2682 2683
	return -ETIMEDOUT;
}

2684 2685 2686
/* Since em28xx_pre_card_setup() requires a proper dev->model,
 * this won't work for boards with generic PCI IDs
 */
2687
static void em28xx_pre_card_setup(struct em28xx *dev)
2688
{
2689 2690
	/* Set the initial XCLK and I2C clock values based on the board
	   definition */
2691
	em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
2692 2693
	if (!dev->board.is_em2800)
		em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
2694 2695
	msleep(50);

2696
	/* request some modules */
2697
	switch (dev->model) {
2698
	case EM2861_BOARD_PLEXTOR_PX_TV100U:
2699 2700
		/* Sets the msp34xx I2S speed */
		dev->i2s_speed = 2048000;
2701 2702 2703
		break;
	case EM2861_BOARD_KWORLD_PVRTV_300U:
	case EM2880_BOARD_KWORLD_DVB_305U:
2704
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x6d);
2705
		msleep(10);
2706
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x7d);
2707 2708 2709 2710 2711
		msleep(10);
		break;
	case EM2870_BOARD_COMPRO_VIDEOMATE:
		/* TODO: someone can do some cleanup here...
			 not everything's needed */
2712
		em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
2713
		msleep(10);
2714
		em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
2715
		msleep(10);
2716
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
2717
		mdelay(70);
2718
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
2719
		mdelay(70);
2720
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xdc);
2721
		mdelay(70);
2722
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
2723 2724 2725 2726 2727
		mdelay(70);
		break;
	case EM2870_BOARD_TERRATEC_XS_MT2060:
		/* this device needs some gpio writes to get the DVB-T
		   demod work */
2728
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2729
		mdelay(70);
2730
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
2731
		mdelay(70);
2732
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2733 2734 2735 2736 2737
		mdelay(70);
		break;
	case EM2870_BOARD_PINNACLE_PCTV_DVB:
		/* this device needs some gpio writes to get the
		   DVB-T demod work */
2738
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2739
		mdelay(70);
2740
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
2741
		mdelay(70);
2742
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2743 2744 2745 2746
		mdelay(70);
		break;
	case EM2820_BOARD_GADMEI_UTV310:
	case EM2820_BOARD_MSI_VOX_USB_2:
2747
		/* enables audio for that devices */
2748
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
2749
		break;
2750

2751
	case EM2882_BOARD_KWORLD_ATSC_315U:
2752
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
2753
		msleep(10);
2754
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2755 2756 2757 2758 2759 2760 2761
		msleep(10);
		em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
		msleep(10);
		em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
		msleep(10);
		break;

2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774
	case EM2860_BOARD_KAIOMY_TVNPC_U2:
		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
		em28xx_write_regs(dev, 0x0d, "\x42", 1);
		em28xx_write_regs(dev, 0x08, "\xfd", 1);
		msleep(10);
		em28xx_write_regs(dev, 0x08, "\xff", 1);
		msleep(10);
		em28xx_write_regs(dev, 0x08, "\x7f", 1);
		msleep(10);
		em28xx_write_regs(dev, 0x08, "\x6b", 1);

		break;
2775 2776 2777 2778
	case EM2860_BOARD_EASYCAP:
		em28xx_write_regs(dev, 0x08, "\xf8", 1);
		break;

2779
	case EM2820_BOARD_IODATA_GVMVP_SZ:
2780
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
2781
		msleep(70);
2782
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
2783
		msleep(10);
2784
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2785
		msleep(70);
2786
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
2787 2788
		msleep(70);
		break;
2789 2790 2791 2792 2793 2794 2795

	case EM2860_BOARD_TERRATEC_GRABBY:
		/* HACK?: Ensure AC97 register reading is reliable before
		 * proceeding. In practice, this will wait about 1.6 seconds.
		 */
		em28xx_wait_until_ac97_features_equals(dev, 0x6a90);
		break;
2796
	}
2797

2798
	em28xx_gpio_set(dev, dev->board.tuner_gpio);
2799 2800 2801
	em28xx_set_mode(dev, EM28XX_ANALOG_MODE);

	/* Unlock device */
2802
	em28xx_set_mode(dev, EM28XX_SUSPEND);
2803 2804
}

2805 2806 2807
static int em28xx_hint_board(struct em28xx *dev)
{
	int i;
2808

2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820
	if (dev->board.is_webcam) {
		if (dev->em28xx_sensor == EM28XX_MT9V011) {
			dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
		} else if (dev->em28xx_sensor == EM28XX_MT9M001 ||
			   dev->em28xx_sensor == EM28XX_MT9M111) {
			dev->model = EM2750_BOARD_UNKNOWN;
		}
		/* FIXME: IMPROVE ! */

		return 0;
	}

2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832
	/* HINT method: EEPROM
	 *
	 * This method works only for boards with eeprom.
	 * Uses a hash of all eeprom bytes. The hash should be
	 * unique for a vendor/tuner pair.
	 * There are a high chance that tuners for different
	 * video standards produce different hashes.
	 */
	for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
		if (dev->hash == em28xx_eeprom_hash[i].hash) {
			dev->model = em28xx_eeprom_hash[i].model;
			dev->tuner_type = em28xx_eeprom_hash[i].tuner;
2833

2834 2835 2836 2837 2838 2839 2840
			dev_err(&dev->udev->dev,
				"Your board has no unique USB ID.\n"
				"A hint were successfully done, based on eeprom hash.\n"
				"This method is not 100%% failproof.\n"
				"If the board were missdetected, please email this log to:\n"
				"\tV4L Mailing List  <linux-media@vger.kernel.org>\n"
				"Board detected as %s\n",
2841
			       em28xx_boards[dev->model].name);
2842

2843 2844 2845
			return 0;
		}
	}
2846

2847 2848 2849 2850 2851 2852 2853 2854 2855
	/* HINT method: I2C attached devices
	 *
	 * This method works for all boards.
	 * Uses a hash of i2c scanned devices.
	 * Devices with the same i2c attached chips will
	 * be considered equal.
	 * This method is less precise than the eeprom one.
	 */

2856 2857
	/* user did not request i2c scanning => do it now */
	if (!dev->i2c_hash)
2858
		em28xx_do_i2c_scan(dev, dev->def_i2c_bus);
2859 2860 2861 2862 2863

	for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
		if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
			dev->model = em28xx_i2c_hash[i].model;
			dev->tuner_type = em28xx_i2c_hash[i].tuner;
2864 2865 2866 2867 2868 2869 2870 2871
			dev_err(&dev->udev->dev,
				"Your board has no unique USB ID.\n"
				"A hint were successfully done, based on i2c devicelist hash.\n"
				"This method is not 100%% failproof.\n"
				"If the board were missdetected, please email this log to:\n"
				"\tV4L Mailing List  <linux-media@vger.kernel.org>\n"
				"Board detected as %s\n",
				em28xx_boards[dev->model].name);
2872 2873 2874 2875 2876

			return 0;
		}
	}

2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887
	dev_err(&dev->udev->dev,
		"Your board has no unique USB ID and thus need a hint to be detected.\n"
		"You may try to use card=<n> insmod option to workaround that.\n"
		"Please send an email with this log to:\n"
		"\tV4L Mailing List <linux-media@vger.kernel.org>\n"
		"Board eeprom hash is 0x%08lx\n"
		"Board i2c devicelist hash is 0x%08lx\n",
		dev->hash, dev->i2c_hash);

	dev_err(&dev->udev->dev,
		"Here is a list of valid choices for the card=<n> insmod option:\n");
2888
	for (i = 0; i < em28xx_bcount; i++) {
2889 2890
		dev_err(&dev->udev->dev,
			"    card=%d -> %s\n", i, em28xx_boards[i].name);
2891 2892
	}
	return -1;
2893 2894
}

2895
static void em28xx_card_setup(struct em28xx *dev)
2896
{
2897 2898 2899 2900 2901
	/*
	 * If the device can be a webcam, seek for a sensor.
	 * If sensor is not found, then it isn't a webcam.
	 */
	if (dev->board.is_webcam) {
2902
		if (em28xx_detect_sensor(dev) < 0)
2903
			dev->board.is_webcam = 0;
2904 2905
	}

2906 2907 2908 2909
	switch (dev->model) {
	case EM2750_BOARD_UNKNOWN:
	case EM2820_BOARD_UNKNOWN:
	case EM2800_BOARD_UNKNOWN:
2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923
		/*
		 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
		 *
		 * This occurs because they share identical USB vendor and
		 * product IDs.
		 *
		 * What we do here is look up the EEPROM hash of the K-WORLD
		 * and if it is found then we decide that we do not have
		 * a DIGIVOX and reset the device to the K-WORLD instead.
		 *
		 * This solution is only valid if they do not share eeprom
		 * hash identities which has not been determined as yet.
		 */
		if (em28xx_hint_board(dev) < 0)
2924
			dev_err(&dev->udev->dev, "Board not discovered\n");
2925 2926 2927 2928 2929
		else {
			em28xx_set_model(dev);
			em28xx_pre_card_setup(dev);
		}
		break;
2930 2931
	default:
		em28xx_set_model(dev);
2932
	}
2933

2934
	dev_info(&dev->udev->dev, "Identified as %s (card=%d)\n",
2935
		dev->board.name, dev->model);
2936 2937 2938

	dev->tuner_type = em28xx_boards[dev->model].tuner_type;

2939
	/* request some modules */
2940 2941
	switch (dev->model) {
	case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
2942
	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
2943
	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
2944
	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
2945
	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
2946
	case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
2947
	case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB:
2948 2949
	{
		struct tveeprom tv;
2950 2951 2952

		if (dev->eedata == NULL)
			break;
2953
#if defined(CONFIG_MODULES) && defined(MODULE)
2954
		request_module("tveeprom");
2955
#endif
2956 2957
		/* Call first TVeeprom */

2958 2959
		dev->i2c_client[dev->def_i2c_bus].addr = 0xa0 >> 1;
		tveeprom_hauppauge_analog(&dev->i2c_client[dev->def_i2c_bus], &tv, dev->eedata);
2960

2961
		dev->tuner_type = tv.tuner_type;
2962

2963
		if (tv.audio_processor == TVEEPROM_AUDPROC_MSP) {
2964
			dev->i2s_speed = 2048000;
2965
			dev->board.has_msp34xx = 1;
2966 2967
		}
		break;
2968
	}
2969 2970 2971
	case EM2882_BOARD_KWORLD_ATSC_315U:
		em28xx_write_reg(dev, 0x0d, 0x42);
		msleep(10);
2972
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
2973 2974
		msleep(10);
		break;
2975 2976
	case EM2820_BOARD_KWORLD_PVRTV2800RF:
		/* GPIO enables sound on KWORLD PVR TV 2800RF */
2977
		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf9);
2978 2979 2980
		break;
	case EM2820_BOARD_UNKNOWN:
	case EM2800_BOARD_UNKNOWN:
2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994
		/*
		 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
		 *
		 * This occurs because they share identical USB vendor and
		 * product IDs.
		 *
		 * What we do here is look up the EEPROM hash of the K-WORLD
		 * and if it is found then we decide that we do not have
		 * a DIGIVOX and reset the device to the K-WORLD instead.
		 *
		 * This solution is only valid if they do not share eeprom
		 * hash identities which has not been determined as yet.
		 */
	case EM2880_BOARD_MSI_DIGIVOX_AD:
2995 2996
		if (!em28xx_hint_board(dev))
			em28xx_set_model(dev);
2997 2998

		/* In cases where we had to use a board hint, the call to
2999 3000 3001 3002 3003 3004 3005
		   em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
		   so make the call now so the analog GPIOs are set properly
		   before probing the i2c bus. */
		em28xx_gpio_set(dev, dev->board.tuner_gpio);
		em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
		break;

3006
		/*
3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023
		 * The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR.
		 *
		 * This occurs because they share identical USB vendor and
		 * product IDs.
		 *
		 * What we do here is look up the EEPROM hash of the Dikom
		 * and if it is found then we decide that we do not have
		 * a Kworld and reset the device to the Dikom instead.
		 *
		 * This solution is only valid if they do not share eeprom
		 * hash identities which has not been determined as yet.
		 */
	case EM2882_BOARD_KWORLD_VS_DVBT:
		if (!em28xx_hint_board(dev))
			em28xx_set_model(dev);

		/* In cases where we had to use a board hint, the call to
3024 3025 3026
		   em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
		   so make the call now so the analog GPIOs are set properly
		   before probing the i2c bus. */
3027
		em28xx_gpio_set(dev, dev->board.tuner_gpio);
3028
		em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
3029
		break;
3030 3031
	}

3032
	if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
3033 3034 3035 3036 3037
		dev_err(&dev->udev->dev,
			"\n\n"
			"The support for this board weren't valid yet.\n"
			"Please send a report of having this working\n"
			"not to V4L mailing list (and/or to other addresses)\n\n");
3038 3039
	}

3040 3041 3042 3043
	/* Free eeprom data memory */
	kfree(dev->eedata);
	dev->eedata = NULL;

3044
	/* Allow override tuner type by a module parameter */
3045 3046
	if (tuner >= 0)
		dev->tuner_type = tuner;
3047
}
3048

3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097
void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
{
	memset(ctl, 0, sizeof(*ctl));

	ctl->fname   = XC2028_DEFAULT_FIRMWARE;
	ctl->max_len = 64;
	ctl->mts = em28xx_boards[dev->model].mts_firmware;

	switch (dev->model) {
	case EM2880_BOARD_EMPIRE_DUAL_TV:
	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
	case EM2882_BOARD_TERRATEC_HYBRID_XS:
		ctl->demod = XC3028_FE_ZARLINK456;
		break;
	case EM2880_BOARD_TERRATEC_HYBRID_XS:
	case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
	case EM2881_BOARD_PINNACLE_HYBRID_PRO:
		ctl->demod = XC3028_FE_ZARLINK456;
		break;
	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
	case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:
		ctl->demod = XC3028_FE_DEFAULT;
		break;
	case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
		ctl->demod = XC3028_FE_DEFAULT;
		ctl->fname = XC3028L_DEFAULT_FIRMWARE;
		break;
	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
	case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
		/* FIXME: Better to specify the needed IF */
		ctl->demod = XC3028_FE_DEFAULT;
		break;
	case EM2883_BOARD_KWORLD_HYBRID_330U:
	case EM2882_BOARD_DIKOM_DK300:
	case EM2882_BOARD_KWORLD_VS_DVBT:
		ctl->demod = XC3028_FE_CHINA;
		ctl->fname = XC2028_DEFAULT_FIRMWARE;
		break;
	case EM2882_BOARD_EVGA_INDTUBE:
		ctl->demod = XC3028_FE_CHINA;
		ctl->fname = XC3028L_DEFAULT_FIRMWARE;
		break;
	default:
		ctl->demod = XC3028_FE_OREN538;
	}
}
EXPORT_SYMBOL_GPL(em28xx_setup_xc3028);

3098 3099 3100 3101 3102
static void request_module_async(struct work_struct *work)
{
	struct em28xx *dev = container_of(work,
			     struct em28xx, request_module_wk);

3103 3104 3105 3106 3107 3108
	/*
	 * The em28xx extensions can be modules or builtin. If the
	 * modules are already loaded or are built in, those extensions
	 * can be initialised right now. Otherwise, the module init
	 * code will do it.
	 */
3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120

	/*
	 * Devicdes with an audio-only interface also have a V4L/DVB/RC
	 * interface. Don't register extensions twice on those devices.
	 */
	if (dev->is_audio_only) {
#if defined(CONFIG_MODULES) && defined(MODULE)
		request_module("em28xx-alsa");
#endif
		return;
	}

3121 3122 3123
	em28xx_init_extension(dev);

#if defined(CONFIG_MODULES) && defined(MODULE)
3124 3125
	if (dev->has_video)
		request_module("em28xx-v4l");
3126
	if (dev->usb_audio_type == EM28XX_USB_AUDIO_CLASS)
3127
		request_module("snd-usb-audio");
3128
	else if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)
3129 3130 3131
		request_module("em28xx-alsa");
	if (dev->board.has_dvb)
		request_module("em28xx-dvb");
3132
	if (dev->board.buttons ||
3133
	    ((dev->board.ir_codes || dev->board.has_ir_i2c) && !disable_ir))
3134
		request_module("em28xx-rc");
3135
#endif /* CONFIG_MODULES */
3136 3137 3138 3139 3140 3141 3142
}

static void request_modules(struct em28xx *dev)
{
	INIT_WORK(&dev->request_module_wk, request_module_async);
	schedule_work(&dev->request_module_wk);
}
3143 3144 3145

static void flush_request_modules(struct em28xx *dev)
{
3146
	flush_work(&dev->request_module_wk);
3147
}
3148

3149 3150 3151 3152 3153 3154
static int em28xx_media_device_init(struct em28xx *dev,
				    struct usb_device *udev)
{
#ifdef CONFIG_MEDIA_CONTROLLER
	struct media_device *mdev;

3155
	mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
3156 3157 3158
	if (!mdev)
		return -ENOMEM;

3159 3160 3161 3162 3163
	if (udev->product)
		media_device_usb_init(mdev, udev, udev->product);
	else if (udev->manufacturer)
		media_device_usb_init(mdev, udev, udev->manufacturer);
	else
3164
		media_device_usb_init(mdev, udev, dev_name(&dev->udev->dev));
3165

3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183
	dev->media_dev = mdev;
#endif
	return 0;
}

static void em28xx_unregister_media_device(struct em28xx *dev)
{

#ifdef CONFIG_MEDIA_CONTROLLER
	if (dev->media_dev) {
		media_device_unregister(dev->media_dev);
		media_device_cleanup(dev->media_dev);
		kfree(dev->media_dev);
		dev->media_dev = NULL;
	}
#endif
}

3184
/*
3185
 * em28xx_release_resources()
3186
 * unregisters the v4l2,i2c and usb devices
3187
 * called when the device gets disconnected or at module unload
3188
*/
3189
static void em28xx_release_resources(struct em28xx *dev)
3190 3191 3192
{
	/*FIXME: I2C IR should be disconnected */

3193 3194
	mutex_lock(&dev->lock);

3195 3196
	em28xx_unregister_media_device(dev);

3197 3198 3199
	if (dev->def_i2c_bus)
		em28xx_i2c_unregister(dev, 1);
	em28xx_i2c_unregister(dev, 0);
3200

3201 3202 3203
	usb_put_dev(dev->udev);

	/* Mark device as unused */
3204
	clear_bit(dev->devno, em28xx_devused);
3205 3206

	mutex_unlock(&dev->lock);
3207
};
3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219

/**
 * em28xx_free_device() - Free em28xx device
 *
 * @ref: struct kref for em28xx device
 *
 * This is called when all extensions and em28xx core unregisters a device
 */
void em28xx_free_device(struct kref *ref)
{
	struct em28xx *dev = kref_to_dev(ref);

3220
	dev_info(&dev->udev->dev, "Freeing device\n");
3221 3222 3223 3224 3225 3226 3227 3228

	if (!dev->disconnected)
		em28xx_release_resources(dev);

	kfree(dev->alt_max_pkt_size_isoc);
	kfree(dev);
}
EXPORT_SYMBOL_GPL(em28xx_free_device);
3229 3230 3231 3232 3233

/*
 * em28xx_init_dev()
 * allocates and inits the device structs, registers i2c bus and v4l device
 */
3234
static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
3235
			   struct usb_interface *interface,
3236 3237
			   int minor)
{
3238
	int retval;
3239 3240
	static const char *default_chip_name = "em28xx";
	const char *chip_name = default_chip_name;
3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252

	dev->udev = udev;
	mutex_init(&dev->ctrl_urb_lock);
	spin_lock_init(&dev->slock);

	dev->em28xx_write_regs = em28xx_write_regs;
	dev->em28xx_read_reg = em28xx_read_reg;
	dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
	dev->em28xx_write_regs_req = em28xx_write_regs_req;
	dev->em28xx_read_reg_req = em28xx_read_reg_req;
	dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;

3253 3254 3255 3256 3257 3258 3259 3260 3261 3262
	em28xx_set_model(dev);

	dev->wait_after_write = 5;

	/* Based on the Chip ID, set the device configuration */
	retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
	if (retval > 0) {
		dev->chip_id = retval;

		switch (dev->chip_id) {
3263
		case CHIP_ID_EM2800:
3264
			chip_name = "em2800";
3265
			break;
3266
		case CHIP_ID_EM2710:
3267
			chip_name = "em2710";
3268 3269
			break;
		case CHIP_ID_EM2750:
3270
			chip_name = "em2750";
3271
			break;
3272 3273 3274 3275 3276 3277
		case CHIP_ID_EM2765:
			chip_name = "em2765";
			dev->wait_after_write = 0;
			dev->is_em25xx = 1;
			dev->eeprom_addrwidth_16bit = 1;
			break;
3278
		case CHIP_ID_EM2820:
3279
			chip_name = "em2710/2820";
3280 3281
			if (le16_to_cpu(dev->udev->descriptor.idVendor)
								    == 0xeb1a) {
3282
				__le16 idProd = dev->udev->descriptor.idProduct;
3283

3284 3285 3286 3287 3288 3289
				if (le16_to_cpu(idProd) == 0x2710)
					chip_name = "em2710";
				else if (le16_to_cpu(idProd) == 0x2820)
					chip_name = "em2820";
			}
			/* NOTE: the em2820 is used in webcams, too ! */
3290 3291
			break;
		case CHIP_ID_EM2840:
3292
			chip_name = "em2840";
3293 3294
			break;
		case CHIP_ID_EM2860:
3295
			chip_name = "em2860";
3296 3297
			break;
		case CHIP_ID_EM2870:
3298
			chip_name = "em2870";
3299 3300 3301
			dev->wait_after_write = 0;
			break;
		case CHIP_ID_EM2874:
3302
			chip_name = "em2874";
3303
			dev->wait_after_write = 0;
3304
			dev->eeprom_addrwidth_16bit = 1;
3305
			break;
3306
		case CHIP_ID_EM28174:
3307
			chip_name = "em28174";
3308
			dev->wait_after_write = 0;
3309
			dev->eeprom_addrwidth_16bit = 1;
3310
			break;
3311 3312 3313 3314 3315
		case CHIP_ID_EM28178:
			chip_name = "em28178";
			dev->wait_after_write = 0;
			dev->eeprom_addrwidth_16bit = 1;
			break;
3316
		case CHIP_ID_EM2883:
3317
			chip_name = "em2882/3";
3318 3319
			dev->wait_after_write = 0;
			break;
3320
		case CHIP_ID_EM2884:
3321
			chip_name = "em2884";
3322
			dev->wait_after_write = 0;
3323
			dev->eeprom_addrwidth_16bit = 1;
3324
			break;
3325 3326 3327
		}
	}

3328 3329 3330
	dev_set_name(&dev->udev->dev, "%d-%s: %s#%d",
		     dev->udev->bus->busnum, dev->udev->devpath,
		     chip_name, dev->devno);
3331

3332 3333 3334 3335 3336
	if (chip_name == default_chip_name)
			dev_info(&dev->udev->dev,
				 "unknown em28xx chip ID (%d)\n", dev->chip_id);
	else
		dev_info(&dev->udev->dev, "chip ID is %s\n", chip_name);
3337

3338 3339
	em28xx_media_device_init(dev, udev);

3340
	if (dev->is_audio_only) {
3341 3342
		retval = em28xx_audio_setup(dev);
		if (retval)
3343 3344 3345 3346 3347 3348
			return -ENODEV;
		em28xx_init_extension(dev);

		return 0;
	}

3349 3350 3351
	em28xx_pre_card_setup(dev);

	if (!dev->board.is_em2800) {
3352
		/* Resets I2C speed */
3353
		retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
3354
		if (retval < 0) {
3355 3356
			dev_err(&dev->udev->dev,
			       "%s: em28xx_write_reg failed! retval [%d]\n",
3357
			       __func__, retval);
3358 3359 3360 3361
			return retval;
		}
	}

3362 3363 3364
	rt_mutex_init(&dev->i2c_bus_lock);

	/* register i2c bus 0 */
3365 3366 3367 3368
	if (dev->board.is_em2800)
		retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM2800);
	else
		retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM28XX);
3369
	if (retval < 0) {
3370 3371
		dev_err(&dev->udev->dev,
			"%s: em28xx_i2c_register bus 0 - error [%d]!\n",
3372
		       __func__, retval);
3373
		return retval;
3374 3375
	}

3376
	/* register i2c bus 1 */
3377
	if (dev->def_i2c_bus) {
3378 3379
		if (dev->is_em25xx)
			retval = em28xx_i2c_register(dev, 1,
3380
						     EM28XX_I2C_ALGO_EM25XX_BUS_B);
3381 3382
		else
			retval = em28xx_i2c_register(dev, 1,
3383
						     EM28XX_I2C_ALGO_EM28XX);
3384
		if (retval < 0) {
3385 3386
			dev_err(&dev->udev->dev,
			       "%s: em28xx_i2c_register bus 1 - error [%d]!\n",
3387
			       __func__, retval);
3388 3389 3390

			em28xx_i2c_unregister(dev, 0);

3391
			return retval;
3392 3393 3394
		}
	}

3395 3396 3397 3398 3399 3400
	/* Do board specific init and eeprom reading */
	em28xx_card_setup(dev);

	return 0;
}

3401 3402 3403
/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))

3404 3405 3406 3407 3408 3409 3410 3411 3412
/*
 * em28xx_usb_probe()
 * checks for supported devices
 */
static int em28xx_usb_probe(struct usb_interface *interface,
			    const struct usb_device_id *id)
{
	struct usb_device *udev;
	struct em28xx *dev = NULL;
3413
	int retval;
3414
	bool has_vendor_audio = false, has_video = false, has_dvb = false;
3415
	int i, nr, try_bulk;
3416
	const int ifnum = interface->altsetting[0].desc.bInterfaceNumber;
3417 3418 3419 3420 3421
	char *speed;

	udev = usb_get_dev(interface_to_usbdev(interface));

	/* Check to see next free device and mark as used */
3422
	do {
3423
		nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
3424 3425
		if (nr >= EM28XX_MAXBOARDS) {
			/* No free device slots */
3426 3427
			dev_err(&udev->dev,
				"Driver supports up to %i em28xx boards.\n",
3428
			       EM28XX_MAXBOARDS);
3429 3430 3431
			retval = -ENOMEM;
			goto err_no_slot;
		}
3432
	} while (test_and_set_bit(nr, em28xx_devused));
3433 3434 3435

	/* Don't register audio interfaces */
	if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3436 3437
		dev_err(&udev->dev,
			"audio device (%04x:%04x): interface %i, class %i\n",
3438 3439 3440 3441 3442
			le16_to_cpu(udev->descriptor.idVendor),
			le16_to_cpu(udev->descriptor.idProduct),
			ifnum,
			interface->altsetting[0].desc.bInterfaceClass);

3443 3444
		retval = -ENODEV;
		goto err;
3445 3446
	}

3447 3448 3449 3450 3451 3452 3453 3454
	/* allocate memory for our device state and initialize it */
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (dev == NULL) {
		retval = -ENOMEM;
		goto err;
	}

	/* compute alternate max packet sizes */
3455 3456
	dev->alt_max_pkt_size_isoc =
				kmalloc(sizeof(dev->alt_max_pkt_size_isoc[0]) *
3457
					interface->num_altsetting, GFP_KERNEL);
3458
	if (dev->alt_max_pkt_size_isoc == NULL) {
3459 3460 3461 3462 3463
		kfree(dev);
		retval = -ENOMEM;
		goto err;
	}

3464 3465 3466 3467 3468
	/* Get endpoints */
	for (i = 0; i < interface->num_altsetting; i++) {
		int ep;

		for (ep = 0; ep < interface->altsetting[i].desc.bNumEndpoints; ep++) {
3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479
			const struct usb_endpoint_descriptor *e;
			int sizedescr, size;

			e = &interface->altsetting[i].endpoint[ep].desc;

			sizedescr = le16_to_cpu(e->wMaxPacketSize);
			size = sizedescr & 0x7ff;

			if (udev->speed == USB_SPEED_HIGH)
				size = size * hb_mult(sizedescr);

3480
			if (usb_endpoint_dir_in(e)) {
3481
				switch (e->bEndpointAddress) {
3482
				case 0x82:
3483
					has_video = true;
3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494
					if (usb_endpoint_xfer_isoc(e)) {
						dev->analog_ep_isoc =
							    e->bEndpointAddress;
						dev->alt_max_pkt_size_isoc[i] = size;
					} else if (usb_endpoint_xfer_bulk(e)) {
						dev->analog_ep_bulk =
							    e->bEndpointAddress;
					}
					break;
				case 0x83:
					if (usb_endpoint_xfer_isoc(e)) {
3495
						has_vendor_audio = true;
3496
					} else {
3497 3498
						dev_err(&udev->dev,
							"error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
3499
					}
3500
					break;
3501 3502 3503 3504 3505 3506 3507 3508
				case 0x84:
					if (has_video &&
					    (usb_endpoint_xfer_bulk(e))) {
						dev->analog_ep_bulk =
							    e->bEndpointAddress;
					} else {
						if (usb_endpoint_xfer_isoc(e)) {
							if (size > dev->dvb_max_pkt_size_isoc) {
3509
								has_dvb = true; /* see NOTE (~) */
3510
								dev->dvb_ep_isoc = e->bEndpointAddress;
3511 3512 3513 3514
								dev->dvb_max_pkt_size_isoc = size;
								dev->dvb_alt_isoc = i;
							}
						} else {
3515
							has_dvb = true;
3516 3517
							dev->dvb_ep_bulk = e->bEndpointAddress;
						}
3518 3519 3520 3521
					}
					break;
				}
			}
3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541
			/* NOTE:
			 * Old logic with support for isoc transfers only was:
			 *  0x82	isoc		=> analog
			 *  0x83	isoc		=> audio
			 *  0x84	isoc		=> digital
			 *
			 * New logic with support for bulk transfers
			 *  0x82	isoc		=> analog
			 *  0x82	bulk		=> analog
			 *  0x83	isoc*		=> audio
			 *  0x84	isoc		=> digital
			 *  0x84	bulk		=> analog or digital**
			 * (*: audio should always be isoc)
			 * (**: analog, if ep 0x82 is isoc, otherwise digital)
			 *
			 * The new logic preserves backwards compatibility and
			 * reflects the endpoint configurations we have seen
			 * so far. But there might be devices for which this
			 * logic is not sufficient...
			 */
3542 3543 3544 3545 3546 3547
			/*
			 * NOTE (~): some manufacturers (e.g. Terratec) disable
			 * endpoints by setting wMaxPacketSize to 0 bytes for
			 * all alt settings. So far, we've seen this for
			 * DVB isoc endpoints only.
			 */
3548 3549 3550
		}
	}

3551
	if (!(has_vendor_audio || has_video || has_dvb)) {
3552 3553
		retval = -ENODEV;
		goto err_free;
3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570
	}

	switch (udev->speed) {
	case USB_SPEED_LOW:
		speed = "1.5";
		break;
	case USB_SPEED_UNKNOWN:
	case USB_SPEED_FULL:
		speed = "12";
		break;
	case USB_SPEED_HIGH:
		speed = "480";
		break;
	default:
		speed = "unknown";
	}

3571 3572
	dev_err(&udev->dev,
		"New device %s %s @ %s Mbps (%04x:%04x, interface %d, class %d)\n",
3573 3574
		udev->manufacturer ? udev->manufacturer : "",
		udev->product ? udev->product : "",
3575 3576 3577 3578 3579 3580
		speed,
		le16_to_cpu(udev->descriptor.idVendor),
		le16_to_cpu(udev->descriptor.idProduct),
		ifnum,
		interface->altsetting->desc.bInterfaceNumber);

3581 3582 3583 3584 3585
	/*
	 * Make sure we have 480 Mbps of bandwidth, otherwise things like
	 * video stream wouldn't likely work, since 12 Mbps is generally
	 * not enough even for most Digital TV streams.
	 */
3586
	if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
3587 3588 3589
		dev_err(&udev->dev, "Device initialization failed.\n");
		dev_err(&udev->dev,
			"Device must be connected to a high-speed USB 2.0 port.\n");
3590
		retval = -ENODEV;
3591
		goto err_free;
3592 3593 3594 3595 3596
	}

	dev->devno = nr;
	dev->model = id->driver_info;
	dev->alt   = -1;
3597
	dev->is_audio_only = has_vendor_audio && !(has_video || has_dvb);
3598
	dev->has_video = has_video;
3599
	dev->ifnum = ifnum;
3600

3601
	if (has_vendor_audio) {
3602 3603
		dev_err(&udev->dev,
			"Audio interface %i found (Vendor Class)\n", ifnum);
3604 3605 3606
		dev->usb_audio_type = EM28XX_USB_AUDIO_VENDOR;
	}
	/* Checks if audio is provided by a USB Audio Class interface */
3607
	for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
3608
		struct usb_interface *uif = udev->config->interface[i];
3609

3610
		if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3611
			if (has_vendor_audio)
3612 3613
				dev_err(&udev->dev,
					"em28xx: device seems to have vendor AND usb audio class interfaces !\n"
3614
				       "\t\tThe vendor interface will be ignored. Please contact the developers <linux-media@vger.kernel.org>\n");
3615
			dev->usb_audio_type = EM28XX_USB_AUDIO_CLASS;
3616 3617 3618 3619
			break;
		}
	}

3620
	if (has_video)
3621
		dev_err(&udev->dev, "Video interface %i found:%s%s\n",
3622 3623 3624
			ifnum,
			dev->analog_ep_bulk ? " bulk" : "",
			dev->analog_ep_isoc ? " isoc" : "");
3625
	if (has_dvb)
3626
		dev_err(&udev->dev, "DVB interface %i found:%s%s\n",
3627 3628 3629
			ifnum,
			dev->dvb_ep_bulk ? " bulk" : "",
			dev->dvb_ep_isoc ? " isoc" : "");
3630

3631
	dev->num_alt = interface->num_altsetting;
3632

3633
	if ((unsigned)card[nr] < em28xx_bcount)
3634 3635
		dev->model = card[nr];

3636 3637 3638
	/* save our data pointer in this interface device */
	usb_set_intfdata(interface, dev);

3639
	/* allocate device struct and check if the device is a webcam */
3640
	mutex_init(&dev->lock);
3641
	retval = em28xx_init_dev(dev, udev, interface, nr);
3642
	if (retval) {
3643
		goto err_free;
3644 3645
	}

3646
	if (usb_xfer_mode < 0) {
3647 3648 3649 3650 3651
		if (dev->board.is_webcam)
			try_bulk = 1;
		else
			try_bulk = 0;
	} else {
3652
		try_bulk = usb_xfer_mode > 0;
3653 3654
	}

3655 3656 3657
	/* Disable V4L2 if the device doesn't have a decoder */
	if (has_video &&
	    dev->board.decoder == EM28XX_NODECODER && !dev->board.is_webcam) {
3658 3659
		dev_err(&udev->dev,
			"Currently, V4L2 is not supported on this model\n");
3660 3661 3662 3663
		has_video = false;
		dev->has_video = false;
	}

3664 3665
	/* Select USB transfer types to use */
	if (has_video) {
3666 3667
		if (!dev->analog_ep_isoc || (try_bulk && dev->analog_ep_bulk))
			dev->analog_xfer_bulk = 1;
3668
		dev_err(&udev->dev, "analog set to %s mode.\n",
3669
			dev->analog_xfer_bulk ? "bulk" : "isoc");
3670
	}
3671
	if (has_dvb) {
3672 3673
		if (!dev->dvb_ep_isoc || (try_bulk && dev->dvb_ep_bulk))
			dev->dvb_xfer_bulk = 1;
3674
		dev_err(&udev->dev, "dvb set to %s mode.\n",
3675
			dev->dvb_xfer_bulk ? "bulk" : "isoc");
3676 3677
	}

3678 3679
	kref_init(&dev->ref);

3680 3681
	request_modules(dev);

3682 3683 3684 3685
	/*
	 * Do it at the end, to reduce dynamic configuration changes during
	 * the device init. Yet, as request_modules() can be async, the
	 * topology will likely change after the load of the em28xx subdrivers.
3686
	 */
3687 3688 3689
#ifdef CONFIG_MEDIA_CONTROLLER
	retval = media_device_register(dev->media_dev);
#endif
3690 3691

	return 0;
3692

3693
err_free:
3694
	kfree(dev->alt_max_pkt_size_isoc);
3695 3696
	kfree(dev);

3697
err:
3698
	clear_bit(nr, em28xx_devused);
3699 3700 3701

err_no_slot:
	usb_put_dev(udev);
3702
	return retval;
3703 3704 3705 3706
}

/*
 * em28xx_usb_disconnect()
3707
 * called when the device gets disconnected
3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719
 * video device will be unregistered on v4l2_close in case it is still open
 */
static void em28xx_usb_disconnect(struct usb_interface *interface)
{
	struct em28xx *dev;

	dev = usb_get_intfdata(interface);
	usb_set_intfdata(interface, NULL);

	if (!dev)
		return;

3720 3721
	dev->disconnected = 1;

3722
	dev_err(&dev->udev->dev, "Disconnecting\n");
3723

3724 3725
	flush_request_modules(dev);

3726
	em28xx_close_extension(dev);
3727

3728
	em28xx_release_resources(dev);
3729
	kref_put(&dev->ref, em28xx_free_device);
3730 3731
}

3732
static int em28xx_usb_suspend(struct usb_interface *interface,
3733
			      pm_message_t message)
3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754
{
	struct em28xx *dev;

	dev = usb_get_intfdata(interface);
	if (!dev)
		return 0;
	em28xx_suspend_extension(dev);
	return 0;
}

static int em28xx_usb_resume(struct usb_interface *interface)
{
	struct em28xx *dev;

	dev = usb_get_intfdata(interface);
	if (!dev)
		return 0;
	em28xx_resume_extension(dev);
	return 0;
}

3755 3756 3757 3758
static struct usb_driver em28xx_usb_driver = {
	.name = "em28xx",
	.probe = em28xx_usb_probe,
	.disconnect = em28xx_usb_disconnect,
3759 3760
	.suspend = em28xx_usb_suspend,
	.resume = em28xx_usb_resume,
3761
	.reset_resume = em28xx_usb_resume,
3762 3763 3764
	.id_table = em28xx_id_table,
};

3765
module_usb_driver(em28xx_usb_driver);