brintos

brintos / linux-shallow public Read only

0
0
Text · 124.4 KiB · a51cbcf Raw
4244 lines · c
1// SPDX-License-Identifier: GPL-2.0+2//3// em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB4//		    video capture devices5//6// Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>7//		      Markus Rechberger <mrechberger@gmail.com>8//		      Mauro Carvalho Chehab <mchehab@kernel.org>9//		      Sascha Sommer <saschasommer@freenet.de>10// Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>11 12#include "em28xx.h"13 14#include <linux/init.h>15#include <linux/module.h>16#include <linux/slab.h>17#include <linux/delay.h>18#include <linux/i2c.h>19#include <linux/usb.h>20#include <media/tuner.h>21#include <media/drv-intf/msp3400.h>22#include <media/i2c/saa7115.h>23#include <dt-bindings/media/tvp5150.h>24#include <media/i2c/tvaudio.h>25#include <media/tveeprom.h>26#include <media/v4l2-common.h>27#include <sound/ac97_codec.h>28 29#define DRIVER_NAME         "em28xx"30 31static int tuner = -1;32module_param(tuner, int, 0444);33MODULE_PARM_DESC(tuner, "tuner type");34 35static unsigned int disable_ir;36module_param(disable_ir, int, 0444);37MODULE_PARM_DESC(disable_ir, "disable infrared remote support");38 39static unsigned int disable_usb_speed_check;40module_param(disable_usb_speed_check, int, 0444);41MODULE_PARM_DESC(disable_usb_speed_check,42		 "override min bandwidth requirement of 480M bps");43 44static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };45module_param_array(card,  int, NULL, 0444);46MODULE_PARM_DESC(card,     "card type");47 48static int usb_xfer_mode = -1;49module_param(usb_xfer_mode, int, 0444);50MODULE_PARM_DESC(usb_xfer_mode,51		 "USB transfer mode for frame data (-1 = auto, 0 = prefer isoc, 1 = prefer bulk)");52 53/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */54static DECLARE_BITMAP(em28xx_devused, EM28XX_MAXBOARDS);55 56struct em28xx_hash_table {57	unsigned long hash;58	unsigned int  model;59	unsigned int  tuner;60};61 62static void em28xx_pre_card_setup(struct em28xx *dev);63 64/*65 *  Reset sequences for analog/digital modes66 */67 68/* Reset for the most [analog] boards */69static const struct em28xx_reg_seq default_analog[] = {70	{EM2820_R08_GPIO_CTRL,	0x6d,   ~EM_GPIO_4,	10},71	{	-1,		-1,	-1,		-1},72};73 74/* Reset for the most [digital] boards */75static const struct em28xx_reg_seq default_digital[] = {76	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},77	{	-1,		-1,	-1,		-1},78};79 80/* Board :Zolid Hybrid Tv Stick */81static struct em28xx_reg_seq zolid_tuner[] = {82	{EM2820_R08_GPIO_CTRL,		0xfd,		0xff,	100},83	{EM2820_R08_GPIO_CTRL,		0xfe,		0xff,	100},84	{		-1,					-1,			-1,		 -1},85};86 87static struct em28xx_reg_seq zolid_digital[] = {88	{EM2820_R08_GPIO_CTRL,		0x6a,		0xff,	100},89	{EM2820_R08_GPIO_CTRL,		0x7a,		0xff,	100},90	{EM2880_R04_GPO,			0x04,		0xff,	100},91	{EM2880_R04_GPO,			0x0c,		0xff,	100},92	{	-1,						-1,			-1,		 -1},93};94 95/* Board Hauppauge WinTV HVR 900 analog */96static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {97	{EM2820_R08_GPIO_CTRL,	0x2d,	~EM_GPIO_4,	10},98	{	0x05,		0xff,	0x10,		10},99	{	-1,		-1,	-1,		-1},100};101 102/* Board Hauppauge WinTV HVR 900 digital */103static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {104	{EM2820_R08_GPIO_CTRL,	0x2e,	~EM_GPIO_4,	10},105	{EM2880_R04_GPO,	0x04,	0x0f,		10},106	{EM2880_R04_GPO,	0x0c,	0x0f,		10},107	{	-1,		-1,	-1,		-1},108};109 110/* Board Hauppauge WinTV HVR 900 (R2) digital */111static const struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {112	{EM2820_R08_GPIO_CTRL,	0x2e,	~EM_GPIO_4,	10},113	{EM2880_R04_GPO,	0x0c,	0x0f,		10},114	{	-1,		-1,	-1,		-1},115};116 117/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */118static const struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {119	{EM2820_R08_GPIO_CTRL,	0x69,   ~EM_GPIO_4,	10},120	{	-1,		-1,	-1,		-1},121};122 123/* Board - EM2882 Kworld 315U digital */124static const struct em28xx_reg_seq em2882_kworld_315u_digital[] = {125	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},126	{EM2820_R08_GPIO_CTRL,	0xfe,	0xff,		10},127	{EM2880_R04_GPO,	0x04,	0xff,		10},128	{EM2880_R04_GPO,	0x0c,	0xff,		10},129	{EM2820_R08_GPIO_CTRL,	0x7e,	0xff,		10},130	{	-1,		-1,	-1,		-1},131};132 133static const struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {134	{EM2880_R04_GPO,	0x08,	0xff,		10},135	{EM2880_R04_GPO,	0x0c,	0xff,		10},136	{EM2880_R04_GPO,	0x08,	0xff,		10},137	{EM2880_R04_GPO,	0x0c,	0xff,		10},138	{	-1,		-1,	-1,		-1},139};140 141static const struct em28xx_reg_seq kworld_330u_analog[] = {142	{EM2820_R08_GPIO_CTRL,	0x6d,	~EM_GPIO_4,	10},143	{EM2880_R04_GPO,	0x00,	0xff,		10},144	{	-1,		-1,	-1,		-1},145};146 147static const struct em28xx_reg_seq kworld_330u_digital[] = {148	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},149	{EM2880_R04_GPO,	0x08,	0xff,		10},150	{	-1,		-1,	-1,		-1},151};152 153/*154 * Evga inDtube155 * GPIO0 - Enable digital power (s5h1409) - low to enable156 * GPIO1 - Enable analog power (tvp5150/emp202) - low to enable157 * GPIO4 - xc3028 reset158 * GOP3  - s5h1409 reset159 */160static const struct em28xx_reg_seq evga_indtube_analog[] = {161	{EM2820_R08_GPIO_CTRL,	0x79,   0xff,		60},162	{	-1,		-1,	-1,		-1},163};164 165static const struct em28xx_reg_seq evga_indtube_digital[] = {166	{EM2820_R08_GPIO_CTRL,	0x7a,	0xff,		 1},167	{EM2880_R04_GPO,	0x04,	0xff,		10},168	{EM2880_R04_GPO,	0x0c,	0xff,		 1},169	{	-1,		-1,	-1,		-1},170};171 172/*173 * KWorld PlusTV 340U, UB435-Q and UB435-Q V2 (ATSC) GPIOs map:174 * EM_GPIO_0 - currently unknown175 * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)176 * EM_GPIO_2 - currently unknown177 * EM_GPIO_3 - currently unknown178 * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)179 * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)180 * EM_GPIO_6 - currently unknown181 * EM_GPIO_7 - currently unknown182 */183static const struct em28xx_reg_seq kworld_a340_digital[] = {184	{EM2820_R08_GPIO_CTRL,	0x6d,	~EM_GPIO_4,	10},185	{	-1,		-1,	-1,		-1},186};187 188static const struct em28xx_reg_seq kworld_ub435q_v3_digital[] = {189	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	100},190	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	100},191	{EM2874_R80_GPIO_P0_CTRL,	0xbe,	0xff,	100},192	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	100},193	{	-1,			-1,	-1,	-1},194};195 196/* Pinnacle Hybrid Pro eb1a:2881 */197static const struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {198	{EM2820_R08_GPIO_CTRL,	0xfd,   ~EM_GPIO_4,	10},199	{	-1,		-1,	-1,		-1},200};201 202static const struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {203	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},204	{EM2880_R04_GPO,	0x04,	0xff,	       100},/* zl10353 reset */205	{EM2880_R04_GPO,	0x0c,	0xff,		 1},206	{	-1,		-1,	-1,		-1},207};208 209static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {210	{EM2820_R08_GPIO_CTRL,	0x6d,	~EM_GPIO_4,	10},211	{EM2880_R04_GPO,	0x00,	0xff,		10},212	{	-1,		-1,	-1,		-1},213};214 215static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {216	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},217	{EM2880_R04_GPO,	0x08,	0xff,		10},218	{	-1,		-1,	-1,		-1},219};220 221/*222 * PCTV HD Mini (80e) GPIOs223 * 0-5: not used224 * 6:   demod reset, active low225 * 7:   LED on, active high226 */227static const struct em28xx_reg_seq em2874_pctv_80e_digital[] = {228	{EM28XX_R06_I2C_CLK,    0x45,   0xff,		  10}, /*400 KHz*/229	{EM2874_R80_GPIO_P0_CTRL, 0x00,   0xff,		  100},/*Demod reset*/230	{EM2874_R80_GPIO_P0_CTRL, 0x40,   0xff,		  10},231	{  -1,			-1,	-1,		  -1},232};233 234/*235 * eb1a:2868 Reddo DVB-C USB TV Box236 * GPIO4 - CU1216L NIM237 * Other GPIOs seems to be don't care.238 */239static const struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {240	{EM2820_R08_GPIO_CTRL,	0xfe,	0xff,		10},241	{EM2820_R08_GPIO_CTRL,	0xde,	0xff,		10},242	{EM2820_R08_GPIO_CTRL,	0xfe,	0xff,		10},243	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},244	{EM2820_R08_GPIO_CTRL,	0x7f,	0xff,		10},245	{EM2820_R08_GPIO_CTRL,	0x6f,	0xff,		10},246	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},247	{	-1,		-1,	-1,		-1},248};249 250/* Callback for the most boards */251static const struct em28xx_reg_seq default_tuner_gpio[] = {252	{EM2820_R08_GPIO_CTRL,	EM_GPIO_4,	EM_GPIO_4,	10},253	{EM2820_R08_GPIO_CTRL,	0,		EM_GPIO_4,	10},254	{EM2820_R08_GPIO_CTRL,	EM_GPIO_4,	EM_GPIO_4,	10},255	{	-1,		-1,		-1,		-1},256};257 258/* Mute/unmute */259static const struct em28xx_reg_seq compro_unmute_tv_gpio[] = {260	{EM2820_R08_GPIO_CTRL,	5,	7,	10},261	{	-1,		-1,	-1,	-1},262};263 264static const struct em28xx_reg_seq compro_unmute_svid_gpio[] = {265	{EM2820_R08_GPIO_CTRL,	4,	7,	10},266	{	-1,		-1,	-1,	-1},267};268 269static const struct em28xx_reg_seq compro_mute_gpio[] = {270	{EM2820_R08_GPIO_CTRL,	6,	7,	10},271	{	-1,		-1,	-1,	-1},272};273 274/* Terratec AV350 */275static const struct em28xx_reg_seq terratec_av350_mute_gpio[] = {276	{EM2820_R08_GPIO_CTRL,	0xff,	0x7f,		10},277	{	-1,		-1,	-1,		-1},278};279 280static const struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {281	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},282	{	-1,		-1,	-1,		-1},283};284 285static const struct em28xx_reg_seq silvercrest_reg_seq[] = {286	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},287	{EM2820_R08_GPIO_CTRL,	0x01,	0xf7,		10},288	{	-1,		-1,	-1,		-1},289};290 291static const struct em28xx_reg_seq vc211a_enable[] = {292	{EM2820_R08_GPIO_CTRL,	0xff,	0x07,		10},293	{EM2820_R08_GPIO_CTRL,	0xff,	0x0f,		10},294	{EM2820_R08_GPIO_CTRL,	0xff,	0x0b,		10},295	{	-1,		-1,	-1,		-1},296};297 298static const struct em28xx_reg_seq dikom_dk300_digital[] = {299	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},300	{EM2880_R04_GPO,	0x08,	0xff,		10},301	{	-1,		-1,	-1,		-1},302};303 304/* Reset for the most [digital] boards */305static const struct em28xx_reg_seq leadership_digital[] = {306	{EM2874_R80_GPIO_P0_CTRL,	0x70,	0xff,	10},307	{	-1,			-1,	-1,	-1},308};309 310static const struct em28xx_reg_seq leadership_reset[] = {311	{EM2874_R80_GPIO_P0_CTRL,	0xf0,	0xff,	10},312	{EM2874_R80_GPIO_P0_CTRL,	0xb0,	0xff,	10},313	{EM2874_R80_GPIO_P0_CTRL,	0xf0,	0xff,	10},314	{	-1,			-1,	-1,	-1},315};316 317/*318 * 2013:024f PCTV nanoStick T2 290e319 * GPIO_6 - demod reset320 * GPIO_7 - LED321 */322static const struct em28xx_reg_seq pctv_290e[] = {323	{EM2874_R80_GPIO_P0_CTRL,	0x00,	0xff,	80},324	{EM2874_R80_GPIO_P0_CTRL,	0x40,	0xff,	80}, /* GPIO_6 = 1 */325	{EM2874_R80_GPIO_P0_CTRL,	0xc0,	0xff,	80}, /* GPIO_7 = 1 */326	{	-1,			-1,	-1,	-1},327};328 329#if 0330static const struct em28xx_reg_seq terratec_h5_gpio[] = {331	{EM2820_R08_GPIO_CTRL,		0xff,	0xff,	10},332	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	100},333	{EM2874_R80_GPIO_P0_CTRL,	0xf2,	0xff,	50},334	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	50},335	{	-1,			-1,	-1,	-1},336};337 338static const struct em28xx_reg_seq terratec_h5_digital[] = {339	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	10},340	{EM2874_R80_GPIO_P0_CTRL,	0xe6,	0xff,	100},341	{EM2874_R80_GPIO_P0_CTRL,	0xa6,	0xff,	10},342	{	-1,			-1,	-1,	-1},343};344#endif345 346/*347 * 2013:024f PCTV DVB-S2 Stick 460e348 * GPIO_0 - POWER_ON349 * GPIO_1 - BOOST350 * GPIO_2 - VUV_LNB (red LED)351 * GPIO_3 - EXT_12V352 * GPIO_4 - INT_DEM (DEMOD GPIO_0)353 * GPIO_5 - INT_LNB354 * GPIO_6 - RESET_DEM355 * GPIO_7 - LED (green LED)356 */357static const struct em28xx_reg_seq pctv_460e[] = {358	{EM2874_R80_GPIO_P0_CTRL,	0x01,	0xff,	50},359	{	0x0d,			0xff,	0xff,	50},360	{EM2874_R80_GPIO_P0_CTRL,	0x41,	0xff,	50}, /* GPIO_6=1 */361	{	0x0d,			0x42,	0xff,	50},362	{EM2874_R80_GPIO_P0_CTRL,	0x61,	0xff,	50}, /* GPIO_5=1 */363	{	-1,			-1,	-1,	-1},364};365 366static const struct em28xx_reg_seq c3tech_digital_duo_digital[] = {367	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	10},368	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	10}, /* xc5000 reset */369	{EM2874_R80_GPIO_P0_CTRL,	0xf9,	0xff,	35},370	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	10},371	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	10},372	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	10},373	{EM2874_R80_GPIO_P0_CTRL,	0xbe,	0xff,	10},374	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	20},375	{	-1,			-1,	-1,	-1},376};377 378/*379 * 2013:0258 PCTV DVB-S2 Stick (461e)380 * GPIO 0 = POWER_ON381 * GPIO 1 = BOOST382 * GPIO 2 = VUV_LNB (red LED)383 * GPIO 3 = #EXT_12V384 * GPIO 4 = INT_DEM385 * GPIO 5 = INT_LNB386 * GPIO 6 = #RESET_DEM387 * GPIO 7 = P07_LED (green LED)388 */389static const struct em28xx_reg_seq pctv_461e[] = {390	{EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,    0},391	{0x0d,                 0xff, 0xff,    0},392	{EM2874_R80_GPIO_P0_CTRL,      0x3f, 0xff,  100}, /* reset demod */393	{EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,  200}, /* reset demod */394	{0x0d,                 0x42, 0xff,    0},395	{EM2874_R80_GPIO_P0_CTRL,      0xeb, 0xff,    0},396	{EM2874_R5F_TS_ENABLE, 0x84, 0x84,    0}, /* parallel? | null discard */397	{                  -1,   -1,   -1,   -1},398};399 400#if 0401static const struct em28xx_reg_seq hauppauge_930c_gpio[] = {402	{EM2874_R80_GPIO_P0_CTRL,	0x6f,	0xff,	10},403	{EM2874_R80_GPIO_P0_CTRL,	0x4f,	0xff,	10}, /* xc5000 reset */404	{EM2874_R80_GPIO_P0_CTRL,	0x6f,	0xff,	10},405	{EM2874_R80_GPIO_P0_CTRL,	0x4f,	0xff,	10},406	{	-1,			-1,	-1,	-1},407};408 409static const struct em28xx_reg_seq hauppauge_930c_digital[] = {410	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	10},411	{EM2874_R80_GPIO_P0_CTRL,	0xe6,	0xff,	100},412	{EM2874_R80_GPIO_P0_CTRL,	0xa6,	0xff,	10},413	{	-1,			-1,	-1,	-1},414};415#endif416 417/*418 * 1b80:e425 MaxMedia UB425-TC419 * 1b80:e1cc Delock 61959420 * GPIO_6 - demod reset, 0=active421 * GPIO_7 - LED, 0=active422 */423static const struct em28xx_reg_seq maxmedia_ub425_tc[] = {424	{EM2874_R80_GPIO_P0_CTRL,	0x83,	0xff,	100},425	{EM2874_R80_GPIO_P0_CTRL,	0xc3,	0xff,	100}, /* GPIO_6 = 1 */426	{EM2874_R80_GPIO_P0_CTRL,	0x43,	0xff,	000}, /* GPIO_7 = 0 */427	{	-1,			-1,	-1,	-1},428};429 430/*431 * 2304:0242 PCTV QuatroStick (510e)432 * GPIO_2: decoder reset, 0=active433 * GPIO_4: decoder suspend, 0=active434 * GPIO_6: demod reset, 0=active435 * GPIO_7: LED, 1=active436 */437static const struct em28xx_reg_seq pctv_510e[] = {438	{EM2874_R80_GPIO_P0_CTRL,	0x10,	0xff,	100},439	{EM2874_R80_GPIO_P0_CTRL,	0x14,	0xff,	100}, /* GPIO_2 = 1 */440	{EM2874_R80_GPIO_P0_CTRL,	0x54,	0xff,	050}, /* GPIO_6 = 1 */441	{	-1,			-1,	-1,	-1},442};443 444/*445 * 2013:0251 PCTV QuatroStick nano (520e)446 * GPIO_2: decoder reset, 0=active447 * GPIO_4: decoder suspend, 0=active448 * GPIO_6: demod reset, 0=active449 * GPIO_7: LED, 1=active450 */451static const struct em28xx_reg_seq pctv_520e[] = {452	{EM2874_R80_GPIO_P0_CTRL,	0x10,	0xff,	100},453	{EM2874_R80_GPIO_P0_CTRL,	0x14,	0xff,	100}, /* GPIO_2 = 1 */454	{EM2874_R80_GPIO_P0_CTRL,	0x54,	0xff,	050}, /* GPIO_6 = 1 */455	{EM2874_R80_GPIO_P0_CTRL,	0xd4,	0xff,	000}, /* GPIO_7 = 1 */456	{	-1,			-1,	-1,	-1},457};458 459/*460 * 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam461 * reg 0x80/0x84:462 * GPIO_0: capturing LED, 0=on, 1=off463 * GPIO_2: AV mute button, 0=pressed, 1=unpressed464 * GPIO 3: illumination button, 0=pressed, 1=unpressed465 * GPIO_6: illumination/flash LED, 0=on, 1=off466 * reg 0x81/0x85:467 * GPIO_7: snapshot button, 0=pressed, 1=unpressed468 */469static const struct em28xx_reg_seq speedlink_vad_laplace_reg_seq[] = {470	{EM2820_R08_GPIO_CTRL,		0xf7,	0xff,	10},471	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xb2,	10},472	{	-1,			-1,	-1,	-1},473};474 475static const struct em28xx_reg_seq pctv_292e[] = {476	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},477	{0x0d,                         0xff, 0xff,    950},478	{EM2874_R80_GPIO_P0_CTRL,      0xbd, 0xff,    100},479	{EM2874_R80_GPIO_P0_CTRL,      0xfd, 0xff,    410},480	{EM2874_R80_GPIO_P0_CTRL,      0x7d, 0xff,    300},481	{EM2874_R80_GPIO_P0_CTRL,      0x7c, 0xff,     60},482	{0x0d,                         0x42, 0xff,     50},483	{EM2874_R5F_TS_ENABLE,         0x85, 0xff,      0},484	{-1,                             -1,   -1,     -1},485};486 487static const struct em28xx_reg_seq terratec_t2_stick_hd[] = {488	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	0},489	{0x0d,				0xff,	0xff,	600},490	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	10},491	{EM2874_R80_GPIO_P0_CTRL,	0xbc,	0xff,	100},492	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	100},493	{EM2874_R80_GPIO_P0_CTRL,	0x00,	0xff,	300},494	{EM2874_R80_GPIO_P0_CTRL,	0xf8,	0xff,	100},495	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	300},496	{0x0d,				0x42,	0xff,	1000},497	{EM2874_R5F_TS_ENABLE,		0x85,	0xff,	0},498	{-1,                             -1,   -1,     -1},499};500 501static const struct em28xx_reg_seq plex_px_bcud[] = {502	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	0},503	{0x0d,				0xff,	0xff,	0},504	{EM2874_R50_IR_CONFIG,		0x01,	0xff,	0},505	{EM28XX_R06_I2C_CLK,		0x40,	0xff,	0},506	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	100},507	{EM28XX_R12_VINENABLE,		0x20,	0x20,	0},508	{0x0d,				0x42,	0xff,	1000},509	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	10},510	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	10},511	{0x73,				0xfd,	0xff,	100},512	{-1,				-1,	-1,	-1},513};514 515/*516 * 2040:0265 Hauppauge WinTV-dualHD DVB Isoc517 * 2040:8265 Hauppauge WinTV-dualHD DVB Bulk518 * 2040:026d Hauppauge WinTV-dualHD ATSC/QAM Isoc519 * 2040:826d Hauppauge WinTV-dualHD ATSC/QAM Bulk520 * reg 0x80/0x84:521 * GPIO_0: Yellow LED tuner 1, 0=on, 1=off522 * GPIO_1: Green LED tuner 1, 0=on, 1=off523 * GPIO_2: Yellow LED tuner 2, 0=on, 1=off524 * GPIO_3: Green LED tuner 2, 0=on, 1=off525 * GPIO_5: Reset #2, 0=active526 * GPIO_6: Reset #1, 0=active527 */528static const struct em28xx_reg_seq hauppauge_dualhd_dvb[] = {529	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},530	{0x0d,                         0xff, 0xff,    200},531	{0x50,                         0x04, 0xff,    300},532	{EM2874_R80_GPIO_P0_CTRL,      0xbf, 0xff,    100}, /* demod 1 reset */533	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},534	{EM2874_R80_GPIO_P0_CTRL,      0xdf, 0xff,    100}, /* demod 2 reset */535	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},536	{EM2874_R5F_TS_ENABLE,         0x00, 0xff,     50}, /* disable TS filters */537	{EM2874_R5D_TS1_PKT_SIZE,      0x05, 0xff,     50},538	{EM2874_R5E_TS2_PKT_SIZE,      0x05, 0xff,     50},539	{-1,                             -1,   -1,     -1},540};541 542/* Hauppauge USB QuadHD */543static struct em28xx_reg_seq hauppauge_usb_quadhd_atsc_reg_seq[] = {544	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},545	{0x0d,                         0xff, 0xff,    200},546	{0x50,                         0x04, 0xff,    300},547	{EM2874_R80_GPIO_P0_CTRL,      0xb0, 0xf0,    100}, /* demod 1 reset */548	{EM2874_R80_GPIO_P0_CTRL,      0xf0, 0xf0,    100},549	{EM2874_R80_GPIO_P0_CTRL,      0xd0, 0xf0,    100}, /* demod 2 reset */550	{EM2874_R80_GPIO_P0_CTRL,      0xf0, 0xf0,    100},551	{EM2874_R5F_TS_ENABLE,         0x44, 0xff,     50},552	{EM2874_R5D_TS1_PKT_SIZE,      0x05, 0xff,     50},553	{EM2874_R5E_TS2_PKT_SIZE,      0x05, 0xff,     50},554	{-1,                           -1,   -1,       -1},555};556 557/*558 * MyGica USB TV Box559 * GPIO_1,0: 00=Composite audio560 *           01=Tuner audio561 *           10=Mute audio562 *           11=FM radio? (if equipped)563 * GPIO_2-6: Unused564 * GPIO_7:   ??565 */566static const struct em28xx_reg_seq mygica_utv3_composite_audio_gpio[] = {567	{EM2820_R08_GPIO_CTRL, 0xfc, 0xff, 0},568	{ -1, -1, -1, -1},569};570 571static const struct em28xx_reg_seq mygica_utv3_tuner_audio_gpio[] = {572	{EM2820_R08_GPIO_CTRL, 0xfd, 0xff, 0},573	{ -1, -1, -1, -1},574};575 576static const struct em28xx_reg_seq mygica_utv3_suspend_gpio[] = {577	{EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 0},578	{ -1, -1, -1, -1},579};580 581/*582 *  Button definitions583 */584static const struct em28xx_button std_snapshot_button[] = {585	{586		.role         = EM28XX_BUTTON_SNAPSHOT,587		.reg_r        = EM28XX_R0C_USBSUSP,588		.reg_clearing = EM28XX_R0C_USBSUSP,589		.mask         = EM28XX_R0C_USBSUSP_SNAPSHOT,590		.inverted     = 0,591	},592	{-1, 0, 0, 0, 0},593};594 595static const struct em28xx_button speedlink_vad_laplace_buttons[] = {596	{597		.role     = EM28XX_BUTTON_SNAPSHOT,598		.reg_r    = EM2874_R85_GPIO_P1_STATE,599		.mask     = 0x80,600		.inverted = 1,601	},602	{603		.role     = EM28XX_BUTTON_ILLUMINATION,604		.reg_r    = EM2874_R84_GPIO_P0_STATE,605		.mask     = 0x08,606		.inverted = 1,607	},608	{-1, 0, 0, 0, 0},609};610 611/*612 *  LED definitions613 */614static struct em28xx_led speedlink_vad_laplace_leds[] = {615	{616		.role      = EM28XX_LED_ANALOG_CAPTURING,617		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,618		.gpio_mask = 0x01,619		.inverted  = 1,620	},621	{622		.role      = EM28XX_LED_ILLUMINATION,623		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,624		.gpio_mask = 0x40,625		.inverted  = 1,626	},627	{-1, 0, 0, 0},628};629 630static struct em28xx_led kworld_ub435q_v3_leds[] = {631	{632		.role      = EM28XX_LED_DIGITAL_CAPTURING,633		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,634		.gpio_mask = 0x80,635		.inverted  = 1,636	},637	{-1, 0, 0, 0},638};639 640static struct em28xx_led pctv_80e_leds[] = {641	{642		.role      = EM28XX_LED_DIGITAL_CAPTURING,643		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,644		.gpio_mask = 0x80,645		.inverted  = 0,646	},647	{-1, 0, 0, 0},648};649 650static struct em28xx_led terratec_grabby_leds[] = {651	{652		.role      = EM28XX_LED_ANALOG_CAPTURING,653		.gpio_reg  = EM2820_R08_GPIO_CTRL,654		.gpio_mask = EM_GPIO_3,655		.inverted  = 1,656	},657	{-1, 0, 0, 0},658};659 660static struct em28xx_led hauppauge_dualhd_leds[] = {661	{662		.role      = EM28XX_LED_DIGITAL_CAPTURING,663		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,664		.gpio_mask = EM_GPIO_1,665		.inverted  = 1,666	},667	{668		.role      = EM28XX_LED_DIGITAL_CAPTURING_TS2,669		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,670		.gpio_mask = EM_GPIO_3,671		.inverted  = 1,672	},673	{-1, 0, 0, 0},674};675 676static struct em28xx_led hauppauge_usb_quadhd_leds[] = {677	{678		.role      = EM28XX_LED_DIGITAL_CAPTURING,679		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,680		.gpio_mask = EM_GPIO_2,681		.inverted  = 1,682	},683	{684		.role      = EM28XX_LED_DIGITAL_CAPTURING_TS2,685		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,686		.gpio_mask = EM_GPIO_0,687		.inverted  = 1,688	},689	{-1, 0, 0, 0},690};691 692/*693 *  Board definitions694 */695const struct em28xx_board em28xx_boards[] = {696	[EM2750_BOARD_UNKNOWN] = {697		.name          = "EM2710/EM2750/EM2751 webcam grabber",698		.xclk          = EM28XX_XCLK_FREQUENCY_20MHZ,699		.tuner_type    = TUNER_ABSENT,700		.is_webcam     = 1,701		.input         = { {702			.type     = EM28XX_VMUX_COMPOSITE,703			.vmux     = 0,704			.amux     = EM28XX_AMUX_VIDEO,705			.gpio     = silvercrest_reg_seq,706		} },707	},708	[EM2800_BOARD_UNKNOWN] = {709		.name         = "Unknown EM2800 video grabber",710		.is_em2800    = 1,711		.tda9887_conf = TDA9887_PRESENT,712		.decoder      = EM28XX_SAA711X,713		.tuner_type   = TUNER_ABSENT,714		.input        = { {715			.type     = EM28XX_VMUX_COMPOSITE,716			.vmux     = SAA7115_COMPOSITE0,717			.amux     = EM28XX_AMUX_LINE_IN,718		}, {719			.type     = EM28XX_VMUX_SVIDEO,720			.vmux     = SAA7115_SVIDEO3,721			.amux     = EM28XX_AMUX_LINE_IN,722		} },723	},724	[EM2820_BOARD_UNKNOWN] = {725		.name          = "Unknown EM2750/28xx video grabber",726		.tuner_type    = TUNER_ABSENT,727		.is_webcam     = 1,	/* To enable sensor probe */728	},729	[EM2882_BOARD_ZOLID_HYBRID_TV_STICK] = {730		.name			= ":ZOLID HYBRID TV STICK",731		.tuner_type		= TUNER_XC2028,732		.tuner_gpio		= zolid_tuner,733		.decoder		= EM28XX_TVP5150,734		.xclk			= EM28XX_XCLK_FREQUENCY_12MHZ,735		.mts_firmware	= 1,736		.has_dvb		= 1,737		.dvb_gpio		= zolid_digital,738	},739	[EM2750_BOARD_DLCW_130] = {740		/* Beijing Huaqi Information Digital Technology Co., Ltd */741		.name          = "Huaqi DLCW-130",742		.valid         = EM28XX_BOARD_NOT_VALIDATED,743		.xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,744		.tuner_type    = TUNER_ABSENT,745		.is_webcam     = 1,746		.input         = { {747			.type     = EM28XX_VMUX_COMPOSITE,748			.vmux     = 0,749			.amux     = EM28XX_AMUX_VIDEO,750		} },751	},752	[EM2820_BOARD_KWORLD_PVRTV2800RF] = {753		.name         = "Kworld PVR TV 2800 RF",754		.tuner_type   = TUNER_TEMIC_PAL,755		.tda9887_conf = TDA9887_PRESENT,756		.decoder      = EM28XX_SAA711X,757		.input        = { {758			.type     = EM28XX_VMUX_COMPOSITE,759			.vmux     = SAA7115_COMPOSITE0,760			.amux     = EM28XX_AMUX_LINE_IN,761		}, {762			.type     = EM28XX_VMUX_SVIDEO,763			.vmux     = SAA7115_SVIDEO3,764			.amux     = EM28XX_AMUX_LINE_IN,765		} },766	},767	[EM2820_BOARD_GADMEI_TVR200] = {768		.name         = "Gadmei TVR200",769		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,770		.tda9887_conf = TDA9887_PRESENT,771		.decoder      = EM28XX_SAA711X,772		.input        = { {773			.type     = EM28XX_VMUX_TELEVISION,774			.vmux     = SAA7115_COMPOSITE2,775			.amux     = EM28XX_AMUX_LINE_IN,776		}, {777			.type     = EM28XX_VMUX_COMPOSITE,778			.vmux     = SAA7115_COMPOSITE0,779			.amux     = EM28XX_AMUX_LINE_IN,780		}, {781			.type     = EM28XX_VMUX_SVIDEO,782			.vmux     = SAA7115_SVIDEO3,783			.amux     = EM28XX_AMUX_LINE_IN,784		} },785	},786	[EM2820_BOARD_TERRATEC_CINERGY_250] = {787		.name         = "Terratec Cinergy 250 USB",788		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,789		.has_ir_i2c   = 1,790		.tda9887_conf = TDA9887_PRESENT,791		.decoder      = EM28XX_SAA711X,792		.input        = { {793			.type     = EM28XX_VMUX_TELEVISION,794			.vmux     = SAA7115_COMPOSITE2,795			.amux     = EM28XX_AMUX_VIDEO,796		}, {797			.type     = EM28XX_VMUX_COMPOSITE,798			.vmux     = SAA7115_COMPOSITE0,799			.amux     = EM28XX_AMUX_LINE_IN,800		}, {801			.type     = EM28XX_VMUX_SVIDEO,802			.vmux     = SAA7115_SVIDEO3,803			.amux     = EM28XX_AMUX_LINE_IN,804		} },805	},806	[EM2820_BOARD_PINNACLE_USB_2] = {807		.name         = "Pinnacle PCTV USB 2",808		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,809		.has_ir_i2c   = 1,810		.tda9887_conf = TDA9887_PRESENT,811		.decoder      = EM28XX_SAA711X,812		.input        = { {813			.type     = EM28XX_VMUX_TELEVISION,814			.vmux     = SAA7115_COMPOSITE2,815			.amux     = EM28XX_AMUX_VIDEO,816		}, {817			.type     = EM28XX_VMUX_COMPOSITE,818			.vmux     = SAA7115_COMPOSITE0,819			.amux     = EM28XX_AMUX_LINE_IN,820		}, {821			.type     = EM28XX_VMUX_SVIDEO,822			.vmux     = SAA7115_SVIDEO3,823			.amux     = EM28XX_AMUX_LINE_IN,824		} },825	},826	[EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {827		.name         = "Hauppauge WinTV USB 2",828		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,829		.tda9887_conf = TDA9887_PRESENT |830				TDA9887_PORT1_ACTIVE |831				TDA9887_PORT2_ACTIVE,832		.decoder      = EM28XX_TVP5150,833		.has_msp34xx  = 1,834		.has_ir_i2c   = 1,835		.input        = { {836			.type     = EM28XX_VMUX_TELEVISION,837			.vmux     = TVP5150_COMPOSITE0,838			.amux     = MSP_INPUT_DEFAULT,839		}, {840			.type     = EM28XX_VMUX_SVIDEO,841			.vmux     = TVP5150_SVIDEO,842			.amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,843					MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),844		} },845	},846	[EM2820_BOARD_DLINK_USB_TV] = {847		.name         = "D-Link DUB-T210 TV Tuner",848		.valid        = EM28XX_BOARD_NOT_VALIDATED,849		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,850		.tda9887_conf = TDA9887_PRESENT,851		.decoder      = EM28XX_SAA711X,852		.input        = { {853			.type     = EM28XX_VMUX_TELEVISION,854			.vmux     = SAA7115_COMPOSITE2,855			.amux     = EM28XX_AMUX_LINE_IN,856		}, {857			.type     = EM28XX_VMUX_COMPOSITE,858			.vmux     = SAA7115_COMPOSITE0,859			.amux     = EM28XX_AMUX_LINE_IN,860		}, {861			.type     = EM28XX_VMUX_SVIDEO,862			.vmux     = SAA7115_SVIDEO3,863			.amux     = EM28XX_AMUX_LINE_IN,864		} },865	},866	[EM2820_BOARD_HERCULES_SMART_TV_USB2] = {867		.name         = "Hercules Smart TV USB 2.0",868		.valid        = EM28XX_BOARD_NOT_VALIDATED,869		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,870		.tda9887_conf = TDA9887_PRESENT,871		.decoder      = EM28XX_SAA711X,872		.input        = { {873			.type     = EM28XX_VMUX_TELEVISION,874			.vmux     = SAA7115_COMPOSITE2,875			.amux     = EM28XX_AMUX_LINE_IN,876		}, {877			.type     = EM28XX_VMUX_COMPOSITE,878			.vmux     = SAA7115_COMPOSITE0,879			.amux     = EM28XX_AMUX_LINE_IN,880		}, {881			.type     = EM28XX_VMUX_SVIDEO,882			.vmux     = SAA7115_SVIDEO3,883			.amux     = EM28XX_AMUX_LINE_IN,884		} },885	},886	[EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {887		.name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",888		.valid        = EM28XX_BOARD_NOT_VALIDATED,889		.tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,890		.tda9887_conf = TDA9887_PRESENT,891		.decoder      = EM28XX_SAA711X,892		.input        = { {893			.type     = EM28XX_VMUX_TELEVISION,894			.vmux     = SAA7115_COMPOSITE2,895			.amux     = EM28XX_AMUX_VIDEO,896		}, {897			.type     = EM28XX_VMUX_COMPOSITE,898			.vmux     = SAA7115_COMPOSITE0,899			.amux     = EM28XX_AMUX_LINE_IN,900		}, {901			.type     = EM28XX_VMUX_SVIDEO,902			.vmux     = SAA7115_SVIDEO3,903			.amux     = EM28XX_AMUX_LINE_IN,904		} },905	},906	[EM2820_BOARD_GADMEI_UTV310] = {907		.name         = "Gadmei UTV310",908		.valid        = EM28XX_BOARD_NOT_VALIDATED,909		.tuner_type   = TUNER_TNF_5335MF,910		.tda9887_conf = TDA9887_PRESENT,911		.decoder      = EM28XX_SAA711X,912		.input        = { {913			.type     = EM28XX_VMUX_TELEVISION,914			.vmux     = SAA7115_COMPOSITE1,915			.amux     = EM28XX_AMUX_LINE_IN,916		}, {917			.type     = EM28XX_VMUX_COMPOSITE,918			.vmux     = SAA7115_COMPOSITE0,919			.amux     = EM28XX_AMUX_LINE_IN,920		}, {921			.type     = EM28XX_VMUX_SVIDEO,922			.vmux     = SAA7115_SVIDEO3,923			.amux     = EM28XX_AMUX_LINE_IN,924		} },925	},926	[EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {927		.name         = "Leadtek Winfast USB II Deluxe",928		.valid        = EM28XX_BOARD_NOT_VALIDATED,929		.tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,930		.has_ir_i2c   = 1,931		.tvaudio_addr = 0x58,932		.tda9887_conf = TDA9887_PRESENT |933				TDA9887_PORT2_ACTIVE |934				TDA9887_QSS,935		.decoder      = EM28XX_SAA711X,936		.adecoder     = EM28XX_TVAUDIO,937		.input        = { {938			.type     = EM28XX_VMUX_TELEVISION,939			.vmux     = SAA7115_COMPOSITE4,940			.amux     = EM28XX_AMUX_AUX,941		}, {942			.type     = EM28XX_VMUX_COMPOSITE,943			.vmux     = SAA7115_COMPOSITE5,944			.amux     = EM28XX_AMUX_LINE_IN,945		}, {946			.type     = EM28XX_VMUX_SVIDEO,947			.vmux     = SAA7115_SVIDEO3,948			.amux     = EM28XX_AMUX_LINE_IN,949		} },950			.radio	  = {951			.type     = EM28XX_RADIO,952			.amux     = EM28XX_AMUX_AUX,953			}954	},955	[EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {956		.name         = "Videology 20K14XUSB USB2.0",957		.valid        = EM28XX_BOARD_NOT_VALIDATED,958		.tuner_type   = TUNER_ABSENT,959		.is_webcam    = 1,960		.input        = { {961			.type     = EM28XX_VMUX_COMPOSITE,962			.vmux     = 0,963			.amux     = EM28XX_AMUX_VIDEO,964		} },965	},966	[EM2820_BOARD_SILVERCREST_WEBCAM] = {967		.name         = "Silvercrest Webcam 1.3mpix",968		.tuner_type   = TUNER_ABSENT,969		.is_webcam    = 1,970		.input        = { {971			.type     = EM28XX_VMUX_COMPOSITE,972			.vmux     = 0,973			.amux     = EM28XX_AMUX_VIDEO,974			.gpio     = silvercrest_reg_seq,975		} },976	},977	[EM2821_BOARD_SUPERCOMP_USB_2] = {978		.name         = "Supercomp USB 2.0 TV",979		.valid        = EM28XX_BOARD_NOT_VALIDATED,980		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,981		.tda9887_conf = TDA9887_PRESENT |982				TDA9887_PORT1_ACTIVE |983				TDA9887_PORT2_ACTIVE,984		.decoder      = EM28XX_SAA711X,985		.input        = { {986			.type     = EM28XX_VMUX_TELEVISION,987			.vmux     = SAA7115_COMPOSITE2,988			.amux     = EM28XX_AMUX_LINE_IN,989		}, {990			.type     = EM28XX_VMUX_COMPOSITE,991			.vmux     = SAA7115_COMPOSITE0,992			.amux     = EM28XX_AMUX_VIDEO,993		}, {994			.type     = EM28XX_VMUX_SVIDEO,995			.vmux     = SAA7115_SVIDEO3,996			.amux     = EM28XX_AMUX_LINE_IN,997		} },998	},999	[EM2821_BOARD_USBGEAR_VD204] = {1000		.name         = "Usbgear VD204v9",1001		.valid        = EM28XX_BOARD_NOT_VALIDATED,1002		.tuner_type   = TUNER_ABSENT,	/* Capture only device */1003		.decoder      = EM28XX_SAA711X,1004		.input        = { {1005			.type  = EM28XX_VMUX_COMPOSITE,1006			.vmux  = SAA7115_COMPOSITE0,1007			.amux  = EM28XX_AMUX_LINE_IN,1008		}, {1009			.type  = EM28XX_VMUX_SVIDEO,1010			.vmux  = SAA7115_SVIDEO3,1011			.amux  = EM28XX_AMUX_LINE_IN,1012		} },1013	},1014	[EM2860_BOARD_NETGMBH_CAM] = {1015		/* Beijing Huaqi Information Digital Technology Co., Ltd */1016		.name         = "NetGMBH Cam",1017		.valid        = EM28XX_BOARD_NOT_VALIDATED,1018		.tuner_type   = TUNER_ABSENT,1019		.is_webcam    = 1,1020		.input        = { {1021			.type     = EM28XX_VMUX_COMPOSITE,1022			.vmux     = 0,1023			.amux     = EM28XX_AMUX_VIDEO,1024		} },1025	},1026	[EM2860_BOARD_TYPHOON_DVD_MAKER] = {1027		.name         = "Typhoon DVD Maker",1028		.decoder      = EM28XX_SAA711X,1029		.tuner_type   = TUNER_ABSENT,	/* Capture only device */1030		.input        = { {1031			.type  = EM28XX_VMUX_COMPOSITE,1032			.vmux  = SAA7115_COMPOSITE0,1033			.amux  = EM28XX_AMUX_LINE_IN,1034		}, {1035			.type  = EM28XX_VMUX_SVIDEO,1036			.vmux  = SAA7115_SVIDEO3,1037			.amux  = EM28XX_AMUX_LINE_IN,1038		} },1039	},1040	[EM2860_BOARD_GADMEI_UTV330] = {1041		.name         = "Gadmei UTV330",1042		.valid        = EM28XX_BOARD_NOT_VALIDATED,1043		.tuner_type   = TUNER_TNF_5335MF,1044		.tda9887_conf = TDA9887_PRESENT,1045		.decoder      = EM28XX_SAA711X,1046		.input        = { {1047			.type     = EM28XX_VMUX_TELEVISION,1048			.vmux     = SAA7115_COMPOSITE2,1049			.amux     = EM28XX_AMUX_VIDEO,1050		}, {1051			.type     = EM28XX_VMUX_COMPOSITE,1052			.vmux     = SAA7115_COMPOSITE0,1053			.amux     = EM28XX_AMUX_LINE_IN,1054		}, {1055			.type     = EM28XX_VMUX_SVIDEO,1056			.vmux     = SAA7115_SVIDEO3,1057			.amux     = EM28XX_AMUX_LINE_IN,1058		} },1059	},1060	[EM2861_BOARD_GADMEI_UTV330PLUS] = {1061		.name         = "Gadmei UTV330+",1062		.tuner_type   = TUNER_TNF_5335MF,1063		.tda9887_conf = TDA9887_PRESENT,1064		.ir_codes     = RC_MAP_GADMEI_RM008Z,1065		.decoder      = EM28XX_SAA711X,1066		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,1067		.input        = { {1068			.type     = EM28XX_VMUX_TELEVISION,1069			.vmux     = SAA7115_COMPOSITE2,1070			.amux     = EM28XX_AMUX_VIDEO,1071		}, {1072			.type     = EM28XX_VMUX_COMPOSITE,1073			.vmux     = SAA7115_COMPOSITE0,1074			.amux     = EM28XX_AMUX_LINE_IN,1075		}, {1076			.type     = EM28XX_VMUX_SVIDEO,1077			.vmux     = SAA7115_SVIDEO3,1078			.amux     = EM28XX_AMUX_LINE_IN,1079		} },1080	},1081	[EM2860_BOARD_TERRATEC_HYBRID_XS] = {1082		.name         = "Terratec Cinergy A Hybrid XS",1083		.valid        = EM28XX_BOARD_NOT_VALIDATED,1084		.tuner_type   = TUNER_XC2028,1085		.tuner_gpio   = default_tuner_gpio,1086		.decoder      = EM28XX_TVP5150,1087 1088		.input        = { {1089			.type     = EM28XX_VMUX_TELEVISION,1090			.vmux     = TVP5150_COMPOSITE0,1091			.amux     = EM28XX_AMUX_VIDEO,1092			.gpio     = hauppauge_wintv_hvr_900_analog,1093		}, {1094			.type     = EM28XX_VMUX_COMPOSITE,1095			.vmux     = TVP5150_COMPOSITE1,1096			.amux     = EM28XX_AMUX_LINE_IN,1097			.gpio     = hauppauge_wintv_hvr_900_analog,1098		}, {1099			.type     = EM28XX_VMUX_SVIDEO,1100			.vmux     = TVP5150_SVIDEO,1101			.amux     = EM28XX_AMUX_LINE_IN,1102			.gpio     = hauppauge_wintv_hvr_900_analog,1103		} },1104	},1105	[EM2861_BOARD_KWORLD_PVRTV_300U] = {1106		.name	      = "KWorld PVRTV 300U",1107		.valid        = EM28XX_BOARD_NOT_VALIDATED,1108		.tuner_type   = TUNER_XC2028,1109		.tuner_gpio   = default_tuner_gpio,1110		.decoder      = EM28XX_TVP5150,1111		.input        = { {1112			.type     = EM28XX_VMUX_TELEVISION,1113			.vmux     = TVP5150_COMPOSITE0,1114			.amux     = EM28XX_AMUX_VIDEO,1115		}, {1116			.type     = EM28XX_VMUX_COMPOSITE,1117			.vmux     = TVP5150_COMPOSITE1,1118			.amux     = EM28XX_AMUX_LINE_IN,1119		}, {1120			.type     = EM28XX_VMUX_SVIDEO,1121			.vmux     = TVP5150_SVIDEO,1122			.amux     = EM28XX_AMUX_LINE_IN,1123		} },1124	},1125	[EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {1126		.name          = "Yakumo MovieMixer",1127		.tuner_type    = TUNER_ABSENT,	/* Capture only device */1128		.decoder       = EM28XX_TVP5150,1129		.input         = { {1130			.type     = EM28XX_VMUX_TELEVISION,1131			.vmux     = TVP5150_COMPOSITE0,1132			.amux     = EM28XX_AMUX_VIDEO,1133		}, {1134			.type     = EM28XX_VMUX_COMPOSITE,1135			.vmux     = TVP5150_COMPOSITE1,1136			.amux     = EM28XX_AMUX_LINE_IN,1137		}, {1138			.type     = EM28XX_VMUX_SVIDEO,1139			.vmux     = TVP5150_SVIDEO,1140			.amux     = EM28XX_AMUX_LINE_IN,1141		} },1142	},1143	[EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = {1144		.name          = "EM2860/TVP5150 Reference Design",1145		.tuner_type    = TUNER_ABSENT,	/* Capture only device */1146		.decoder       = EM28XX_TVP5150,1147		.input         = { {1148			.type     = EM28XX_VMUX_COMPOSITE,1149			.vmux     = TVP5150_COMPOSITE1,1150			.amux     = EM28XX_AMUX_LINE_IN,1151		}, {1152			.type     = EM28XX_VMUX_SVIDEO,1153			.vmux     = TVP5150_SVIDEO,1154			.amux     = EM28XX_AMUX_LINE_IN,1155		} },1156	},1157	[EM2861_BOARD_PLEXTOR_PX_TV100U] = {1158		.name         = "Plextor ConvertX PX-TV100U",1159		.tuner_type   = TUNER_TNF_5335MF,1160		.xclk         = EM28XX_XCLK_I2S_MSB_TIMING |1161				EM28XX_XCLK_FREQUENCY_12MHZ,1162		.tda9887_conf = TDA9887_PRESENT,1163		.decoder      = EM28XX_TVP5150,1164		.has_msp34xx  = 1,1165		.input        = { {1166			.type     = EM28XX_VMUX_TELEVISION,1167			.vmux     = TVP5150_COMPOSITE0,1168			.amux     = EM28XX_AMUX_LINE_IN,1169			.gpio     = pinnacle_hybrid_pro_analog,1170		}, {1171			.type     = EM28XX_VMUX_COMPOSITE,1172			.vmux     = TVP5150_COMPOSITE1,1173			.amux     = EM28XX_AMUX_LINE_IN,1174			.gpio     = pinnacle_hybrid_pro_analog,1175		}, {1176			.type     = EM28XX_VMUX_SVIDEO,1177			.vmux     = TVP5150_SVIDEO,1178			.amux     = EM28XX_AMUX_LINE_IN,1179			.gpio     = pinnacle_hybrid_pro_analog,1180		} },1181	},1182 1183	/* Those boards with em2870 are DVB Only*/1184 1185	[EM2870_BOARD_TERRATEC_XS] = {1186		.name         = "Terratec Cinergy T XS",1187		.valid        = EM28XX_BOARD_NOT_VALIDATED,1188		.tuner_type   = TUNER_XC2028,1189		.tuner_gpio   = default_tuner_gpio,1190	},1191	[EM2870_BOARD_TERRATEC_XS_MT2060] = {1192		.name         = "Terratec Cinergy T XS (MT2060)",1193		.xclk         = EM28XX_XCLK_IR_RC5_MODE |1194				EM28XX_XCLK_FREQUENCY_12MHZ,1195		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,1196		.tuner_type   = TUNER_ABSENT, /* MT2060 */1197		.has_dvb      = 1,1198		.tuner_gpio   = default_tuner_gpio,1199	},1200	[EM2870_BOARD_KWORLD_350U] = {1201		.name         = "Kworld 350 U DVB-T",1202		.valid        = EM28XX_BOARD_NOT_VALIDATED,1203		.tuner_type   = TUNER_XC2028,1204		.tuner_gpio   = default_tuner_gpio,1205	},1206	[EM2870_BOARD_KWORLD_355U] = {1207		.name         = "Kworld 355 U DVB-T",1208		.valid        = EM28XX_BOARD_NOT_VALIDATED,1209		.tuner_type   = TUNER_ABSENT,1210		.tuner_gpio   = default_tuner_gpio,1211		.has_dvb      = 1,1212		.dvb_gpio     = default_digital,1213	},1214	[EM2870_BOARD_PINNACLE_PCTV_DVB] = {1215		.name         = "Pinnacle PCTV DVB-T",1216		.valid        = EM28XX_BOARD_NOT_VALIDATED,1217		.tuner_type   = TUNER_ABSENT, /* MT2060 */1218		/* djh - I have serious doubts this is right... */1219		.xclk         = EM28XX_XCLK_IR_RC5_MODE |1220				EM28XX_XCLK_FREQUENCY_10MHZ,1221	},1222	[EM2870_BOARD_COMPRO_VIDEOMATE] = {1223		.name         = "Compro, VideoMate U3",1224		.valid        = EM28XX_BOARD_NOT_VALIDATED,1225		.tuner_type   = TUNER_ABSENT, /* MT2060 */1226	},1227 1228	[EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {1229		.name         = "Terratec Hybrid XS Secam",1230		.has_msp34xx  = 1,1231		.tuner_type   = TUNER_XC2028,1232		.tuner_gpio   = default_tuner_gpio,1233		.decoder      = EM28XX_TVP5150,1234		.has_dvb      = 1,1235		.dvb_gpio     = terratec_cinergy_USB_XS_FR_digital,1236		.input        = { {1237			.type     = EM28XX_VMUX_TELEVISION,1238			.vmux     = TVP5150_COMPOSITE0,1239			.amux     = EM28XX_AMUX_VIDEO,1240			.gpio     = terratec_cinergy_USB_XS_FR_analog,1241		}, {1242			.type     = EM28XX_VMUX_COMPOSITE,1243			.vmux     = TVP5150_COMPOSITE1,1244			.amux     = EM28XX_AMUX_LINE_IN,1245			.gpio     = terratec_cinergy_USB_XS_FR_analog,1246		}, {1247			.type     = EM28XX_VMUX_SVIDEO,1248			.vmux     = TVP5150_SVIDEO,1249			.amux     = EM28XX_AMUX_LINE_IN,1250			.gpio     = terratec_cinergy_USB_XS_FR_analog,1251		} },1252	},1253	[EM2884_BOARD_TERRATEC_H5] = {1254		.name         = "Terratec Cinergy H5",1255		.has_dvb      = 1,1256#if 01257		.tuner_type   = TUNER_PHILIPS_TDA8290,1258		.tuner_addr   = 0x41,1259		.dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */1260		.tuner_gpio   = terratec_h5_gpio,1261#else1262		.tuner_type   = TUNER_ABSENT,1263#endif1264		.def_i2c_bus  = 1,1265		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |1266				EM28XX_I2C_FREQ_400_KHZ,1267	},1268	[EM2884_BOARD_TERRATEC_H6] = {1269		.name         = "Terratec Cinergy H6 rev. 2",1270		.has_dvb      = 1,1271		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,1272#if 01273		.tuner_type   = TUNER_PHILIPS_TDA8290,1274		.tuner_addr   = 0x41,1275		.dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */1276		.tuner_gpio   = terratec_h5_gpio,1277#else1278		.tuner_type   = TUNER_ABSENT,1279#endif1280		.def_i2c_bus  = 1,1281		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |1282				EM28XX_I2C_FREQ_400_KHZ,1283	},1284	[EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {1285		.name         = "Hauppauge WinTV HVR 930C",1286		.has_dvb      = 1,1287#if 0 /* FIXME: Add analog support */1288		.tuner_type   = TUNER_XC5000,1289		.tuner_addr   = 0x41,1290		.dvb_gpio     = hauppauge_930c_digital,1291		.tuner_gpio   = hauppauge_930c_gpio,1292#else1293		.tuner_type   = TUNER_ABSENT,1294#endif1295		.ir_codes     = RC_MAP_HAUPPAUGE,1296		.def_i2c_bus  = 1,1297		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |1298				EM28XX_I2C_FREQ_400_KHZ,1299	},1300	[EM2884_BOARD_C3TECH_DIGITAL_DUO] = {1301		.name         = "C3 Tech Digital Duo HDTV/SDTV USB",1302		.has_dvb      = 1,1303		/* FIXME: Add analog support - need a saa7136 driver */1304		.tuner_type = TUNER_ABSENT,	/* Digital-only TDA18271HD */1305		.ir_codes     = RC_MAP_EMPTY,1306		.def_i2c_bus  = 1,1307		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,1308		.dvb_gpio     = c3tech_digital_duo_digital,1309	},1310	[EM2884_BOARD_CINERGY_HTC_STICK] = {1311		.name         = "Terratec Cinergy HTC Stick",1312		.has_dvb      = 1,1313		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,1314		.tuner_type   = TUNER_ABSENT,1315		.def_i2c_bus  = 1,1316		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |1317				EM28XX_I2C_FREQ_400_KHZ,1318	},1319	[EM2884_BOARD_ELGATO_EYETV_HYBRID_2008] = {1320		.name         = "Elgato EyeTV Hybrid 2008 INT",1321		.has_dvb      = 1,1322		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,1323		.tuner_type   = TUNER_ABSENT,1324		.def_i2c_bus  = 1,1325		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |1326				EM28XX_I2C_FREQ_400_KHZ,1327	},1328	[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {1329		.name         = "Hauppauge WinTV HVR 900",1330		.tda9887_conf = TDA9887_PRESENT,1331		.tuner_type   = TUNER_XC2028,1332		.tuner_gpio   = default_tuner_gpio,1333		.mts_firmware = 1,1334		.has_dvb      = 1,1335		.dvb_gpio     = hauppauge_wintv_hvr_900_digital,1336		.ir_codes     = RC_MAP_HAUPPAUGE,1337		.decoder      = EM28XX_TVP5150,1338		.input        = { {1339			.type     = EM28XX_VMUX_TELEVISION,1340			.vmux     = TVP5150_COMPOSITE0,1341			.amux     = EM28XX_AMUX_VIDEO,1342			.gpio     = hauppauge_wintv_hvr_900_analog,1343		}, {1344			.type     = EM28XX_VMUX_COMPOSITE,1345			.vmux     = TVP5150_COMPOSITE1,1346			.amux     = EM28XX_AMUX_LINE_IN,1347			.gpio     = hauppauge_wintv_hvr_900_analog,1348		}, {1349			.type     = EM28XX_VMUX_SVIDEO,1350			.vmux     = TVP5150_SVIDEO,1351			.amux     = EM28XX_AMUX_LINE_IN,1352			.gpio     = hauppauge_wintv_hvr_900_analog,1353		} },1354	},1355	[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {1356		.name         = "Hauppauge WinTV HVR 900 (R2)",1357		.tda9887_conf = TDA9887_PRESENT,1358		.tuner_type   = TUNER_XC2028,1359		.tuner_gpio   = default_tuner_gpio,1360		.mts_firmware = 1,1361		.has_dvb      = 1,1362		.dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,1363		.ir_codes     = RC_MAP_HAUPPAUGE,1364		.decoder      = EM28XX_TVP5150,1365		.input        = { {1366			.type     = EM28XX_VMUX_TELEVISION,1367			.vmux     = TVP5150_COMPOSITE0,1368			.amux     = EM28XX_AMUX_VIDEO,1369			.gpio     = hauppauge_wintv_hvr_900_analog,1370		}, {1371			.type     = EM28XX_VMUX_COMPOSITE,1372			.vmux     = TVP5150_COMPOSITE1,1373			.amux     = EM28XX_AMUX_LINE_IN,1374			.gpio     = hauppauge_wintv_hvr_900_analog,1375		}, {1376			.type     = EM28XX_VMUX_SVIDEO,1377			.vmux     = TVP5150_SVIDEO,1378			.amux     = EM28XX_AMUX_LINE_IN,1379			.gpio     = hauppauge_wintv_hvr_900_analog,1380		} },1381	},1382	[EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {1383		.name           = "Hauppauge WinTV HVR 850",1384		.tuner_type     = TUNER_XC2028,1385		.tuner_gpio     = default_tuner_gpio,1386		.mts_firmware   = 1,1387		.has_dvb        = 1,1388		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,1389		.ir_codes       = RC_MAP_HAUPPAUGE,1390		.decoder        = EM28XX_TVP5150,1391		.input          = { {1392			.type     = EM28XX_VMUX_TELEVISION,1393			.vmux     = TVP5150_COMPOSITE0,1394			.amux     = EM28XX_AMUX_VIDEO,1395			.gpio     = hauppauge_wintv_hvr_900_analog,1396		}, {1397			.type     = EM28XX_VMUX_COMPOSITE,1398			.vmux     = TVP5150_COMPOSITE1,1399			.amux     = EM28XX_AMUX_LINE_IN,1400			.gpio     = hauppauge_wintv_hvr_900_analog,1401		}, {1402			.type     = EM28XX_VMUX_SVIDEO,1403			.vmux     = TVP5150_SVIDEO,1404			.amux     = EM28XX_AMUX_LINE_IN,1405			.gpio     = hauppauge_wintv_hvr_900_analog,1406		} },1407	},1408	[EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {1409		.name           = "Hauppauge WinTV HVR 950",1410		.tuner_type     = TUNER_XC2028,1411		.tuner_gpio     = default_tuner_gpio,1412		.mts_firmware   = 1,1413		.has_dvb        = 1,1414		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,1415		.ir_codes       = RC_MAP_HAUPPAUGE,1416		.decoder        = EM28XX_TVP5150,1417		.input          = { {1418			.type     = EM28XX_VMUX_TELEVISION,1419			.vmux     = TVP5150_COMPOSITE0,1420			.amux     = EM28XX_AMUX_VIDEO,1421			.gpio     = hauppauge_wintv_hvr_900_analog,1422		}, {1423			.type     = EM28XX_VMUX_COMPOSITE,1424			.vmux     = TVP5150_COMPOSITE1,1425			.amux     = EM28XX_AMUX_LINE_IN,1426			.gpio     = hauppauge_wintv_hvr_900_analog,1427		}, {1428			.type     = EM28XX_VMUX_SVIDEO,1429			.vmux     = TVP5150_SVIDEO,1430			.amux     = EM28XX_AMUX_LINE_IN,1431			.gpio     = hauppauge_wintv_hvr_900_analog,1432		} },1433	},1434	[EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {1435		.name           = "Pinnacle PCTV HD Pro Stick",1436		.tuner_type     = TUNER_XC2028,1437		.tuner_gpio   = default_tuner_gpio,1438		.mts_firmware   = 1,1439		.has_dvb        = 1,1440		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,1441		.ir_codes       = RC_MAP_PINNACLE_PCTV_HD,1442		.decoder        = EM28XX_TVP5150,1443		.input          = { {1444			.type     = EM28XX_VMUX_TELEVISION,1445			.vmux     = TVP5150_COMPOSITE0,1446			.amux     = EM28XX_AMUX_VIDEO,1447			.gpio     = hauppauge_wintv_hvr_900_analog,1448		}, {1449			.type     = EM28XX_VMUX_COMPOSITE,1450			.vmux     = TVP5150_COMPOSITE1,1451			.amux     = EM28XX_AMUX_LINE_IN,1452			.gpio     = hauppauge_wintv_hvr_900_analog,1453		}, {1454			.type     = EM28XX_VMUX_SVIDEO,1455			.vmux     = TVP5150_SVIDEO,1456			.amux     = EM28XX_AMUX_LINE_IN,1457			.gpio     = hauppauge_wintv_hvr_900_analog,1458		} },1459	},1460	[EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {1461		.name           = "AMD ATI TV Wonder HD 600",1462		.tuner_type     = TUNER_XC2028,1463		.tuner_gpio     = default_tuner_gpio,1464		.mts_firmware   = 1,1465		.has_dvb        = 1,1466		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,1467		.ir_codes       = RC_MAP_ATI_TV_WONDER_HD_600,1468		.decoder        = EM28XX_TVP5150,1469		.input          = { {1470			.type     = EM28XX_VMUX_TELEVISION,1471			.vmux     = TVP5150_COMPOSITE0,1472			.amux     = EM28XX_AMUX_VIDEO,1473			.gpio     = hauppauge_wintv_hvr_900_analog,1474		}, {1475			.type     = EM28XX_VMUX_COMPOSITE,1476			.vmux     = TVP5150_COMPOSITE1,1477			.amux     = EM28XX_AMUX_LINE_IN,1478			.gpio     = hauppauge_wintv_hvr_900_analog,1479		}, {1480			.type     = EM28XX_VMUX_SVIDEO,1481			.vmux     = TVP5150_SVIDEO,1482			.amux     = EM28XX_AMUX_LINE_IN,1483			.gpio     = hauppauge_wintv_hvr_900_analog,1484		} },1485	},1486	[EM2880_BOARD_TERRATEC_HYBRID_XS] = {1487		.name           = "Terratec Hybrid XS",1488		.tuner_type     = TUNER_XC2028,1489		.tuner_gpio     = default_tuner_gpio,1490		.decoder        = EM28XX_TVP5150,1491		.has_dvb        = 1,1492		.dvb_gpio       = default_digital,1493		.ir_codes       = RC_MAP_TERRATEC_CINERGY_XS,1494		.xclk           = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */1495		.input          = { {1496			.type     = EM28XX_VMUX_TELEVISION,1497			.vmux     = TVP5150_COMPOSITE0,1498			.amux     = EM28XX_AMUX_VIDEO,1499			.gpio     = default_analog,1500		}, {1501			.type     = EM28XX_VMUX_COMPOSITE,1502			.vmux     = TVP5150_COMPOSITE1,1503			.amux     = EM28XX_AMUX_LINE_IN,1504			.gpio     = default_analog,1505		}, {1506			.type     = EM28XX_VMUX_SVIDEO,1507			.vmux     = TVP5150_SVIDEO,1508			.amux     = EM28XX_AMUX_LINE_IN,1509			.gpio     = default_analog,1510		} },1511	},1512	/*1513	 * maybe there's a reason behind it why Terratec sells the Hybrid XS1514	 * as Prodigy XS with a different PID, let's keep it separated for now1515	 * maybe we'll need it later on1516	 */1517	[EM2880_BOARD_TERRATEC_PRODIGY_XS] = {1518		.name         = "Terratec Prodigy XS",1519		.tuner_type   = TUNER_XC2028,1520		.tuner_gpio   = default_tuner_gpio,1521		.decoder      = EM28XX_TVP5150,1522		.input        = { {1523			.type     = EM28XX_VMUX_TELEVISION,1524			.vmux     = TVP5150_COMPOSITE0,1525			.amux     = EM28XX_AMUX_VIDEO,1526			.gpio     = hauppauge_wintv_hvr_900_analog,1527		}, {1528			.type     = EM28XX_VMUX_COMPOSITE,1529			.vmux     = TVP5150_COMPOSITE1,1530			.amux     = EM28XX_AMUX_LINE_IN,1531			.gpio     = hauppauge_wintv_hvr_900_analog,1532		}, {1533			.type     = EM28XX_VMUX_SVIDEO,1534			.vmux     = TVP5150_SVIDEO,1535			.amux     = EM28XX_AMUX_LINE_IN,1536			.gpio     = hauppauge_wintv_hvr_900_analog,1537		} },1538	},1539	[EM2820_BOARD_MSI_VOX_USB_2] = {1540		.name		   = "MSI VOX USB 2.0",1541		.tuner_type	   = TUNER_LG_PAL_NEW_TAPC,1542		.tda9887_conf	   = TDA9887_PRESENT      |1543				     TDA9887_PORT1_ACTIVE |1544				     TDA9887_PORT2_ACTIVE,1545		.max_range_640_480 = 1,1546		.decoder           = EM28XX_SAA711X,1547		.input             = { {1548			.type      = EM28XX_VMUX_TELEVISION,1549			.vmux      = SAA7115_COMPOSITE4,1550			.amux      = EM28XX_AMUX_VIDEO,1551		}, {1552			.type      = EM28XX_VMUX_COMPOSITE,1553			.vmux      = SAA7115_COMPOSITE0,1554			.amux      = EM28XX_AMUX_LINE_IN,1555		}, {1556			.type      = EM28XX_VMUX_SVIDEO,1557			.vmux      = SAA7115_SVIDEO3,1558			.amux      = EM28XX_AMUX_LINE_IN,1559		} },1560	},1561	[EM2800_BOARD_TERRATEC_CINERGY_200] = {1562		.name         = "Terratec Cinergy 200 USB",1563		.is_em2800    = 1,1564		.has_ir_i2c   = 1,1565		.tuner_type   = TUNER_LG_TALN,1566		.tda9887_conf = TDA9887_PRESENT,1567		.decoder      = EM28XX_SAA711X,1568		.input        = { {1569			.type     = EM28XX_VMUX_TELEVISION,1570			.vmux     = SAA7115_COMPOSITE2,1571			.amux     = EM28XX_AMUX_VIDEO,1572		}, {1573			.type     = EM28XX_VMUX_COMPOSITE,1574			.vmux     = SAA7115_COMPOSITE0,1575			.amux     = EM28XX_AMUX_LINE_IN,1576		}, {1577			.type     = EM28XX_VMUX_SVIDEO,1578			.vmux     = SAA7115_SVIDEO3,1579			.amux     = EM28XX_AMUX_LINE_IN,1580		} },1581	},1582	[EM2800_BOARD_GRABBEEX_USB2800] = {1583		.name       = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",1584		.is_em2800  = 1,1585		.decoder    = EM28XX_SAA711X,1586		.tuner_type = TUNER_ABSENT, /* capture only board */1587		.input      = { {1588			.type     = EM28XX_VMUX_COMPOSITE,1589			.vmux     = SAA7115_COMPOSITE0,1590			.amux     = EM28XX_AMUX_LINE_IN,1591		}, {1592			.type     = EM28XX_VMUX_SVIDEO,1593			.vmux     = SAA7115_SVIDEO3,1594			.amux     = EM28XX_AMUX_LINE_IN,1595		} },1596	},1597	[EM2800_BOARD_VC211A] = {1598		.name         = "Actionmaster/LinXcel/Digitus VC211A",1599		.is_em2800    = 1,1600		.tuner_type   = TUNER_ABSENT,	/* Capture-only board */1601		.decoder      = EM28XX_SAA711X,1602		.input        = { {1603			.type     = EM28XX_VMUX_COMPOSITE,1604			.vmux     = SAA7115_COMPOSITE0,1605			.amux     = EM28XX_AMUX_LINE_IN,1606			.gpio     = vc211a_enable,1607		}, {1608			.type     = EM28XX_VMUX_SVIDEO,1609			.vmux     = SAA7115_SVIDEO3,1610			.amux     = EM28XX_AMUX_LINE_IN,1611			.gpio     = vc211a_enable,1612		} },1613	},1614	[EM2800_BOARD_LEADTEK_WINFAST_USBII] = {1615		.name         = "Leadtek Winfast USB II",1616		.is_em2800    = 1,1617		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,1618		.tda9887_conf = TDA9887_PRESENT,1619		.decoder      = EM28XX_SAA711X,1620		.input        = { {1621			.type     = EM28XX_VMUX_TELEVISION,1622			.vmux     = SAA7115_COMPOSITE2,1623			.amux     = EM28XX_AMUX_VIDEO,1624		}, {1625			.type     = EM28XX_VMUX_COMPOSITE,1626			.vmux     = SAA7115_COMPOSITE0,1627			.amux     = EM28XX_AMUX_LINE_IN,1628		}, {1629			.type     = EM28XX_VMUX_SVIDEO,1630			.vmux     = SAA7115_SVIDEO3,1631			.amux     = EM28XX_AMUX_LINE_IN,1632		} },1633	},1634	[EM2800_BOARD_KWORLD_USB2800] = {1635		.name         = "Kworld USB2800",1636		.is_em2800    = 1,1637		.tuner_type   = TUNER_PHILIPS_FCV1236D,1638		.tda9887_conf = TDA9887_PRESENT,1639		.decoder      = EM28XX_SAA711X,1640		.input        = { {1641			.type     = EM28XX_VMUX_TELEVISION,1642			.vmux     = SAA7115_COMPOSITE2,1643			.amux     = EM28XX_AMUX_VIDEO,1644		}, {1645			.type     = EM28XX_VMUX_COMPOSITE,1646			.vmux     = SAA7115_COMPOSITE0,1647			.amux     = EM28XX_AMUX_LINE_IN,1648		}, {1649			.type     = EM28XX_VMUX_SVIDEO,1650			.vmux     = SAA7115_SVIDEO3,1651			.amux     = EM28XX_AMUX_LINE_IN,1652		} },1653	},1654	[EM2820_BOARD_PINNACLE_DVC_90] = {1655		.name	      = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker / Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",1656		.tuner_type   = TUNER_ABSENT, /* capture only board */1657		.decoder      = EM28XX_SAA711X,1658		.input        = { {1659			.type     = EM28XX_VMUX_COMPOSITE,1660			.vmux     = SAA7115_COMPOSITE0,1661			.amux     = EM28XX_AMUX_LINE_IN,1662		}, {1663			.type     = EM28XX_VMUX_SVIDEO,1664			.vmux     = SAA7115_SVIDEO3,1665			.amux     = EM28XX_AMUX_LINE_IN,1666		} },1667	},1668	[EM2800_BOARD_VGEAR_POCKETTV] = {1669		.name         = "V-Gear PocketTV",1670		.is_em2800    = 1,1671		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,1672		.tda9887_conf = TDA9887_PRESENT,1673		.decoder      = EM28XX_SAA711X,1674		.input        = { {1675			.type     = EM28XX_VMUX_TELEVISION,1676			.vmux     = SAA7115_COMPOSITE2,1677			.amux     = EM28XX_AMUX_VIDEO,1678		}, {1679			.type     = EM28XX_VMUX_COMPOSITE,1680			.vmux     = SAA7115_COMPOSITE0,1681			.amux     = EM28XX_AMUX_LINE_IN,1682		}, {1683			.type     = EM28XX_VMUX_SVIDEO,1684			.vmux     = SAA7115_SVIDEO3,1685			.amux     = EM28XX_AMUX_LINE_IN,1686		} },1687	},1688	[EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {1689		.name         = "Pixelview PlayTV Box 4 USB 2.0",1690		.tda9887_conf = TDA9887_PRESENT,1691		.tuner_type   = TUNER_YMEC_TVF_5533MF,1692		.decoder      = EM28XX_SAA711X,1693		.input        = { {1694			.type     = EM28XX_VMUX_TELEVISION,1695			.vmux     = SAA7115_COMPOSITE2,1696			.amux     = EM28XX_AMUX_VIDEO,1697			.aout     = EM28XX_AOUT_MONO |	/* I2S */1698				    EM28XX_AOUT_MASTER,	/* Line out pin */1699		}, {1700			.type     = EM28XX_VMUX_COMPOSITE,1701			.vmux     = SAA7115_COMPOSITE0,1702			.amux     = EM28XX_AMUX_LINE_IN,1703		}, {1704			.type     = EM28XX_VMUX_SVIDEO,1705			.vmux     = SAA7115_SVIDEO3,1706			.amux     = EM28XX_AMUX_LINE_IN,1707		} },1708	},1709	[EM2820_BOARD_PROLINK_PLAYTV_USB2] = {1710		.name         = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",1711		.buttons = std_snapshot_button,1712		.tda9887_conf = TDA9887_PRESENT,1713		.tuner_type   = TUNER_YMEC_TVF_5533MF,1714		.tuner_addr   = 0x60,1715		.decoder      = EM28XX_SAA711X,1716		.input        = { {1717			.type     = EM28XX_VMUX_TELEVISION,1718			.vmux     = SAA7115_COMPOSITE2,1719			.amux     = EM28XX_AMUX_VIDEO,1720			.aout     = EM28XX_AOUT_MONO |	/* I2S */1721				    EM28XX_AOUT_MASTER,	/* Line out pin */1722		}, {1723			.type     = EM28XX_VMUX_COMPOSITE,1724			.vmux     = SAA7115_COMPOSITE0,1725			.amux     = EM28XX_AMUX_LINE_IN,1726		}, {1727			.type     = EM28XX_VMUX_SVIDEO,1728			.vmux     = SAA7115_SVIDEO3,1729			.amux     = EM28XX_AMUX_LINE_IN,1730		} },1731	},1732	[EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {1733		.name                = "EM2860/SAA711X Reference Design",1734		.buttons = std_snapshot_button,1735		.tuner_type          = TUNER_ABSENT,1736		.decoder             = EM28XX_SAA711X,1737		.input               = { {1738			.type     = EM28XX_VMUX_SVIDEO,1739			.vmux     = SAA7115_SVIDEO3,1740		}, {1741			.type     = EM28XX_VMUX_COMPOSITE,1742			.vmux     = SAA7115_COMPOSITE0,1743		} },1744	},1745 1746	[EM2874_BOARD_LEADERSHIP_ISDBT] = {1747		.def_i2c_bus	= 1,1748		.i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |1749				  EM28XX_I2C_FREQ_100_KHZ,1750		.xclk		= EM28XX_XCLK_FREQUENCY_10MHZ,1751		.name		= "EM2874 Leadership ISDBT",1752		.tuner_type	= TUNER_ABSENT,1753		.tuner_gpio     = leadership_reset,1754		.dvb_gpio       = leadership_digital,1755		.has_dvb	= 1,1756	},1757 1758	[EM2880_BOARD_MSI_DIGIVOX_AD] = {1759		.name         = "MSI DigiVox A/D",1760		.valid        = EM28XX_BOARD_NOT_VALIDATED,1761		.tuner_type   = TUNER_XC2028,1762		.tuner_gpio   = default_tuner_gpio,1763		.decoder      = EM28XX_TVP5150,1764		.input        = { {1765			.type     = EM28XX_VMUX_TELEVISION,1766			.vmux     = TVP5150_COMPOSITE0,1767			.amux     = EM28XX_AMUX_VIDEO,1768			.gpio     = em2880_msi_digivox_ad_analog,1769		}, {1770			.type     = EM28XX_VMUX_COMPOSITE,1771			.vmux     = TVP5150_COMPOSITE1,1772			.amux     = EM28XX_AMUX_LINE_IN,1773			.gpio     = em2880_msi_digivox_ad_analog,1774		}, {1775			.type     = EM28XX_VMUX_SVIDEO,1776			.vmux     = TVP5150_SVIDEO,1777			.amux     = EM28XX_AMUX_LINE_IN,1778			.gpio     = em2880_msi_digivox_ad_analog,1779		} },1780	},1781	[EM2880_BOARD_MSI_DIGIVOX_AD_II] = {1782		.name         = "MSI DigiVox A/D II",1783		.valid        = EM28XX_BOARD_NOT_VALIDATED,1784		.tuner_type   = TUNER_XC2028,1785		.tuner_gpio   = default_tuner_gpio,1786		.decoder      = EM28XX_TVP5150,1787		.input        = { {1788			.type     = EM28XX_VMUX_TELEVISION,1789			.vmux     = TVP5150_COMPOSITE0,1790			.amux     = EM28XX_AMUX_VIDEO,1791			.gpio     = em2880_msi_digivox_ad_analog,1792		}, {1793			.type     = EM28XX_VMUX_COMPOSITE,1794			.vmux     = TVP5150_COMPOSITE1,1795			.amux     = EM28XX_AMUX_LINE_IN,1796			.gpio     = em2880_msi_digivox_ad_analog,1797		}, {1798			.type     = EM28XX_VMUX_SVIDEO,1799			.vmux     = TVP5150_SVIDEO,1800			.amux     = EM28XX_AMUX_LINE_IN,1801			.gpio     = em2880_msi_digivox_ad_analog,1802		} },1803	},1804	[EM2880_BOARD_KWORLD_DVB_305U] = {1805		.name	      = "KWorld DVB-T 305U",1806		.tuner_type   = TUNER_XC2028,1807		.tuner_gpio   = default_tuner_gpio,1808		.decoder      = EM28XX_TVP5150,1809		.input        = { {1810			.type     = EM28XX_VMUX_TELEVISION,1811			.vmux     = TVP5150_COMPOSITE0,1812			.amux     = EM28XX_AMUX_VIDEO,1813		}, {1814			.type     = EM28XX_VMUX_COMPOSITE,1815			.vmux     = TVP5150_COMPOSITE1,1816			.amux     = EM28XX_AMUX_LINE_IN,1817		}, {1818			.type     = EM28XX_VMUX_SVIDEO,1819			.vmux     = TVP5150_SVIDEO,1820			.amux     = EM28XX_AMUX_LINE_IN,1821		} },1822	},1823	[EM2880_BOARD_KWORLD_DVB_310U] = {1824		.name	      = "KWorld DVB-T 310U",1825		.tuner_type   = TUNER_XC2028,1826		.tuner_gpio   = default_tuner_gpio,1827		.has_dvb      = 1,1828		.dvb_gpio     = default_digital,1829		.mts_firmware = 1,1830		.decoder      = EM28XX_TVP5150,1831		.input        = { {1832			.type     = EM28XX_VMUX_TELEVISION,1833			.vmux     = TVP5150_COMPOSITE0,1834			.amux     = EM28XX_AMUX_VIDEO,1835			.gpio     = default_analog,1836		}, {1837			.type     = EM28XX_VMUX_COMPOSITE,1838			.vmux     = TVP5150_COMPOSITE1,1839			.amux     = EM28XX_AMUX_LINE_IN,1840			.gpio     = default_analog,1841		}, {	/* S-video has not been tested yet */1842			.type     = EM28XX_VMUX_SVIDEO,1843			.vmux     = TVP5150_SVIDEO,1844			.amux     = EM28XX_AMUX_LINE_IN,1845			.gpio     = default_analog,1846		} },1847	},1848	[EM2882_BOARD_KWORLD_ATSC_315U] = {1849		.name		= "KWorld ATSC 315U HDTV TV Box",1850		.valid		= EM28XX_BOARD_NOT_VALIDATED,1851		.tuner_type	= TUNER_THOMSON_DTT761X,1852		.tuner_gpio	= em2882_kworld_315u_tuner_gpio,1853		.tda9887_conf	= TDA9887_PRESENT,1854		.decoder	= EM28XX_SAA711X,1855		.has_dvb	= 1,1856		.dvb_gpio	= em2882_kworld_315u_digital,1857		.ir_codes	= RC_MAP_KWORLD_315U,1858		.xclk		= EM28XX_XCLK_FREQUENCY_12MHZ,1859		.i2c_speed	= EM28XX_I2C_CLK_WAIT_ENABLE,1860#if 01861		/* FIXME: Analog mode - still not ready */1862		.input        = { {1863			.type = EM28XX_VMUX_TELEVISION,1864			.vmux = SAA7115_COMPOSITE2,1865			.amux = EM28XX_AMUX_VIDEO,1866			.gpio = em2882_kworld_315u_analog,1867			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,1868		}, {1869			.type = EM28XX_VMUX_COMPOSITE,1870			.vmux = SAA7115_COMPOSITE0,1871			.amux = EM28XX_AMUX_LINE_IN,1872			.gpio = em2882_kworld_315u_analog1,1873			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,1874		}, {1875			.type = EM28XX_VMUX_SVIDEO,1876			.vmux = SAA7115_SVIDEO3,1877			.amux = EM28XX_AMUX_LINE_IN,1878			.gpio = em2882_kworld_315u_analog1,1879			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,1880		} },1881#endif1882	},1883	[EM2880_BOARD_EMPIRE_DUAL_TV] = {1884		.name = "Empire dual TV",1885		.tuner_type = TUNER_XC2028,1886		.tuner_gpio = default_tuner_gpio,1887		.has_dvb = 1,1888		.dvb_gpio = default_digital,1889		.mts_firmware = 1,1890		.decoder = EM28XX_TVP5150,1891		.input = { {1892			.type = EM28XX_VMUX_TELEVISION,1893			.vmux = TVP5150_COMPOSITE0,1894			.amux = EM28XX_AMUX_VIDEO,1895			.gpio = default_analog,1896		}, {1897			.type = EM28XX_VMUX_COMPOSITE,1898			.vmux = TVP5150_COMPOSITE1,1899			.amux = EM28XX_AMUX_LINE_IN,1900			.gpio = default_analog,1901		}, {1902			.type = EM28XX_VMUX_SVIDEO,1903			.vmux = TVP5150_SVIDEO,1904			.amux = EM28XX_AMUX_LINE_IN,1905			.gpio = default_analog,1906		} },1907	},1908	[EM2881_BOARD_DNT_DA2_HYBRID] = {1909		.name         = "DNT DA2 Hybrid",1910		.valid        = EM28XX_BOARD_NOT_VALIDATED,1911		.tuner_type   = TUNER_XC2028,1912		.tuner_gpio   = default_tuner_gpio,1913		.decoder      = EM28XX_TVP5150,1914		.input        = { {1915			.type     = EM28XX_VMUX_TELEVISION,1916			.vmux     = TVP5150_COMPOSITE0,1917			.amux     = EM28XX_AMUX_VIDEO,1918			.gpio     = default_analog,1919		}, {1920			.type     = EM28XX_VMUX_COMPOSITE,1921			.vmux     = TVP5150_COMPOSITE1,1922			.amux     = EM28XX_AMUX_LINE_IN,1923			.gpio     = default_analog,1924		}, {1925			.type     = EM28XX_VMUX_SVIDEO,1926			.vmux     = TVP5150_SVIDEO,1927			.amux     = EM28XX_AMUX_LINE_IN,1928			.gpio     = default_analog,1929		} },1930	},1931	[EM2881_BOARD_PINNACLE_HYBRID_PRO] = {1932		.name         = "Pinnacle Hybrid Pro",1933		.tuner_type   = TUNER_XC2028,1934		.tuner_gpio   = default_tuner_gpio,1935		.decoder      = EM28XX_TVP5150,1936		.has_dvb      = 1,1937		.dvb_gpio     = pinnacle_hybrid_pro_digital,1938		.input        = { {1939			.type     = EM28XX_VMUX_TELEVISION,1940			.vmux     = TVP5150_COMPOSITE0,1941			.amux     = EM28XX_AMUX_VIDEO,1942			.gpio     = pinnacle_hybrid_pro_analog,1943		}, {1944			.type     = EM28XX_VMUX_COMPOSITE,1945			.vmux     = TVP5150_COMPOSITE1,1946			.amux     = EM28XX_AMUX_LINE_IN,1947			.gpio     = pinnacle_hybrid_pro_analog,1948		}, {1949			.type     = EM28XX_VMUX_SVIDEO,1950			.vmux     = TVP5150_SVIDEO,1951			.amux     = EM28XX_AMUX_LINE_IN,1952			.gpio     = pinnacle_hybrid_pro_analog,1953		} },1954	},1955	[EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {1956		.name         = "Pinnacle Hybrid Pro (330e)",1957		.tuner_type   = TUNER_XC2028,1958		.tuner_gpio   = default_tuner_gpio,1959		.mts_firmware = 1,1960		.has_dvb      = 1,1961		.dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,1962		.ir_codes     = RC_MAP_PINNACLE_PCTV_HD,1963		.decoder      = EM28XX_TVP5150,1964		.input        = { {1965			.type     = EM28XX_VMUX_TELEVISION,1966			.vmux     = TVP5150_COMPOSITE0,1967			.amux     = EM28XX_AMUX_VIDEO,1968			.gpio     = hauppauge_wintv_hvr_900_analog,1969		}, {1970			.type     = EM28XX_VMUX_COMPOSITE,1971			.vmux     = TVP5150_COMPOSITE1,1972			.amux     = EM28XX_AMUX_LINE_IN,1973			.gpio     = hauppauge_wintv_hvr_900_analog,1974		}, {1975			.type     = EM28XX_VMUX_SVIDEO,1976			.vmux     = TVP5150_SVIDEO,1977			.amux     = EM28XX_AMUX_LINE_IN,1978			.gpio     = hauppauge_wintv_hvr_900_analog,1979		} },1980	},1981	[EM2882_BOARD_KWORLD_VS_DVBT] = {1982		.name         = "Kworld VS-DVB-T 323UR",1983		.tuner_type   = TUNER_XC2028,1984		.tuner_gpio   = default_tuner_gpio,1985		.decoder      = EM28XX_TVP5150,1986		.mts_firmware = 1,1987		.has_dvb      = 1,1988		.dvb_gpio     = kworld_330u_digital,1989		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */1990		.ir_codes     = RC_MAP_KWORLD_315U,1991		.input        = { {1992			.type     = EM28XX_VMUX_TELEVISION,1993			.vmux     = TVP5150_COMPOSITE0,1994			.amux     = EM28XX_AMUX_VIDEO,1995		}, {1996			.type     = EM28XX_VMUX_COMPOSITE,1997			.vmux     = TVP5150_COMPOSITE1,1998			.amux     = EM28XX_AMUX_LINE_IN,1999		}, {2000			.type     = EM28XX_VMUX_SVIDEO,2001			.vmux     = TVP5150_SVIDEO,2002			.amux     = EM28XX_AMUX_LINE_IN,2003		} },2004	},2005	[EM2882_BOARD_TERRATEC_HYBRID_XS] = {2006		.name         = "Terratec Cinergy Hybrid T USB XS (em2882)",2007		.tuner_type   = TUNER_XC2028,2008		.tuner_gpio   = default_tuner_gpio,2009		.mts_firmware = 1,2010		.decoder      = EM28XX_TVP5150,2011		.has_dvb      = 1,2012		.dvb_gpio     = hauppauge_wintv_hvr_900_digital,2013		.ir_codes     = RC_MAP_TERRATEC_CINERGY_XS,2014		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,2015		.input        = { {2016			.type     = EM28XX_VMUX_TELEVISION,2017			.vmux     = TVP5150_COMPOSITE0,2018			.amux     = EM28XX_AMUX_VIDEO,2019			.gpio     = hauppauge_wintv_hvr_900_analog,2020		}, {2021			.type     = EM28XX_VMUX_COMPOSITE,2022			.vmux     = TVP5150_COMPOSITE1,2023			.amux     = EM28XX_AMUX_LINE_IN,2024			.gpio     = hauppauge_wintv_hvr_900_analog,2025		}, {2026			.type     = EM28XX_VMUX_SVIDEO,2027			.vmux     = TVP5150_SVIDEO,2028			.amux     = EM28XX_AMUX_LINE_IN,2029			.gpio     = hauppauge_wintv_hvr_900_analog,2030		} },2031	},2032	[EM2882_BOARD_DIKOM_DK300] = {2033		.name         = "Dikom DK300",2034		.tuner_type   = TUNER_XC2028,2035		.tuner_gpio   = default_tuner_gpio,2036		.decoder      = EM28XX_TVP5150,2037		.mts_firmware = 1,2038		.has_dvb      = 1,2039		.dvb_gpio     = dikom_dk300_digital,2040		.input        = { {2041			.type     = EM28XX_VMUX_TELEVISION,2042			.vmux     = TVP5150_COMPOSITE0,2043			.amux     = EM28XX_AMUX_VIDEO,2044			.gpio     = default_analog,2045		} },2046	},2047	[EM2883_BOARD_KWORLD_HYBRID_330U] = {2048		.name         = "Kworld PlusTV HD Hybrid 330",2049		.tuner_type   = TUNER_XC2028,2050		.tuner_gpio   = default_tuner_gpio,2051		.decoder      = EM28XX_TVP5150,2052		.mts_firmware = 1,2053		.has_dvb      = 1,2054		.dvb_gpio     = kworld_330u_digital,2055		.xclk             = EM28XX_XCLK_FREQUENCY_12MHZ,2056		.i2c_speed        = EM28XX_I2C_CLK_WAIT_ENABLE |2057				    EM28XX_I2C_EEPROM_ON_BOARD |2058				    EM28XX_I2C_EEPROM_KEY_VALID,2059		.input        = { {2060			.type     = EM28XX_VMUX_TELEVISION,2061			.vmux     = TVP5150_COMPOSITE0,2062			.amux     = EM28XX_AMUX_VIDEO,2063			.gpio     = kworld_330u_analog,2064			.aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,2065		}, {2066			.type     = EM28XX_VMUX_COMPOSITE,2067			.vmux     = TVP5150_COMPOSITE1,2068			.amux     = EM28XX_AMUX_LINE_IN,2069			.gpio     = kworld_330u_analog,2070			.aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,2071		}, {2072			.type     = EM28XX_VMUX_SVIDEO,2073			.vmux     = TVP5150_SVIDEO,2074			.amux     = EM28XX_AMUX_LINE_IN,2075			.gpio     = kworld_330u_analog,2076		} },2077	},2078	[EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {2079		.name         = "Compro VideoMate ForYou/Stereo",2080		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,2081		.tvaudio_addr = 0xb0,2082		.tda9887_conf = TDA9887_PRESENT,2083		.decoder      = EM28XX_TVP5150,2084		.adecoder     = EM28XX_TVAUDIO,2085		.mute_gpio    = compro_mute_gpio,2086		.input        = { {2087			.type     = EM28XX_VMUX_TELEVISION,2088			.vmux     = TVP5150_COMPOSITE0,2089			.amux     = EM28XX_AMUX_VIDEO,2090			.gpio     = compro_unmute_tv_gpio,2091		}, {2092			.type     = EM28XX_VMUX_SVIDEO,2093			.vmux     = TVP5150_SVIDEO,2094			.amux     = EM28XX_AMUX_LINE_IN,2095			.gpio     = compro_unmute_svid_gpio,2096		} },2097	},2098	[EM2860_BOARD_KAIOMY_TVNPC_U2] = {2099		.name	      = "Kaiomy TVnPC U2",2100		.vchannels    = 3,2101		.tuner_type   = TUNER_XC2028,2102		.tuner_addr   = 0x61,2103		.mts_firmware = 1,2104		.decoder      = EM28XX_TVP5150,2105		.tuner_gpio   = default_tuner_gpio,2106		.ir_codes     = RC_MAP_KAIOMY,2107		.input          = { {2108			.type     = EM28XX_VMUX_TELEVISION,2109			.vmux     = TVP5150_COMPOSITE0,2110			.amux     = EM28XX_AMUX_VIDEO,2111 2112		}, {2113			.type     = EM28XX_VMUX_COMPOSITE,2114			.vmux     = TVP5150_COMPOSITE1,2115			.amux     = EM28XX_AMUX_LINE_IN,2116		}, {2117			.type     = EM28XX_VMUX_SVIDEO,2118			.vmux     = TVP5150_SVIDEO,2119			.amux     = EM28XX_AMUX_LINE_IN,2120		} },2121		.radio		= {2122			.type     = EM28XX_RADIO,2123			.amux     = EM28XX_AMUX_LINE_IN,2124		}2125	},2126	[EM2860_BOARD_EASYCAP] = {2127		.name         = "Easy Cap Capture DC-60",2128		.vchannels    = 2,2129		.tuner_type   = TUNER_ABSENT,2130		.decoder      = EM28XX_SAA711X,2131		.input           = { {2132			.type     = EM28XX_VMUX_COMPOSITE,2133			.vmux     = SAA7115_COMPOSITE0,2134			.amux     = EM28XX_AMUX_LINE_IN,2135		}, {2136			.type     = EM28XX_VMUX_SVIDEO,2137			.vmux     = SAA7115_SVIDEO3,2138			.amux     = EM28XX_AMUX_LINE_IN,2139		} },2140	},2141	[EM2820_BOARD_IODATA_GVMVP_SZ] = {2142		.name       = "IO-DATA GV-MVP/SZ",2143		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,2144		.tuner_gpio   = default_tuner_gpio,2145		.tda9887_conf = TDA9887_PRESENT,2146		.decoder      = EM28XX_TVP5150,2147		.input        = { {2148			.type     = EM28XX_VMUX_TELEVISION,2149			.vmux     = TVP5150_COMPOSITE0,2150			.amux     = EM28XX_AMUX_VIDEO,2151		}, { /* Composite has not been tested yet */2152			.type     = EM28XX_VMUX_COMPOSITE,2153			.vmux     = TVP5150_COMPOSITE1,2154			.amux     = EM28XX_AMUX_VIDEO,2155		}, { /* S-video has not been tested yet */2156			.type     = EM28XX_VMUX_SVIDEO,2157			.vmux     = TVP5150_SVIDEO,2158			.amux     = EM28XX_AMUX_VIDEO,2159		} },2160	},2161	[EM2860_BOARD_TERRATEC_GRABBY] = {2162		.name            = "Terratec Grabby",2163		.vchannels       = 2,2164		.tuner_type      = TUNER_ABSENT,2165		.decoder         = EM28XX_SAA711X,2166		.xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,2167		.input           = { {2168			.type     = EM28XX_VMUX_COMPOSITE,2169			.vmux     = SAA7115_COMPOSITE0,2170			.amux     = EM28XX_AMUX_LINE_IN,2171		}, {2172			.type     = EM28XX_VMUX_SVIDEO,2173			.vmux     = SAA7115_SVIDEO3,2174			.amux     = EM28XX_AMUX_LINE_IN,2175		} },2176		.buttons         = std_snapshot_button,2177		.leds            = terratec_grabby_leds,2178	},2179	[EM2860_BOARD_TERRATEC_AV350] = {2180		.name            = "Terratec AV350",2181		.vchannels       = 2,2182		.tuner_type      = TUNER_ABSENT,2183		.decoder         = EM28XX_TVP5150,2184		.xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,2185		.mute_gpio       = terratec_av350_mute_gpio,2186		.input           = { {2187			.type     = EM28XX_VMUX_COMPOSITE,2188			.vmux     = TVP5150_COMPOSITE1,2189			.amux     = EM28XX_AMUX_LINE_IN,2190			.gpio     = terratec_av350_unmute_gpio,2191 2192		}, {2193			.type     = EM28XX_VMUX_SVIDEO,2194			.vmux     = TVP5150_SVIDEO,2195			.amux     = EM28XX_AMUX_LINE_IN,2196			.gpio     = terratec_av350_unmute_gpio,2197		} },2198	},2199 2200	[EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = {2201		.name         = "Elgato Video Capture",2202		.decoder      = EM28XX_SAA711X,2203		.tuner_type   = TUNER_ABSENT,   /* Capture only device */2204		.input        = { {2205			.type  = EM28XX_VMUX_COMPOSITE,2206			.vmux  = SAA7115_COMPOSITE0,2207			.amux  = EM28XX_AMUX_LINE_IN,2208		}, {2209			.type  = EM28XX_VMUX_SVIDEO,2210			.vmux  = SAA7115_SVIDEO3,2211			.amux  = EM28XX_AMUX_LINE_IN,2212		} },2213	},2214 2215	[EM2882_BOARD_EVGA_INDTUBE] = {2216		.name         = "Evga inDtube",2217		.tuner_type   = TUNER_XC2028,2218		.tuner_gpio   = default_tuner_gpio,2219		.decoder      = EM28XX_TVP5150,2220		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */2221		.mts_firmware = 1,2222		.has_dvb      = 1,2223		.dvb_gpio     = evga_indtube_digital,2224		.ir_codes     = RC_MAP_EVGA_INDTUBE,2225		.input        = { {2226			.type     = EM28XX_VMUX_TELEVISION,2227			.vmux     = TVP5150_COMPOSITE0,2228			.amux     = EM28XX_AMUX_VIDEO,2229			.gpio     = evga_indtube_analog,2230		}, {2231			.type     = EM28XX_VMUX_COMPOSITE,2232			.vmux     = TVP5150_COMPOSITE1,2233			.amux     = EM28XX_AMUX_LINE_IN,2234			.gpio     = evga_indtube_analog,2235		}, {2236			.type     = EM28XX_VMUX_SVIDEO,2237			.vmux     = TVP5150_SVIDEO,2238			.amux     = EM28XX_AMUX_LINE_IN,2239			.gpio     = evga_indtube_analog,2240		} },2241	},2242	/*2243	 * eb1a:2868 Empia EM2870 + Philips CU1216L NIM2244	 * (Philips TDA10023 + Infineon TUA6034)2245	 */2246	[EM2870_BOARD_REDDO_DVB_C_USB_BOX] = {2247		.name          = "Reddo DVB-C USB TV Box",2248		.tuner_type    = TUNER_ABSENT,2249		.tuner_gpio    = reddo_dvb_c_usb_box,2250		.has_dvb       = 1,2251	},2252	/*2253	 * 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold2254	 * initially as the KWorld PlusTV 340U, then as the UB435-Q.2255	 * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C22256	 */2257	[EM2870_BOARD_KWORLD_A340] = {2258		.name       = "KWorld PlusTV 340U or UB435-Q (ATSC)",2259		.tuner_type = TUNER_ABSENT,	/* Digital-only TDA18271HD */2260		.has_dvb    = 1,2261		.dvb_gpio   = kworld_a340_digital,2262		.tuner_gpio = default_tuner_gpio,2263	},2264	/*2265	 * 2013:024f PCTV nanoStick T2 290e.2266	 * Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C22267	 */2268	[EM28174_BOARD_PCTV_290E] = {2269		.name          = "PCTV nanoStick T2 290e",2270		.def_i2c_bus   = 1,2271		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2272				 EM28XX_I2C_FREQ_100_KHZ,2273		.tuner_type    = TUNER_ABSENT,2274		.tuner_gpio    = pctv_290e,2275		.has_dvb       = 1,2276		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,2277	},2278	/*2279	 * 2013:024f PCTV DVB-S2 Stick 460e2280	 * Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A82932281	 */2282	[EM28174_BOARD_PCTV_460E] = {2283		.def_i2c_bus   = 1,2284		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2285				 EM28XX_I2C_FREQ_400_KHZ,2286		.name          = "PCTV DVB-S2 Stick (460e)",2287		.tuner_type    = TUNER_ABSENT,2288		.tuner_gpio    = pctv_460e,2289		.has_dvb       = 1,2290		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,2291	},2292	/*2293	 * eb1a:5006 Honestech VIDBOX NW032294	 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner2295	 */2296	[EM2860_BOARD_HT_VIDBOX_NW03] = {2297		.name                = "Honestech Vidbox NW03",2298		.tuner_type          = TUNER_ABSENT,2299		.decoder             = EM28XX_SAA711X,2300		.input               = { {2301			.type     = EM28XX_VMUX_COMPOSITE,2302			.vmux     = SAA7115_COMPOSITE0,2303			.amux     = EM28XX_AMUX_LINE_IN,2304		}, {2305			.type     = EM28XX_VMUX_SVIDEO,2306			.vmux     = SAA7115_SVIDEO3,  /* S-VIDEO needs check */2307			.amux     = EM28XX_AMUX_LINE_IN,2308		} },2309	},2310	/*2311	 * 1b80:e425 MaxMedia UB425-TC2312	 * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC22313	 */2314	[EM2874_BOARD_MAXMEDIA_UB425_TC] = {2315		.name          = "MaxMedia UB425-TC",2316		.tuner_type    = TUNER_ABSENT,2317		.tuner_gpio    = maxmedia_ub425_tc,2318		.has_dvb       = 1,2319		.ir_codes      = RC_MAP_REDDO,2320		.def_i2c_bus   = 1,2321		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2322				EM28XX_I2C_FREQ_400_KHZ,2323	},2324	/*2325	 * 2304:0242 PCTV QuatroStick (510e)2326	 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC22327	 */2328	[EM2884_BOARD_PCTV_510E] = {2329		.name          = "PCTV QuatroStick (510e)",2330		.tuner_type    = TUNER_ABSENT,2331		.tuner_gpio    = pctv_510e,2332		.has_dvb       = 1,2333		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,2334		.def_i2c_bus   = 1,2335		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2336				EM28XX_I2C_FREQ_400_KHZ,2337	},2338	/*2339	 * 2013:0251 PCTV QuatroStick nano (520e)2340	 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC22341	 */2342	[EM2884_BOARD_PCTV_520E] = {2343		.name          = "PCTV QuatroStick nano (520e)",2344		.tuner_type    = TUNER_ABSENT,2345		.tuner_gpio    = pctv_520e,2346		.has_dvb       = 1,2347		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,2348		.def_i2c_bus   = 1,2349		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2350				EM28XX_I2C_FREQ_400_KHZ,2351	},2352	[EM2884_BOARD_TERRATEC_HTC_USB_XS] = {2353		.name         = "Terratec Cinergy HTC USB XS",2354		.has_dvb      = 1,2355		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,2356		.tuner_type   = TUNER_ABSENT,2357		.def_i2c_bus  = 1,2358		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |2359				EM28XX_I2C_FREQ_400_KHZ,2360	},2361	/*2362	 * 1b80:e1cc Delock 619592363	 * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC22364	 * mostly the same as MaxMedia UB-425-TC but different remote2365	 */2366	[EM2874_BOARD_DELOCK_61959] = {2367		.name          = "Delock 61959",2368		.tuner_type    = TUNER_ABSENT,2369		.tuner_gpio    = maxmedia_ub425_tc,2370		.has_dvb       = 1,2371		.ir_codes      = RC_MAP_DELOCK_61959,2372		.def_i2c_bus   = 1,2373		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2374				EM28XX_I2C_FREQ_400_KHZ,2375	},2376	/*2377	 * 1b80:e346 KWorld USB ATSC TV Stick UB435-Q V22378	 * Empia EM2874B + LG DT3305 + NXP TDA18271HDC22379	 */2380	[EM2874_BOARD_KWORLD_UB435Q_V2] = {2381		.name		= "KWorld USB ATSC TV Stick UB435-Q V2",2382		.tuner_type	= TUNER_ABSENT,2383		.has_dvb	= 1,2384		.dvb_gpio	= kworld_a340_digital,2385		.tuner_gpio	= default_tuner_gpio,2386		.def_i2c_bus	= 1,2387	},2388	/*2389	 * 1b80:e34c KWorld USB ATSC TV Stick UB435-Q V32390	 * Empia EM2874B + LG DT3305 + NXP TDA18271HDC22391	 */2392	[EM2874_BOARD_KWORLD_UB435Q_V3] = {2393		.name		= "KWorld USB ATSC TV Stick UB435-Q V3",2394		.tuner_type	= TUNER_ABSENT,2395		.has_dvb	= 1,2396		.tuner_gpio	= kworld_ub435q_v3_digital,2397		.def_i2c_bus	= 1,2398		.i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |2399				  EM28XX_I2C_FREQ_100_KHZ,2400		.leds = kworld_ub435q_v3_leds,2401	},2402	[EM2874_BOARD_PCTV_HD_MINI_80E] = {2403		.name         = "Pinnacle PCTV HD Mini",2404		.tuner_type   = TUNER_ABSENT,2405		.has_dvb      = 1,2406		.dvb_gpio     = em2874_pctv_80e_digital,2407		.decoder      = EM28XX_NODECODER,2408		.ir_codes     = RC_MAP_PINNACLE_PCTV_HD,2409		.leds         = pctv_80e_leds,2410	},2411	/*2412	 * 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam2413	 * Empia EM2765 + OmniVision OV26402414	 */2415	[EM2765_BOARD_SPEEDLINK_VAD_LAPLACE] = {2416		.name         = "SpeedLink Vicious And Devine Laplace webcam",2417		.xclk         = EM28XX_XCLK_FREQUENCY_24MHZ,2418		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |2419				EM28XX_I2C_FREQ_100_KHZ,2420		.def_i2c_bus  = 1,2421		.tuner_type   = TUNER_ABSENT,2422		.is_webcam    = 1,2423		.input        = { {2424			.type     = EM28XX_VMUX_COMPOSITE,2425			.amux     = EM28XX_AMUX_VIDEO,2426			.gpio     = speedlink_vad_laplace_reg_seq,2427		} },2428		.buttons = speedlink_vad_laplace_buttons,2429		.leds = speedlink_vad_laplace_leds,2430	},2431	/*2432	 * 2013:0258 PCTV DVB-S2 Stick (461e)2433	 * Empia EM28178, Montage M88DS3103, Montage M88TS2022, Allegro A82932434	 */2435	[EM28178_BOARD_PCTV_461E] = {2436		.def_i2c_bus   = 1,2437		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2438				 EM28XX_I2C_FREQ_400_KHZ,2439		.name          = "PCTV DVB-S2 Stick (461e)",2440		.tuner_type    = TUNER_ABSENT,2441		.tuner_gpio    = pctv_461e,2442		.has_dvb       = 1,2443		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,2444	},2445	/*2446	 * 2013:0259 PCTV DVB-S2 Stick (461e_v2)2447	 * Empia EM28178, Montage M88DS3103b, Montage M88TS2022, Allegro A82932448	 */2449	[EM28178_BOARD_PCTV_461E_V2] = {2450		.def_i2c_bus   = 1,2451		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2452				 EM28XX_I2C_FREQ_400_KHZ,2453		.name          = "PCTV DVB-S2 Stick (461e v2)",2454		.tuner_type    = TUNER_ABSENT,2455		.tuner_gpio    = pctv_461e,2456		.has_dvb       = 1,2457		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,2458	},2459	/*2460	 * 2013:025f PCTV tripleStick (292e).2461	 * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si21572462	 */2463	[EM28178_BOARD_PCTV_292E] = {2464		.name          = "PCTV tripleStick (292e)",2465		.def_i2c_bus   = 1,2466		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2467				 EM28XX_I2C_FREQ_400_KHZ,2468		.tuner_type    = TUNER_ABSENT,2469		.tuner_gpio    = pctv_292e,2470		.has_dvb       = 1,2471		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,2472	},2473	[EM2861_BOARD_LEADTEK_VC100] = {2474		.name          = "Leadtek VC100",2475		.tuner_type    = TUNER_ABSENT,	/* Capture only device */2476		.decoder       = EM28XX_TVP5150,2477		.input         = { {2478			.type     = EM28XX_VMUX_COMPOSITE,2479			.vmux     = TVP5150_COMPOSITE1,2480			.amux     = EM28XX_AMUX_LINE_IN,2481		}, {2482			.type     = EM28XX_VMUX_SVIDEO,2483			.vmux     = TVP5150_SVIDEO,2484			.amux     = EM28XX_AMUX_LINE_IN,2485		} },2486	},2487	/*2488	 * eb1a:8179 Terratec Cinergy T2 Stick HD.2489	 * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si21462490	 */2491	[EM28178_BOARD_TERRATEC_T2_STICK_HD] = {2492		.name          = "Terratec Cinergy T2 Stick HD",2493		.def_i2c_bus   = 1,2494		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2495				 EM28XX_I2C_FREQ_400_KHZ,2496		.tuner_type    = TUNER_ABSENT,2497		.tuner_gpio    = terratec_t2_stick_hd,2498		.has_dvb       = 1,2499		.ir_codes      = RC_MAP_TERRATEC_SLIM_2,2500	},2501 2502	/*2503	 * 3275:0085 PLEX PX-BCUD.2504	 * Empia EM28178, TOSHIBA TC90532XBG, Sharp QM1D1C00422505	 */2506	[EM28178_BOARD_PLEX_PX_BCUD] = {2507		.name          = "PLEX PX-BCUD",2508		.xclk          = EM28XX_XCLK_FREQUENCY_4_3MHZ,2509		.def_i2c_bus   = 1,2510		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE,2511		.tuner_type    = TUNER_ABSENT,2512		.tuner_gpio    = plex_px_bcud,2513		.has_dvb       = 1,2514	},2515	/*2516	 * 2040:0265 Hauppauge WinTV-dualHD (DVB version) Isoc.2517	 * 2040:8265 Hauppauge WinTV-dualHD (DVB version) Bulk.2518	 * Empia EM28274, 2x Silicon Labs Si2168, 2x Silicon Labs Si21572519	 */2520	[EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB] = {2521		.name          = "Hauppauge WinTV-dualHD DVB",2522		.def_i2c_bus   = 1,2523		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2524				 EM28XX_I2C_FREQ_400_KHZ,2525		.tuner_type    = TUNER_SI2157,2526		.tuner_gpio    = hauppauge_dualhd_dvb,2527		.has_dvb       = 1,2528		.has_dual_ts   = 1,2529		.ir_codes      = RC_MAP_HAUPPAUGE,2530		.leds          = hauppauge_dualhd_leds,2531		.input         = { {2532			.type     = EM28XX_VMUX_COMPOSITE,2533			.vmux     = TVP5150_COMPOSITE1,2534			.amux     = EM28XX_AMUX_LINE_IN,2535		} },2536	},2537	/*2538	 * 2040:026d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Isoc.2539	 * 2040:826d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Bulk.2540	 * Empia EM28274, 2x LG LGDT3306A, 2x Silicon Labs Si21572541	 */2542	[EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595] = {2543		.name          = "Hauppauge WinTV-dualHD 01595 ATSC/QAM",2544		.def_i2c_bus   = 1,2545		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |2546				 EM28XX_I2C_FREQ_400_KHZ,2547		.tuner_type    = TUNER_ABSENT,2548		.tuner_gpio    = hauppauge_dualhd_dvb,2549		.has_dvb       = 1,2550		.has_dual_ts   = 1,2551		.ir_codes      = RC_MAP_HAUPPAUGE,2552		.leds          = hauppauge_dualhd_leds,2553	},2554	/*2555	 * 1b80:e349 Magix USB Videowandler-22556	 * (same chips as Honestech VIDBOX NW03)2557	 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner2558	 */2559	[EM2861_BOARD_MAGIX_VIDEOWANDLER2] = {2560		.name                = "Magix USB Videowandler-2",2561		.tuner_type          = TUNER_ABSENT,2562		.decoder             = EM28XX_SAA711X,2563		.input               = { {2564			.type     = EM28XX_VMUX_COMPOSITE,2565			.vmux     = SAA7115_COMPOSITE0,2566			.amux     = EM28XX_AMUX_LINE_IN,2567		}, {2568			.type     = EM28XX_VMUX_SVIDEO,2569			.amux     = EM28XX_AMUX_LINE_IN,2570		} },2571	},2572	/*2573	 * 1f4d:1abe MyGica iGrabber2574	 * (same as several other EM2860 devices)2575	 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner2576	 */2577	[EM2860_BOARD_MYGICA_IGRABBER] = {2578		.name         = "MyGica iGrabber",2579		.vchannels    = 2,2580		.tuner_type   = TUNER_ABSENT,2581		.decoder      = EM28XX_SAA711X,2582		.input           = { {2583			.type     = EM28XX_VMUX_COMPOSITE,2584			.vmux     = SAA7115_COMPOSITE0,2585			.amux     = EM28XX_AMUX_LINE_IN,2586		}, {2587			.type     = EM28XX_VMUX_SVIDEO,2588			.vmux     = SAA7115_SVIDEO3,2589			.amux     = EM28XX_AMUX_LINE_IN,2590		} },2591	},2592	/* 2040:826d Hauppauge USB QuadHD2593	 * Empia 28274, Max Linear 692 ATSC combo demod/tuner2594	 */2595	[EM2874_BOARD_HAUPPAUGE_USB_QUADHD] = {2596		.name          = "Hauppauge USB QuadHD ATSC",2597		.def_i2c_bus   = 1,2598		.has_dual_ts   = 1,2599		.has_dvb       = 1,2600		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ,2601		.tuner_type    = TUNER_ABSENT,2602		.tuner_gpio    = hauppauge_usb_quadhd_atsc_reg_seq,2603		.leds          = hauppauge_usb_quadhd_leds,2604	},2605	/*2606	 * eb1a:2860 MyGica UTV3 Analog USB2.0 TV Box2607	 * Empia EM2860, Philips SAA7113, NXP TDA9801T demod,2608	 * Tena TNF931D-DFDR1 tuner (contains NXP TDA6509A),2609	 * ST HCF4052 demux (switches audio to line out),2610	 * no audio over USB2611	 */2612	[EM2860_BOARD_MYGICA_UTV3] = {2613		.name         = "MyGica UTV3 Analog USB2.0 TV Box",2614		.xclk         = EM28XX_XCLK_IR_RC5_MODE | EM28XX_XCLK_FREQUENCY_12MHZ,2615		.tuner_type   = TUNER_TENA_TNF_931D_DFDR1,2616		.ir_codes     = RC_MAP_MYGICA_UTV3,2617		.decoder      = EM28XX_SAA711X,2618		.suspend_gpio = mygica_utv3_suspend_gpio,2619		.input        = { {2620			.type     = EM28XX_VMUX_COMPOSITE,2621			.vmux     = SAA7115_COMPOSITE0,2622			.amux     = EM28XX_AMUX_VIDEO,2623			.gpio     = mygica_utv3_composite_audio_gpio,2624		}, {2625			.type     = EM28XX_VMUX_TELEVISION,2626			.vmux     = SAA7115_COMPOSITE2,2627			.amux     = EM28XX_AMUX_VIDEO,2628			.gpio     = mygica_utv3_tuner_audio_gpio,2629		} },2630	},2631};2632EXPORT_SYMBOL_GPL(em28xx_boards);2633 2634static const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);2635 2636/* table of devices that work with this driver */2637struct usb_device_id em28xx_id_table[] = {2638	{ USB_DEVICE(0xeb1a, 0x2750),2639			.driver_info = EM2750_BOARD_UNKNOWN },2640	{ USB_DEVICE(0xeb1a, 0x2751),2641			.driver_info = EM2750_BOARD_UNKNOWN },2642	{ USB_DEVICE(0xeb1a, 0x2800),2643			.driver_info = EM2800_BOARD_UNKNOWN },2644	{ USB_DEVICE(0xeb1a, 0x2710),2645			.driver_info = EM2820_BOARD_UNKNOWN },2646	{ USB_DEVICE(0xeb1a, 0x2820),2647			.driver_info = EM2820_BOARD_UNKNOWN },2648	{ USB_DEVICE(0xeb1a, 0x2821),2649			.driver_info = EM2820_BOARD_UNKNOWN },2650	{ USB_DEVICE(0xeb1a, 0x2860),2651			.driver_info = EM2820_BOARD_UNKNOWN },2652	{ USB_DEVICE(0xeb1a, 0x2861),2653			.driver_info = EM2820_BOARD_UNKNOWN },2654	{ USB_DEVICE(0xeb1a, 0x2862),2655			.driver_info = EM2820_BOARD_UNKNOWN },2656	{ USB_DEVICE(0xeb1a, 0x2863),2657			.driver_info = EM2820_BOARD_UNKNOWN },2658	{ USB_DEVICE(0xeb1a, 0x2870),2659			.driver_info = EM2820_BOARD_UNKNOWN },2660	{ USB_DEVICE(0xeb1a, 0x2881),2661			.driver_info = EM2820_BOARD_UNKNOWN },2662	{ USB_DEVICE(0xeb1a, 0x2883), /* used by :Zolid Hybrid Tv Stick */2663			.driver_info = EM2820_BOARD_UNKNOWN },2664	{ USB_DEVICE(0xeb1a, 0x2868),2665			.driver_info = EM2820_BOARD_UNKNOWN },2666	{ USB_DEVICE(0xeb1a, 0x2875),2667			.driver_info = EM2820_BOARD_UNKNOWN },2668	{ USB_DEVICE(0xeb1a, 0x2885), /* MSI Digivox Trio */2669			.driver_info = EM2884_BOARD_TERRATEC_H5 },2670	{ USB_DEVICE(0xeb1a, 0xe300),2671			.driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },2672	{ USB_DEVICE(0xeb1a, 0xe303),2673			.driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },2674	{ USB_DEVICE(0xeb1a, 0xe305),2675			.driver_info = EM2880_BOARD_KWORLD_DVB_305U },2676	{ USB_DEVICE(0xeb1a, 0xe310),2677			.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },2678	{ USB_DEVICE(0xeb1a, 0xa313),2679		.driver_info = EM2882_BOARD_KWORLD_ATSC_315U },2680	{ USB_DEVICE(0xeb1a, 0xa316),2681			.driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },2682	{ USB_DEVICE(0xeb1a, 0xe320),2683			.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },2684	{ USB_DEVICE(0xeb1a, 0xe323),2685			.driver_info = EM2882_BOARD_KWORLD_VS_DVBT },2686	{ USB_DEVICE(0xeb1a, 0xe350),2687			.driver_info = EM2870_BOARD_KWORLD_350U },2688	{ USB_DEVICE(0xeb1a, 0xe355),2689			.driver_info = EM2870_BOARD_KWORLD_355U },2690	{ USB_DEVICE(0xeb1a, 0x2801),2691			.driver_info = EM2800_BOARD_GRABBEEX_USB2800 },2692	{ USB_DEVICE(0xeb1a, 0xe357),2693			.driver_info = EM2870_BOARD_KWORLD_355U },2694	{ USB_DEVICE(0xeb1a, 0xe359),2695			.driver_info = EM2870_BOARD_KWORLD_355U },2696	{ USB_DEVICE(0x1b80, 0xe302), /* Kaiser Baas Video to DVD maker */2697			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },2698	{ USB_DEVICE(0x1b80, 0xe304), /* Kworld DVD Maker 2 */2699			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },2700	{ USB_DEVICE(0x0ccd, 0x0036),2701			.driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },2702	{ USB_DEVICE(0x0ccd, 0x004c),2703			.driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },2704	{ USB_DEVICE(0x0ccd, 0x004f),2705			.driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },2706	{ USB_DEVICE(0x0ccd, 0x005e),2707			.driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },2708	{ USB_DEVICE(0x0ccd, 0x0042),2709			.driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },2710	{ USB_DEVICE(0x0ccd, 0x0043),2711			.driver_info = EM2870_BOARD_TERRATEC_XS_MT2060 },2712	{ USB_DEVICE(0x0ccd, 0x008e),	/* Cinergy HTC USB XS Rev. 1 */2713			.driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },2714	{ USB_DEVICE(0x0ccd, 0x00ac),	/* Cinergy HTC USB XS Rev. 2 */2715			.driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },2716	{ USB_DEVICE(0x0ccd, 0x10a2),	/* H5 Rev. 1 */2717			.driver_info = EM2884_BOARD_TERRATEC_H5 },2718	{ USB_DEVICE(0x0ccd, 0x10ad),	/* H5 Rev. 2 */2719			.driver_info = EM2884_BOARD_TERRATEC_H5 },2720	{ USB_DEVICE(0x0ccd, 0x10b6),	/* H5 Rev. 3 */2721			.driver_info = EM2884_BOARD_TERRATEC_H5 },2722	{ USB_DEVICE(0x0ccd, 0x10b2),	/* H6 */2723			.driver_info = EM2884_BOARD_TERRATEC_H6 },2724	{ USB_DEVICE(0x0ccd, 0x0084),2725			.driver_info = EM2860_BOARD_TERRATEC_AV350 },2726	{ USB_DEVICE(0x0ccd, 0x0096),2727			.driver_info = EM2860_BOARD_TERRATEC_GRABBY },2728	{ USB_DEVICE(0x0ccd, 0x10AF),2729			.driver_info = EM2860_BOARD_TERRATEC_GRABBY },2730	{ USB_DEVICE(0x0ccd, 0x00b2),2731			.driver_info = EM2884_BOARD_CINERGY_HTC_STICK },2732	{ USB_DEVICE(0x0fd9, 0x0018),2733			.driver_info = EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 },2734	{ USB_DEVICE(0x0fd9, 0x0033),2735			.driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE },2736	{ USB_DEVICE(0x185b, 0x2870),2737			.driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },2738	{ USB_DEVICE(0x185b, 0x2041),2739			.driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },2740	{ USB_DEVICE(0x2040, 0x4200),2741			.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },2742	{ USB_DEVICE(0x2040, 0x4201),2743			.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },2744	{ USB_DEVICE(0x2040, 0x6500),2745			.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },2746	{ USB_DEVICE(0x2040, 0x6502),2747			.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },2748	{ USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */2749			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },2750	{ USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */2751			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },2752	{ USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */2753			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },2754	{ USB_DEVICE(0x2040, 0x651f),2755			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },2756	{ USB_DEVICE(0x2040, 0x0265),2757			.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },2758	{ USB_DEVICE(0x2040, 0x8265),2759			.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },2760	{ USB_DEVICE(0x2040, 0x026d),2761			.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },2762	{ USB_DEVICE(0x2040, 0x826d),2763			.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },2764	{ USB_DEVICE(0x2040, 0x846d),2765			.driver_info = EM2874_BOARD_HAUPPAUGE_USB_QUADHD },2766	{ USB_DEVICE(0x0438, 0xb002),2767			.driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },2768	{ USB_DEVICE(0x2001, 0xf112),2769			.driver_info = EM2820_BOARD_DLINK_USB_TV },2770	{ USB_DEVICE(0x2304, 0x0207),2771			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },2772	{ USB_DEVICE(0x2304, 0x0208),2773			.driver_info = EM2820_BOARD_PINNACLE_USB_2 },2774	{ USB_DEVICE(0x2304, 0x021a),2775			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },2776	{ USB_DEVICE(0x2304, 0x0226),2777			.driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E },2778	{ USB_DEVICE(0x2304, 0x0227),2779			.driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },2780	{ USB_DEVICE(0x2304, 0x023f),2781			.driver_info = EM2874_BOARD_PCTV_HD_MINI_80E },2782	{ USB_DEVICE(0x0413, 0x6023),2783			.driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },2784	{ USB_DEVICE(0x093b, 0xa003),2785		       .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },2786	{ USB_DEVICE(0x093b, 0xa005),2787			.driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },2788	{ USB_DEVICE(0x04bb, 0x0515),2789			.driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },2790	{ USB_DEVICE(0xeb1a, 0x50a6),2791			.driver_info = EM2860_BOARD_GADMEI_UTV330 },2792	{ USB_DEVICE(0x1b80, 0xa340),2793			.driver_info = EM2870_BOARD_KWORLD_A340 },2794	{ USB_DEVICE(0x1b80, 0xe346),2795			.driver_info = EM2874_BOARD_KWORLD_UB435Q_V2 },2796	{ USB_DEVICE(0x1b80, 0xe34c),2797			.driver_info = EM2874_BOARD_KWORLD_UB435Q_V3 },2798	{ USB_DEVICE(0x2013, 0x024f),2799			.driver_info = EM28174_BOARD_PCTV_290E },2800	{ USB_DEVICE(0x2013, 0x024c),2801			.driver_info = EM28174_BOARD_PCTV_460E },2802	{ USB_DEVICE(0x2040, 0x1605),2803			.driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },2804	{ USB_DEVICE(0x1b80, 0xe755),2805			.driver_info = EM2884_BOARD_C3TECH_DIGITAL_DUO },2806	{ USB_DEVICE(0xeb1a, 0x5006),2807			.driver_info = EM2860_BOARD_HT_VIDBOX_NW03 },2808	{ USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */2809			.driver_info = EM2860_BOARD_EASYCAP },2810	{ USB_DEVICE(0x1b80, 0xe425),2811			.driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },2812	{ USB_DEVICE(0x1f4d, 0x1abe),2813			.driver_info = EM2860_BOARD_MYGICA_IGRABBER },2814	{ USB_DEVICE(0x2304, 0x0242),2815			.driver_info = EM2884_BOARD_PCTV_510E },2816	{ USB_DEVICE(0x2013, 0x0251),2817			.driver_info = EM2884_BOARD_PCTV_520E },2818	{ USB_DEVICE(0x1b80, 0xe1cc),2819			.driver_info = EM2874_BOARD_DELOCK_61959 },2820	{ USB_DEVICE(0x1ae7, 0x9003),2821			.driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },2822	{ USB_DEVICE(0x1ae7, 0x9004),2823			.driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },2824	{ USB_DEVICE(0x2013, 0x0258),2825			.driver_info = EM28178_BOARD_PCTV_461E },2826	{ USB_DEVICE(0x2013, 0x8258), /* Bulk transport 461e */2827			.driver_info = EM28178_BOARD_PCTV_461E },2828	{ USB_DEVICE(0x2013, 0x0461),2829			.driver_info = EM28178_BOARD_PCTV_461E_V2 },2830	{ USB_DEVICE(0x2013, 0x8461), /* Bulk transport 461e v2 */2831			.driver_info = EM28178_BOARD_PCTV_461E_V2 },2832	{ USB_DEVICE(0x2013, 0x0259),2833			.driver_info = EM28178_BOARD_PCTV_461E_V2 },2834	{ USB_DEVICE(0x2013, 0x025f),2835			.driver_info = EM28178_BOARD_PCTV_292E },2836	{ USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */2837			.driver_info = EM28178_BOARD_PCTV_292E },2838	{ USB_DEVICE(0x2040, 0x0264), /* Hauppauge WinTV-soloHD Isoc */2839			.driver_info = EM28178_BOARD_PCTV_292E },2840	{ USB_DEVICE(0x2040, 0x8264), /* Hauppauge OEM Generic WinTV-soloHD Bulk */2841			.driver_info = EM28178_BOARD_PCTV_292E },2842	{ USB_DEVICE(0x2040, 0x8268), /* Hauppauge Retail WinTV-soloHD Bulk */2843			.driver_info = EM28178_BOARD_PCTV_292E },2844	{ USB_DEVICE(0x0413, 0x6f07),2845			.driver_info = EM2861_BOARD_LEADTEK_VC100 },2846	{ USB_DEVICE(0xeb1a, 0x8179),2847			.driver_info = EM28178_BOARD_TERRATEC_T2_STICK_HD },2848	{ USB_DEVICE(0x3275, 0x0085),2849			.driver_info = EM28178_BOARD_PLEX_PX_BCUD },2850	{ USB_DEVICE(0xeb1a, 0x5051), /* Ion Video 2 PC MKII / Startech svid2usb23 / Raygo R12-41373 */2851			.driver_info = EM2860_BOARD_TVP5150_REFERENCE_DESIGN },2852	{ USB_DEVICE(0x1b80, 0xe349), /* Magix USB Videowandler-2 */2853		.driver_info = EM2861_BOARD_MAGIX_VIDEOWANDLER2 },2854	{ },2855};2856MODULE_DEVICE_TABLE(usb, em28xx_id_table);2857 2858/*2859 * EEPROM hash table for devices with generic USB IDs2860 */2861static const struct em28xx_hash_table em28xx_eeprom_hash[] = {2862	/* P/N: SA 60002070465 Tuner: TVF7533-MF */2863	{0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},2864	{0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},2865	{0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},2866	{0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},2867	{0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},2868	{0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},2869	{0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT},2870	{0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028},2871	{0x85dd871e, EM2882_BOARD_ZOLID_HYBRID_TV_STICK, TUNER_XC2028},2872	{0x8f597549, EM2860_BOARD_MYGICA_UTV3, TUNER_TENA_TNF_931D_DFDR1},2873};2874 2875/* I2C devicelist hash table for devices with generic USB IDs */2876static const struct em28xx_hash_table em28xx_i2c_hash[] = {2877	{0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},2878	{0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},2879	{0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},2880	{0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},2881	{0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},2882	{0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},2883	{0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT},2884	{0x27e10080, EM2882_BOARD_ZOLID_HYBRID_TV_STICK, TUNER_XC2028},2885	{0x840d0484, EM2860_BOARD_MYGICA_UTV3, TUNER_TENA_TNF_931D_DFDR1},2886};2887 2888/* NOTE: introduce a separate hash table for devices with 16 bit eeproms */2889 2890int em28xx_tuner_callback(void *ptr, int component, int command, int arg)2891{2892	struct em28xx_i2c_bus *i2c_bus = ptr;2893	struct em28xx *dev = i2c_bus->dev;2894	int rc = 0;2895 2896	if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)2897		return 0;2898 2899	if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)2900		return 0;2901 2902	rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);2903 2904	return rc;2905}2906EXPORT_SYMBOL_GPL(em28xx_tuner_callback);2907 2908static inline void em28xx_set_xclk_i2c_speed(struct em28xx *dev)2909{2910	const struct em28xx_board *board = &em28xx_boards[dev->model];2911	u8 xclk = board->xclk, i2c_speed = board->i2c_speed;2912 2913	/*2914	 * Those are the default values for the majority of boards2915	 * Use those values if not specified otherwise at boards entry2916	 */2917	if (!xclk)2918		xclk = EM28XX_XCLK_IR_RC5_MODE |2919		       EM28XX_XCLK_FREQUENCY_12MHZ;2920 2921	em28xx_write_reg(dev, EM28XX_R0F_XCLK, xclk);2922 2923	if (!i2c_speed)2924		i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |2925			    EM28XX_I2C_FREQ_100_KHZ;2926 2927	dev->i2c_speed = i2c_speed & 0x03;2928 2929	if (!dev->board.is_em2800)2930		em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, i2c_speed);2931	msleep(50);2932}2933 2934static inline void em28xx_set_model(struct em28xx *dev)2935{2936	dev->board = em28xx_boards[dev->model];2937	dev->has_msp34xx = dev->board.has_msp34xx;2938	dev->is_webcam = dev->board.is_webcam;2939 2940	em28xx_set_xclk_i2c_speed(dev);2941 2942	/* Should be initialized early, for I2C to work */2943	dev->def_i2c_bus = dev->board.def_i2c_bus;2944}2945 2946/*2947 * Wait until AC97_RESET reports the expected value reliably before proceeding.2948 * We also check that two unrelated registers accesses don't return the same2949 * value to avoid premature return.2950 * This procedure helps ensuring AC97 register accesses are reliable.2951 */2952static int em28xx_wait_until_ac97_features_equals(struct em28xx *dev,2953						  int expected_feat)2954{2955	unsigned long timeout = jiffies + msecs_to_jiffies(2000);2956	int feat, powerdown;2957 2958	while (time_is_after_jiffies(timeout)) {2959		feat = em28xx_read_ac97(dev, AC97_RESET);2960		if (feat < 0)2961			return feat;2962 2963		powerdown = em28xx_read_ac97(dev, AC97_POWERDOWN);2964		if (powerdown < 0)2965			return powerdown;2966 2967		if (feat == expected_feat && feat != powerdown)2968			return 0;2969 2970		msleep(50);2971	}2972 2973	dev_warn(&dev->intf->dev, "AC97 registers access is not reliable !\n");2974	return -ETIMEDOUT;2975}2976 2977/*2978 * Since em28xx_pre_card_setup() requires a proper dev->model,2979 * this won't work for boards with generic PCI IDs2980 */2981static void em28xx_pre_card_setup(struct em28xx *dev)2982{2983	/*2984	 * Set the initial XCLK and I2C clock values based on the board2985	 * definition2986	 */2987	em28xx_set_xclk_i2c_speed(dev);2988 2989	/* request some modules */2990	switch (dev->model) {2991	case EM2861_BOARD_PLEXTOR_PX_TV100U:2992		/* Sets the msp34xx I2S speed */2993		dev->i2s_speed = 2048000;2994		break;2995	case EM2861_BOARD_KWORLD_PVRTV_300U:2996	case EM2880_BOARD_KWORLD_DVB_305U:2997		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x6d);2998		usleep_range(10000, 11000);2999		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x7d);3000		usleep_range(10000, 11000);3001		break;3002	case EM2870_BOARD_COMPRO_VIDEOMATE:3003		/*3004		 * TODO: someone can do some cleanup here...3005		 *	 not everything's needed3006		 */3007		em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);3008		usleep_range(10000, 11000);3009		em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);3010		usleep_range(10000, 11000);3011		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);3012		msleep(70);3013		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);3014		msleep(70);3015		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xdc);3016		msleep(70);3017		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);3018		msleep(70);3019		break;3020	case EM2870_BOARD_TERRATEC_XS_MT2060:3021		/*3022		 * this device needs some gpio writes to get the DVB-T3023		 * demod work3024		 */3025		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);3026		msleep(70);3027		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);3028		msleep(70);3029		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);3030		msleep(70);3031		break;3032	case EM2870_BOARD_PINNACLE_PCTV_DVB:3033		/*3034		 * this device needs some gpio writes to get the3035		 * DVB-T demod work3036		 */3037		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);3038		msleep(70);3039		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);3040		msleep(70);3041		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);3042		msleep(70);3043		break;3044	case EM2820_BOARD_GADMEI_UTV310:3045	case EM2820_BOARD_MSI_VOX_USB_2:3046		/* enables audio for that devices */3047		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);3048		break;3049 3050	case EM2882_BOARD_KWORLD_ATSC_315U:3051		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);3052		usleep_range(10000, 11000);3053		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);3054		usleep_range(10000, 11000);3055		em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);3056		usleep_range(10000, 11000);3057		em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);3058		usleep_range(10000, 11000);3059		break;3060 3061	case EM2860_BOARD_KAIOMY_TVNPC_U2:3062		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);3063		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);3064		em28xx_write_regs(dev, 0x0d, "\x42", 1);3065		em28xx_write_regs(dev, 0x08, "\xfd", 1);3066		usleep_range(10000, 11000);3067		em28xx_write_regs(dev, 0x08, "\xff", 1);3068		usleep_range(10000, 11000);3069		em28xx_write_regs(dev, 0x08, "\x7f", 1);3070		usleep_range(10000, 11000);3071		em28xx_write_regs(dev, 0x08, "\x6b", 1);3072 3073		break;3074	case EM2860_BOARD_EASYCAP:3075		em28xx_write_regs(dev, 0x08, "\xf8", 1);3076		break;3077 3078	case EM2820_BOARD_IODATA_GVMVP_SZ:3079		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);3080		msleep(70);3081		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);3082		usleep_range(10000, 11000);3083		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);3084		msleep(70);3085		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);3086		msleep(70);3087		break;3088 3089	case EM2860_BOARD_TERRATEC_GRABBY:3090		/*3091		 * HACK?: Ensure AC97 register reading is reliable before3092		 * proceeding. In practice, this will wait about 1.6 seconds.3093		 */3094		em28xx_wait_until_ac97_features_equals(dev, 0x6a90);3095		break;3096	}3097 3098	em28xx_gpio_set(dev, dev->board.tuner_gpio);3099	em28xx_set_mode(dev, EM28XX_ANALOG_MODE);3100 3101	/* Unlock device */3102	em28xx_set_mode(dev, EM28XX_SUSPEND);3103}3104 3105static int em28xx_hint_board(struct em28xx *dev)3106{3107	int i;3108 3109	if (dev->is_webcam) {3110		if (dev->em28xx_sensor == EM28XX_MT9V011) {3111			dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;3112		} else if (dev->em28xx_sensor == EM28XX_MT9M001 ||3113			   dev->em28xx_sensor == EM28XX_MT9M111) {3114			dev->model = EM2750_BOARD_UNKNOWN;3115		}3116		/* FIXME: IMPROVE ! */3117 3118		return 0;3119	}3120 3121	/*3122	 * HINT method: EEPROM3123	 *3124	 * This method works only for boards with eeprom.3125	 * Uses a hash of all eeprom bytes. The hash should be3126	 * unique for a vendor/tuner pair.3127	 * There are a high chance that tuners for different3128	 * video standards produce different hashes.3129	 */3130	for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {3131		if (dev->hash == em28xx_eeprom_hash[i].hash) {3132			dev->model = em28xx_eeprom_hash[i].model;3133			dev->tuner_type = em28xx_eeprom_hash[i].tuner;3134 3135			dev_err(&dev->intf->dev,3136				"Your board has no unique USB ID.\n"3137				"A hint were successfully done, based on eeprom hash.\n"3138				"This method is not 100%% failproof.\n"3139				"If the board were misdetected, please email this log to:\n"3140				"\tV4L Mailing List  <linux-media@vger.kernel.org>\n"3141				"Board detected as %s\n",3142			       em28xx_boards[dev->model].name);3143 3144			return 0;3145		}3146	}3147 3148	/*3149	 * HINT method: I2C attached devices3150	 *3151	 * This method works for all boards.3152	 * Uses a hash of i2c scanned devices.3153	 * Devices with the same i2c attached chips will3154	 * be considered equal.3155	 * This method is less precise than the eeprom one.3156	 */3157 3158	/* user did not request i2c scanning => do it now */3159	if (!dev->i2c_hash)3160		em28xx_do_i2c_scan(dev, dev->def_i2c_bus);3161 3162	for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {3163		if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {3164			dev->model = em28xx_i2c_hash[i].model;3165			dev->tuner_type = em28xx_i2c_hash[i].tuner;3166			dev_err(&dev->intf->dev,3167				"Your board has no unique USB ID.\n"3168				"A hint were successfully done, based on i2c devicelist hash.\n"3169				"This method is not 100%% failproof.\n"3170				"If the board were misdetected, please email this log to:\n"3171				"\tV4L Mailing List  <linux-media@vger.kernel.org>\n"3172				"Board detected as %s\n",3173				em28xx_boards[dev->model].name);3174 3175			return 0;3176		}3177	}3178 3179	dev_err(&dev->intf->dev,3180		"Your board has no unique USB ID and thus need a hint to be detected.\n"3181		"You may try to use card=<n> insmod option to workaround that.\n"3182		"Please send an email with this log to:\n"3183		"\tV4L Mailing List <linux-media@vger.kernel.org>\n"3184		"Board eeprom hash is 0x%08lx\n"3185		"Board i2c devicelist hash is 0x%08lx\n",3186		dev->hash, dev->i2c_hash);3187 3188	dev_err(&dev->intf->dev,3189		"Here is a list of valid choices for the card=<n> insmod option:\n");3190	for (i = 0; i < em28xx_bcount; i++) {3191		dev_err(&dev->intf->dev,3192			"    card=%d -> %s\n", i, em28xx_boards[i].name);3193	}3194	return -1;3195}3196 3197static void em28xx_card_setup(struct em28xx *dev)3198{3199	int i, j, idx;3200	bool duplicate_entry;3201 3202	/*3203	 * If the device can be a webcam, seek for a sensor.3204	 * If sensor is not found, then it isn't a webcam.3205	 */3206	if (dev->is_webcam) {3207		em28xx_detect_sensor(dev);3208		if (dev->em28xx_sensor == EM28XX_NOSENSOR)3209			/* NOTE: error/unknown sensor/no sensor */3210			dev->is_webcam = 0;3211	}3212 3213	switch (dev->model) {3214	case EM2750_BOARD_UNKNOWN:3215	case EM2820_BOARD_UNKNOWN:3216	case EM2800_BOARD_UNKNOWN:3217		/*3218		 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.3219		 *3220		 * This occurs because they share identical USB vendor and3221		 * product IDs.3222		 *3223		 * What we do here is look up the EEPROM hash of the K-WORLD3224		 * and if it is found then we decide that we do not have3225		 * a DIGIVOX and reset the device to the K-WORLD instead.3226		 *3227		 * This solution is only valid if they do not share eeprom3228		 * hash identities which has not been determined as yet.3229		 */3230		if (em28xx_hint_board(dev) < 0) {3231			dev_err(&dev->intf->dev, "Board not discovered\n");3232		} else {3233			em28xx_set_model(dev);3234			em28xx_pre_card_setup(dev);3235		}3236		break;3237	default:3238		em28xx_set_model(dev);3239	}3240 3241	dev_info(&dev->intf->dev, "Identified as %s (card=%d)\n",3242		 dev->board.name, dev->model);3243 3244	dev->tuner_type = em28xx_boards[dev->model].tuner_type;3245 3246	/* request some modules */3247	switch (dev->model) {3248	case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:3249	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:3250	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:3251	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:3252	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:3253	case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:3254	case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB:3255	case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595:3256	{3257		struct tveeprom tv;3258 3259		if (!dev->eedata)3260			break;3261#if defined(CONFIG_MODULES) && defined(MODULE)3262		request_module("tveeprom");3263#endif3264		/* Call first TVeeprom */3265 3266		tveeprom_hauppauge_analog(&tv, dev->eedata);3267 3268		dev->tuner_type = tv.tuner_type;3269 3270		if (tv.audio_processor == TVEEPROM_AUDPROC_MSP) {3271			dev->i2s_speed = 2048000;3272			dev->has_msp34xx = 1;3273		}3274		break;3275	}3276	case EM2882_BOARD_KWORLD_ATSC_315U:3277		em28xx_write_reg(dev, 0x0d, 0x42);3278		usleep_range(10000, 11000);3279		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);3280		usleep_range(10000, 11000);3281		break;3282	case EM2820_BOARD_KWORLD_PVRTV2800RF:3283		/* GPIO enables sound on KWORLD PVR TV 2800RF */3284		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf9);3285		break;3286	case EM2820_BOARD_UNKNOWN:3287	case EM2800_BOARD_UNKNOWN:3288		/*3289		 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.3290		 *3291		 * This occurs because they share identical USB vendor and3292		 * product IDs.3293		 *3294		 * What we do here is look up the EEPROM hash of the K-WORLD3295		 * and if it is found then we decide that we do not have3296		 * a DIGIVOX and reset the device to the K-WORLD instead.3297		 *3298		 * This solution is only valid if they do not share eeprom3299		 * hash identities which has not been determined as yet.3300		 */3301	case EM2880_BOARD_MSI_DIGIVOX_AD:3302		if (!em28xx_hint_board(dev))3303			em28xx_set_model(dev);3304 3305		/*3306		 * In cases where we had to use a board hint, the call to3307		 * em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,3308		 * so make the call now so the analog GPIOs are set properly3309		 * before probing the i2c bus.3310		 */3311		em28xx_gpio_set(dev, dev->board.tuner_gpio);3312		em28xx_set_mode(dev, EM28XX_ANALOG_MODE);3313		break;3314 3315		/*3316		 * The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR.3317		 *3318		 * This occurs because they share identical USB vendor and3319		 * product IDs.3320		 *3321		 * What we do here is look up the EEPROM hash of the Dikom3322		 * and if it is found then we decide that we do not have3323		 * a Kworld and reset the device to the Dikom instead.3324		 *3325		 * This solution is only valid if they do not share eeprom3326		 * hash identities which has not been determined as yet.3327		 */3328	case EM2882_BOARD_KWORLD_VS_DVBT:3329		if (!em28xx_hint_board(dev))3330			em28xx_set_model(dev);3331 3332		/*3333		 * In cases where we had to use a board hint, the call to3334		 * em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,3335		 * so make the call now so the analog GPIOs are set properly3336		 * before probing the i2c bus.3337		 */3338		em28xx_gpio_set(dev, dev->board.tuner_gpio);3339		em28xx_set_mode(dev, EM28XX_ANALOG_MODE);3340		break;3341	}3342 3343	if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {3344		dev_err(&dev->intf->dev,3345			"\n\n"3346			"The support for this board weren't valid yet.\n"3347			"Please send a report of having this working\n"3348			"not to V4L mailing list (and/or to other addresses)\n\n");3349	}3350 3351	/* Free eeprom data memory */3352	kfree(dev->eedata);3353	dev->eedata = NULL;3354 3355	/* Allow override tuner type by a module parameter */3356	if (tuner >= 0)3357		dev->tuner_type = tuner;3358 3359	/*3360	 * Dynamically generate a list of valid audio inputs for this3361	 * specific board, mapping them via enum em28xx_amux.3362	 */3363 3364	idx = 0;3365	for (i = 0; i < MAX_EM28XX_INPUT; i++) {3366		if (!INPUT(i)->type)3367			continue;3368 3369		/* Skip already mapped audio inputs */3370		duplicate_entry = false;3371		for (j = 0; j < idx; j++) {3372			if (INPUT(i)->amux == dev->amux_map[j]) {3373				duplicate_entry = true;3374				break;3375			}3376		}3377		if (duplicate_entry)3378			continue;3379 3380		dev->amux_map[idx++] = INPUT(i)->amux;3381	}3382	for (; idx < MAX_EM28XX_INPUT; idx++)3383		dev->amux_map[idx] = EM28XX_AMUX_UNUSED;3384}3385 3386void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)3387{3388	memset(ctl, 0, sizeof(*ctl));3389 3390	ctl->fname   = XC2028_DEFAULT_FIRMWARE;3391	ctl->max_len = 64;3392	ctl->mts = em28xx_boards[dev->model].mts_firmware;3393 3394	switch (dev->model) {3395	case EM2880_BOARD_EMPIRE_DUAL_TV:3396	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:3397	case EM2882_BOARD_TERRATEC_HYBRID_XS:3398	case EM2880_BOARD_TERRATEC_HYBRID_XS:3399	case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:3400	case EM2881_BOARD_PINNACLE_HYBRID_PRO:3401	case EM2882_BOARD_ZOLID_HYBRID_TV_STICK:3402		ctl->demod = XC3028_FE_ZARLINK456;3403		break;3404	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:3405	case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:3406		ctl->demod = XC3028_FE_DEFAULT;3407		break;3408	case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:3409		ctl->demod = XC3028_FE_DEFAULT;3410		ctl->fname = XC3028L_DEFAULT_FIRMWARE;3411		break;3412	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:3413	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:3414	case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:3415		/* FIXME: Better to specify the needed IF */3416		ctl->demod = XC3028_FE_DEFAULT;3417		break;3418	case EM2883_BOARD_KWORLD_HYBRID_330U:3419	case EM2882_BOARD_DIKOM_DK300:3420	case EM2882_BOARD_KWORLD_VS_DVBT:3421		ctl->demod = XC3028_FE_CHINA;3422		ctl->fname = XC2028_DEFAULT_FIRMWARE;3423		break;3424	case EM2882_BOARD_EVGA_INDTUBE:3425		ctl->demod = XC3028_FE_CHINA;3426		ctl->fname = XC3028L_DEFAULT_FIRMWARE;3427		break;3428	default:3429		ctl->demod = XC3028_FE_OREN538;3430	}3431}3432EXPORT_SYMBOL_GPL(em28xx_setup_xc3028);3433 3434static void request_module_async(struct work_struct *work)3435{3436	struct em28xx *dev = container_of(work,3437			     struct em28xx, request_module_wk);3438 3439	/*3440	 * The em28xx extensions can be modules or builtin. If the3441	 * modules are already loaded or are built in, those extensions3442	 * can be initialised right now. Otherwise, the module init3443	 * code will do it.3444	 */3445 3446	/*3447	 * Devices with an audio-only intf also have a V4L/DVB/RC3448	 * intf. Don't register extensions twice on those devices.3449	 */3450	if (dev->is_audio_only) {3451#if defined(CONFIG_MODULES) && defined(MODULE)3452		request_module("em28xx-alsa");3453#endif3454		return;3455	}3456 3457	em28xx_init_extension(dev);3458 3459#if defined(CONFIG_MODULES) && defined(MODULE)3460	if (dev->has_video)3461		request_module("em28xx-v4l");3462	if (dev->usb_audio_type == EM28XX_USB_AUDIO_CLASS)3463		request_module("snd-usb-audio");3464	else if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)3465		request_module("em28xx-alsa");3466	if (dev->board.has_dvb)3467		request_module("em28xx-dvb");3468	if (dev->board.buttons ||3469	    ((dev->board.ir_codes || dev->board.has_ir_i2c) && !disable_ir))3470		request_module("em28xx-rc");3471#endif /* CONFIG_MODULES */3472}3473 3474static void request_modules(struct em28xx *dev)3475{3476	INIT_WORK(&dev->request_module_wk, request_module_async);3477	schedule_work(&dev->request_module_wk);3478}3479 3480static void flush_request_modules(struct em28xx *dev)3481{3482	flush_work(&dev->request_module_wk);3483}3484 3485static int em28xx_media_device_init(struct em28xx *dev,3486				    struct usb_device *udev)3487{3488#ifdef CONFIG_MEDIA_CONTROLLER3489	struct media_device *mdev;3490 3491	mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);3492	if (!mdev)3493		return -ENOMEM;3494 3495	if (udev->product)3496		media_device_usb_init(mdev, udev, udev->product);3497	else if (udev->manufacturer)3498		media_device_usb_init(mdev, udev, udev->manufacturer);3499	else3500		media_device_usb_init(mdev, udev, dev_name(&dev->intf->dev));3501 3502	dev->media_dev = mdev;3503#endif3504	return 0;3505}3506 3507static void em28xx_unregister_media_device(struct em28xx *dev)3508{3509#ifdef CONFIG_MEDIA_CONTROLLER3510	if (dev->media_dev) {3511		media_device_unregister(dev->media_dev);3512		media_device_cleanup(dev->media_dev);3513		kfree(dev->media_dev);3514		dev->media_dev = NULL;3515	}3516#endif3517}3518 3519/*3520 * em28xx_release_resources()3521 * unregisters the v4l2,i2c and usb devices3522 * called when the device gets disconnected or at module unload3523 */3524static void em28xx_release_resources(struct em28xx *dev)3525{3526	struct usb_device *udev = interface_to_usbdev(dev->intf);3527 3528	/*FIXME: I2C IR should be disconnected */3529 3530	mutex_lock(&dev->lock);3531 3532	em28xx_unregister_media_device(dev);3533 3534	if (dev->def_i2c_bus)3535		em28xx_i2c_unregister(dev, 1);3536	em28xx_i2c_unregister(dev, 0);3537 3538	if (dev->ts == PRIMARY_TS)3539		usb_put_dev(udev);3540 3541	/* Mark device as unused */3542	clear_bit(dev->devno, em28xx_devused);3543 3544	mutex_unlock(&dev->lock);3545};3546 3547/**3548 * em28xx_free_device() - Free em28xx device3549 *3550 * @ref: struct kref for em28xx device3551 *3552 * This is called when all extensions and em28xx core unregisters a device3553 */3554void em28xx_free_device(struct kref *ref)3555{3556	struct em28xx *dev = kref_to_dev(ref);3557 3558	dev_info(&dev->intf->dev, "Freeing device\n");3559 3560	if (!dev->disconnected)3561		em28xx_release_resources(dev);3562 3563	if (dev->ts == PRIMARY_TS)3564		kfree(dev->alt_max_pkt_size_isoc);3565 3566	kfree(dev);3567}3568EXPORT_SYMBOL_GPL(em28xx_free_device);3569 3570/*3571 * em28xx_init_dev()3572 * allocates and inits the device structs, registers i2c bus and v4l device3573 */3574static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,3575			   struct usb_interface *intf,3576			   int minor)3577{3578	int retval;3579	const char *chip_name = NULL;3580 3581	dev->intf = intf;3582	mutex_init(&dev->ctrl_urb_lock);3583	spin_lock_init(&dev->slock);3584 3585	dev->em28xx_write_regs = em28xx_write_regs;3586	dev->em28xx_read_reg = em28xx_read_reg;3587	dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;3588	dev->em28xx_write_regs_req = em28xx_write_regs_req;3589	dev->em28xx_read_reg_req = em28xx_read_reg_req;3590	dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;3591 3592	em28xx_set_model(dev);3593 3594	dev->wait_after_write = 5;3595 3596	/* Based on the Chip ID, set the device configuration */3597	retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);3598	if (retval > 0) {3599		dev->chip_id = retval;3600 3601		switch (dev->chip_id) {3602		case CHIP_ID_EM2800:3603			chip_name = "em2800";3604			break;3605		case CHIP_ID_EM2710:3606			chip_name = "em2710";3607			break;3608		case CHIP_ID_EM2750:3609			chip_name = "em2750";3610			break;3611		case CHIP_ID_EM2765:3612			chip_name = "em2765";3613			dev->wait_after_write = 0;3614			dev->is_em25xx = 1;3615			dev->eeprom_addrwidth_16bit = 1;3616			break;3617		case CHIP_ID_EM2820:3618			chip_name = "em2710/2820";3619			if (le16_to_cpu(udev->descriptor.idVendor) == 0xeb1a) {3620				__le16 idProd = udev->descriptor.idProduct;3621 3622				if (le16_to_cpu(idProd) == 0x2710)3623					chip_name = "em2710";3624				else if (le16_to_cpu(idProd) == 0x2820)3625					chip_name = "em2820";3626			}3627			/* NOTE: the em2820 is used in webcams, too ! */3628			break;3629		case CHIP_ID_EM2840:3630			chip_name = "em2840";3631			break;3632		case CHIP_ID_EM2860:3633			chip_name = "em2860";3634			break;3635		case CHIP_ID_EM2870:3636			chip_name = "em2870";3637			dev->wait_after_write = 0;3638			break;3639		case CHIP_ID_EM2874:3640			chip_name = "em2874";3641			dev->wait_after_write = 0;3642			dev->eeprom_addrwidth_16bit = 1;3643			break;3644		case CHIP_ID_EM28174:3645			chip_name = "em28174";3646			dev->wait_after_write = 0;3647			dev->eeprom_addrwidth_16bit = 1;3648			break;3649		case CHIP_ID_EM28178:3650			chip_name = "em28178";3651			dev->wait_after_write = 0;3652			dev->eeprom_addrwidth_16bit = 1;3653			break;3654		case CHIP_ID_EM2883:3655			chip_name = "em2882/3";3656			dev->wait_after_write = 0;3657			break;3658		case CHIP_ID_EM2884:3659			chip_name = "em2884";3660			dev->wait_after_write = 0;3661			dev->eeprom_addrwidth_16bit = 1;3662			break;3663		}3664	}3665	if (!chip_name)3666		dev_info(&dev->intf->dev,3667			 "unknown em28xx chip ID (%d)\n", dev->chip_id);3668	else3669		dev_info(&dev->intf->dev, "chip ID is %s\n", chip_name);3670 3671	em28xx_media_device_init(dev, udev);3672 3673	if (dev->is_audio_only) {3674		retval = em28xx_audio_setup(dev);3675		if (retval) {3676			retval = -ENODEV;3677			goto err_deinit_media;3678		}3679		em28xx_init_extension(dev);3680 3681		return 0;3682	}3683 3684	em28xx_pre_card_setup(dev);3685 3686	rt_mutex_init(&dev->i2c_bus_lock);3687 3688	/* register i2c bus 0 */3689	if (dev->board.is_em2800)3690		retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM2800);3691	else3692		retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM28XX);3693	if (retval < 0) {3694		dev_err(&dev->intf->dev,3695			"%s: em28xx_i2c_register bus 0 - error [%d]!\n",3696		       __func__, retval);3697		goto err_deinit_media;3698	}3699 3700	/* register i2c bus 1 */3701	if (dev->def_i2c_bus) {3702		if (dev->is_em25xx)3703			retval = em28xx_i2c_register(dev, 1,3704						     EM28XX_I2C_ALGO_EM25XX_BUS_B);3705		else3706			retval = em28xx_i2c_register(dev, 1,3707						     EM28XX_I2C_ALGO_EM28XX);3708		if (retval < 0) {3709			dev_err(&dev->intf->dev,3710				"%s: em28xx_i2c_register bus 1 - error [%d]!\n",3711				__func__, retval);3712 3713			goto err_unreg_i2c;3714		}3715	}3716 3717	/* Do board specific init and eeprom reading */3718	em28xx_card_setup(dev);3719 3720	return 0;3721 3722err_unreg_i2c:3723	em28xx_i2c_unregister(dev, 0);3724err_deinit_media:3725	em28xx_unregister_media_device(dev);3726	return retval;3727}3728 3729static int em28xx_duplicate_dev(struct em28xx *dev)3730{3731	int nr;3732	struct em28xx *sec_dev = kmemdup(dev, sizeof(*sec_dev), GFP_KERNEL);3733 3734	if (!sec_dev) {3735		dev->dev_next = NULL;3736		return -ENOMEM;3737	}3738	/* Check to see next free device and mark as used */3739	do {3740		nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);3741		if (nr >= EM28XX_MAXBOARDS) {3742			/* No free device slots */3743			dev_warn(&dev->intf->dev, ": Supports only %i em28xx boards.\n",3744				 EM28XX_MAXBOARDS);3745			kfree(sec_dev);3746			dev->dev_next = NULL;3747			return -ENOMEM;3748		}3749	} while (test_and_set_bit(nr, em28xx_devused));3750	sec_dev->devno = nr;3751	snprintf(sec_dev->name, 28, "em28xx #%d", nr);3752	sec_dev->dev_next = NULL;3753	dev->dev_next = sec_dev;3754	return 0;3755}3756 3757/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */3758#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))3759 3760static void em28xx_check_usb_descriptor(struct em28xx *dev,3761					struct usb_device *udev,3762					struct usb_interface *intf,3763					int alt, int ep,3764					bool *has_vendor_audio,3765					bool *has_video,3766					bool *has_dvb)3767{3768	const struct usb_endpoint_descriptor *e;3769	int sizedescr, size;3770 3771	/*3772	 * NOTE:3773	 *3774	 * Old logic with support for isoc transfers only was:3775	 *  0x82	isoc		=> analog3776	 *  0x83	isoc		=> audio3777	 *  0x84	isoc		=> digital3778	 *3779	 * New logic with support for bulk transfers3780	 *  0x82	isoc		=> analog3781	 *  0x82	bulk		=> analog3782	 *  0x83	isoc*		=> audio3783	 *  0x84	isoc		=> digital3784	 *  0x84	bulk		=> analog or digital**3785	 *  0x85	isoc		=> digital TS23786	 *  0x85	bulk		=> digital TS23787	 * (*: audio should always be isoc)3788	 * (**: analog, if ep 0x82 is isoc, otherwise digital)3789	 *3790	 * The new logic preserves backwards compatibility and3791	 * reflects the endpoint configurations we have seen3792	 * so far. But there might be devices for which this3793	 * logic is not sufficient...3794	 */3795 3796	e = &intf->altsetting[alt].endpoint[ep].desc;3797 3798	if (!usb_endpoint_dir_in(e))3799		return;3800 3801	sizedescr = le16_to_cpu(e->wMaxPacketSize);3802	size = sizedescr & 0x7ff;3803 3804	if (udev->speed == USB_SPEED_HIGH)3805		size = size * hb_mult(sizedescr);3806 3807	/* Only inspect input endpoints */3808 3809	switch (e->bEndpointAddress) {3810	case 0x82:3811		*has_video = true;3812		if (usb_endpoint_xfer_isoc(e)) {3813			dev->analog_ep_isoc = e->bEndpointAddress;3814			dev->alt_max_pkt_size_isoc[alt] = size;3815		} else if (usb_endpoint_xfer_bulk(e)) {3816			dev->analog_ep_bulk = e->bEndpointAddress;3817		}3818		return;3819	case 0x83:3820		if (usb_endpoint_xfer_isoc(e))3821			*has_vendor_audio = true;3822		else3823			dev_err(&intf->dev,3824				"error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");3825		return;3826	case 0x84:3827		if (*has_video && (usb_endpoint_xfer_bulk(e))) {3828			dev->analog_ep_bulk = e->bEndpointAddress;3829		} else {3830			if (usb_endpoint_xfer_isoc(e)) {3831				if (size > dev->dvb_max_pkt_size_isoc) {3832					/*3833					 * 2) some manufacturers (e.g. Terratec)3834					 * disable endpoints by setting3835					 * wMaxPacketSize to 0 bytes for all3836					 * alt settings. So far, we've seen3837					 * this for DVB isoc endpoints only.3838					 */3839					*has_dvb = true;3840					dev->dvb_ep_isoc = e->bEndpointAddress;3841					dev->dvb_max_pkt_size_isoc = size;3842					dev->dvb_alt_isoc = alt;3843				}3844			} else {3845				*has_dvb = true;3846				dev->dvb_ep_bulk = e->bEndpointAddress;3847			}3848		}3849		return;3850	case 0x85:3851		if (usb_endpoint_xfer_isoc(e)) {3852			if (size > dev->dvb_max_pkt_size_isoc_ts2) {3853				dev->dvb_ep_isoc_ts2 = e->bEndpointAddress;3854				dev->dvb_max_pkt_size_isoc_ts2 = size;3855				dev->dvb_alt_isoc = alt;3856			}3857		} else {3858			dev->dvb_ep_bulk_ts2 = e->bEndpointAddress;3859		}3860		return;3861	}3862}3863 3864/*3865 * em28xx_usb_probe()3866 * checks for supported devices3867 */3868static int em28xx_usb_probe(struct usb_interface *intf,3869			    const struct usb_device_id *id)3870{3871	struct usb_device *udev;3872	struct em28xx *dev = NULL;3873	int retval;3874	bool has_vendor_audio = false, has_video = false, has_dvb = false;3875	int i, nr, try_bulk;3876	const int ifnum = intf->altsetting[0].desc.bInterfaceNumber;3877	char *speed;3878 3879	udev = usb_get_dev(interface_to_usbdev(intf));3880 3881	/* Check to see next free device and mark as used */3882	do {3883		nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);3884		if (nr >= EM28XX_MAXBOARDS) {3885			/* No free device slots */3886			dev_err(&intf->dev,3887				"Driver supports up to %i em28xx boards.\n",3888			       EM28XX_MAXBOARDS);3889			retval = -ENOMEM;3890			goto err_no_slot;3891		}3892	} while (test_and_set_bit(nr, em28xx_devused));3893 3894	/* Don't register audio interfaces */3895	if (intf->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {3896		dev_info(&intf->dev,3897			"audio device (%04x:%04x): interface %i, class %i\n",3898			le16_to_cpu(udev->descriptor.idVendor),3899			le16_to_cpu(udev->descriptor.idProduct),3900			ifnum,3901			intf->altsetting[0].desc.bInterfaceClass);3902 3903		retval = -ENODEV;3904		goto err;3905	}3906 3907	/* allocate memory for our device state and initialize it */3908	dev = kzalloc(sizeof(*dev), GFP_KERNEL);3909	if (!dev) {3910		retval = -ENOMEM;3911		goto err;3912	}3913 3914	/* compute alternate max packet sizes */3915	dev->alt_max_pkt_size_isoc = kcalloc(intf->num_altsetting,3916					     sizeof(dev->alt_max_pkt_size_isoc[0]),3917					     GFP_KERNEL);3918	if (!dev->alt_max_pkt_size_isoc) {3919		kfree(dev);3920		retval = -ENOMEM;3921		goto err;3922	}3923 3924	/* Get endpoints */3925	for (i = 0; i < intf->num_altsetting; i++) {3926		int ep;3927 3928		for (ep = 0;3929		     ep < intf->altsetting[i].desc.bNumEndpoints;3930		     ep++)3931			em28xx_check_usb_descriptor(dev, udev, intf,3932						    i, ep,3933						    &has_vendor_audio,3934						    &has_video,3935						    &has_dvb);3936	}3937 3938	if (!(has_vendor_audio || has_video || has_dvb)) {3939		retval = -ENODEV;3940		goto err_free;3941	}3942 3943	switch (udev->speed) {3944	case USB_SPEED_LOW:3945		speed = "1.5";3946		break;3947	case USB_SPEED_UNKNOWN:3948	case USB_SPEED_FULL:3949		speed = "12";3950		break;3951	case USB_SPEED_HIGH:3952		speed = "480";3953		break;3954	default:3955		speed = "unknown";3956	}3957 3958	dev_info(&intf->dev,3959		"New device %s %s @ %s Mbps (%04x:%04x, interface %d, class %d)\n",3960		udev->manufacturer ? udev->manufacturer : "",3961		udev->product ? udev->product : "",3962		speed,3963		le16_to_cpu(udev->descriptor.idVendor),3964		le16_to_cpu(udev->descriptor.idProduct),3965		ifnum,3966		intf->altsetting->desc.bInterfaceNumber);3967 3968	/*3969	 * Make sure we have 480 Mbps of bandwidth, otherwise things like3970	 * video stream wouldn't likely work, since 12 Mbps is generally3971	 * not enough even for most Digital TV streams.3972	 */3973	if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {3974		dev_err(&intf->dev, "Device initialization failed.\n");3975		dev_err(&intf->dev,3976			"Device must be connected to a high-speed USB 2.0 port.\n");3977		retval = -ENODEV;3978		goto err_free;3979	}3980 3981	kref_init(&dev->ref);3982 3983	dev->devno = nr;3984	dev->model = id->driver_info;3985	dev->alt   = -1;3986	dev->is_audio_only = has_vendor_audio && !(has_video || has_dvb);3987	dev->has_video = has_video;3988	dev->ifnum = ifnum;3989 3990	dev->ts = PRIMARY_TS;3991	snprintf(dev->name, 28, "em28xx");3992	dev->dev_next = NULL;3993 3994	if (has_vendor_audio) {3995		dev_info(&intf->dev,3996			"Audio interface %i found (Vendor Class)\n", ifnum);3997		dev->usb_audio_type = EM28XX_USB_AUDIO_VENDOR;3998	}3999	/* Checks if audio is provided by a USB Audio Class intf */4000	for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {4001		struct usb_interface *uif = udev->config->interface[i];4002 4003		if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {4004			if (has_vendor_audio)4005				dev_err(&intf->dev,4006					"em28xx: device seems to have vendor AND usb audio class interfaces !\n"4007					"\t\tThe vendor interface will be ignored. Please contact the developers <linux-media@vger.kernel.org>\n");4008			dev->usb_audio_type = EM28XX_USB_AUDIO_CLASS;4009			break;4010		}4011	}4012 4013	if (has_video)4014		dev_info(&intf->dev, "Video interface %i found:%s%s\n",4015			ifnum,4016			dev->analog_ep_bulk ? " bulk" : "",4017			dev->analog_ep_isoc ? " isoc" : "");4018	if (has_dvb)4019		dev_info(&intf->dev, "DVB interface %i found:%s%s\n",4020			ifnum,4021			dev->dvb_ep_bulk ? " bulk" : "",4022			dev->dvb_ep_isoc ? " isoc" : "");4023 4024	dev->num_alt = intf->num_altsetting;4025 4026	if ((unsigned int)card[nr] < em28xx_bcount)4027		dev->model = card[nr];4028 4029	/* save our data pointer in this intf device */4030	usb_set_intfdata(intf, dev);4031 4032	/* allocate device struct and check if the device is a webcam */4033	mutex_init(&dev->lock);4034	retval = em28xx_init_dev(dev, udev, intf, nr);4035	if (retval)4036		goto err_free;4037 4038	if (usb_xfer_mode < 0) {4039		if (dev->is_webcam)4040			try_bulk = 1;4041		else4042			try_bulk = 0;4043	} else {4044		try_bulk = usb_xfer_mode > 0;4045	}4046 4047	/* Disable V4L2 if the device doesn't have a decoder or image sensor */4048	if (has_video &&4049	    dev->board.decoder == EM28XX_NODECODER &&4050	    dev->em28xx_sensor == EM28XX_NOSENSOR) {4051		dev_err(&intf->dev,4052			"Currently, V4L2 is not supported on this model\n");4053		has_video = false;4054		dev->has_video = false;4055	}4056 4057	if (dev->board.has_dual_ts &&4058	    (dev->tuner_type != TUNER_ABSENT || INPUT(0)->type)) {4059		/*4060		 * The logic with sets alternate is not ready for dual-tuners4061		 * which analog modes.4062		 */4063		dev_err(&intf->dev,4064			"We currently don't support analog TV or stream capture on dual tuners.\n");4065		has_video = false;4066	}4067 4068	/* Select USB transfer types to use */4069	if (has_video) {4070		if (!dev->analog_ep_isoc || (try_bulk && dev->analog_ep_bulk))4071			dev->analog_xfer_bulk = 1;4072		dev_info(&intf->dev, "analog set to %s mode.\n",4073			dev->analog_xfer_bulk ? "bulk" : "isoc");4074	}4075	if (has_dvb) {4076		if (!dev->dvb_ep_isoc || (try_bulk && dev->dvb_ep_bulk))4077			dev->dvb_xfer_bulk = 1;4078		dev_info(&intf->dev, "dvb set to %s mode.\n",4079			dev->dvb_xfer_bulk ? "bulk" : "isoc");4080	}4081 4082	if (dev->board.has_dual_ts && em28xx_duplicate_dev(dev) == 0) {4083		kref_init(&dev->dev_next->ref);4084 4085		dev->dev_next->ts = SECONDARY_TS;4086		dev->dev_next->alt   = -1;4087		dev->dev_next->is_audio_only = has_vendor_audio &&4088						!(has_video || has_dvb);4089		dev->dev_next->has_video = false;4090		dev->dev_next->ifnum = ifnum;4091		dev->dev_next->model = id->driver_info;4092 4093		mutex_init(&dev->dev_next->lock);4094		retval = em28xx_init_dev(dev->dev_next, udev, intf,4095					 dev->dev_next->devno);4096		if (retval)4097			goto err_free;4098 4099		dev->dev_next->board.ir_codes = NULL; /* No IR for 2nd tuner */4100		dev->dev_next->board.has_ir_i2c = 0; /* No IR for 2nd tuner */4101 4102		if (usb_xfer_mode < 0) {4103			if (dev->dev_next->is_webcam)4104				try_bulk = 1;4105			else4106				try_bulk = 0;4107		} else {4108			try_bulk = usb_xfer_mode > 0;4109		}4110 4111		/* Select USB transfer types to use */4112		if (has_dvb) {4113			if (!dev->dvb_ep_isoc_ts2 ||4114			    (try_bulk && dev->dvb_ep_bulk_ts2))4115				dev->dev_next->dvb_xfer_bulk = 1;4116			dev_info(&dev->intf->dev, "dvb ts2 set to %s mode.\n",4117				 dev->dev_next->dvb_xfer_bulk ? "bulk" : "isoc");4118		}4119 4120		dev->dev_next->dvb_ep_isoc = dev->dvb_ep_isoc_ts2;4121		dev->dev_next->dvb_ep_bulk = dev->dvb_ep_bulk_ts2;4122		dev->dev_next->dvb_max_pkt_size_isoc = dev->dvb_max_pkt_size_isoc_ts2;4123		dev->dev_next->dvb_alt_isoc = dev->dvb_alt_isoc;4124 4125		/* Configure hardware to support TS2*/4126		if (dev->dvb_xfer_bulk) {4127			/* The ep4 and ep5 are configured for BULK */4128			em28xx_write_reg(dev, 0x0b, 0x96);4129			mdelay(100);4130			em28xx_write_reg(dev, 0x0b, 0x80);4131			mdelay(100);4132		} else {4133			/* The ep4 and ep5 are configured for ISO */4134			em28xx_write_reg(dev, 0x0b, 0x96);4135			mdelay(100);4136			em28xx_write_reg(dev, 0x0b, 0x82);4137			mdelay(100);4138		}4139	}4140 4141	request_modules(dev);4142 4143	/*4144	 * Do it at the end, to reduce dynamic configuration changes during4145	 * the device init. Yet, as request_modules() can be async, the4146	 * topology will likely change after the load of the em28xx subdrivers.4147	 */4148#ifdef CONFIG_MEDIA_CONTROLLER4149	/*4150	 * No need to check the return value, the device will still be4151	 * usable without media controller API.4152	 */4153	retval = media_device_register(dev->media_dev);4154#endif4155 4156	return 0;4157 4158err_free:4159	kfree(dev->alt_max_pkt_size_isoc);4160	kfree(dev);4161 4162err:4163	clear_bit(nr, em28xx_devused);4164 4165err_no_slot:4166	usb_put_dev(udev);4167	return retval;4168}4169 4170/*4171 * em28xx_usb_disconnect()4172 * called when the device gets disconnected4173 * video device will be unregistered on v4l2_close in case it is still open4174 */4175static void em28xx_usb_disconnect(struct usb_interface *intf)4176{4177	struct em28xx *dev;4178 4179	dev = usb_get_intfdata(intf);4180	usb_set_intfdata(intf, NULL);4181 4182	if (!dev)4183		return;4184 4185	if (dev->dev_next) {4186		dev->dev_next->disconnected = 1;4187		dev_info(&dev->intf->dev, "Disconnecting %s\n",4188			 dev->dev_next->name);4189	}4190 4191	dev->disconnected = 1;4192 4193	dev_info(&dev->intf->dev, "Disconnecting %s\n", dev->name);4194 4195	flush_request_modules(dev);4196 4197	em28xx_close_extension(dev);4198 4199	if (dev->dev_next)4200		em28xx_release_resources(dev->dev_next);4201	em28xx_release_resources(dev);4202 4203	if (dev->dev_next) {4204		kref_put(&dev->dev_next->ref, em28xx_free_device);4205		dev->dev_next = NULL;4206	}4207	kref_put(&dev->ref, em28xx_free_device);4208}4209 4210static int em28xx_usb_suspend(struct usb_interface *intf,4211			      pm_message_t message)4212{4213	struct em28xx *dev;4214 4215	dev = usb_get_intfdata(intf);4216	if (!dev)4217		return 0;4218	em28xx_suspend_extension(dev);4219	return 0;4220}4221 4222static int em28xx_usb_resume(struct usb_interface *intf)4223{4224	struct em28xx *dev;4225 4226	dev = usb_get_intfdata(intf);4227	if (!dev)4228		return 0;4229	em28xx_resume_extension(dev);4230	return 0;4231}4232 4233static struct usb_driver em28xx_usb_driver = {4234	.name = "em28xx",4235	.probe = em28xx_usb_probe,4236	.disconnect = em28xx_usb_disconnect,4237	.suspend = em28xx_usb_suspend,4238	.resume = em28xx_usb_resume,4239	.reset_resume = em28xx_usb_resume,4240	.id_table = em28xx_id_table,4241};4242 4243module_usb_driver(em28xx_usb_driver);4244