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