em28xx-cards.c revision 3553085cb47b10762e77ca783683dbf8142f9762
1/* 2 em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB 3 video capture devices 4 5 Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it> 6 Markus Rechberger <mrechberger@gmail.com> 7 Mauro Carvalho Chehab <mchehab@infradead.org> 8 Sascha Sommer <saschasommer@freenet.de> 9 10 This program is free software; you can redistribute it and/or modify 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 2 of the License, or 13 (at your option) any later version. 14 15 This program is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU General Public License for more details. 19 20 You should have received a copy of the GNU General Public License 21 along with this program; if not, write to the Free Software 22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 */ 24 25#include <linux/init.h> 26#include <linux/module.h> 27#include <linux/slab.h> 28#include <linux/delay.h> 29#include <linux/i2c.h> 30#include <linux/usb.h> 31#include <media/tuner.h> 32#include <media/msp3400.h> 33#include <media/saa7115.h> 34#include <media/tvp5150.h> 35#include <media/tvaudio.h> 36#include <media/mt9v011.h> 37#include <media/i2c-addr.h> 38#include <media/tveeprom.h> 39#include <media/v4l2-common.h> 40#include <media/v4l2-chip-ident.h> 41 42#include "em28xx.h" 43 44#define DRIVER_NAME "em28xx" 45 46static int tuner = -1; 47module_param(tuner, int, 0444); 48MODULE_PARM_DESC(tuner, "tuner type"); 49 50static unsigned int disable_ir; 51module_param(disable_ir, int, 0444); 52MODULE_PARM_DESC(disable_ir, "disable infrared remote support"); 53 54static unsigned int disable_usb_speed_check; 55module_param(disable_usb_speed_check, int, 0444); 56MODULE_PARM_DESC(disable_usb_speed_check, 57 "override min bandwidth requirement of 480M bps"); 58 59static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; 60module_param_array(card, int, NULL, 0444); 61MODULE_PARM_DESC(card, "card type"); 62 63/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */ 64static unsigned long em28xx_devused; 65 66struct em28xx_hash_table { 67 unsigned long hash; 68 unsigned int model; 69 unsigned int tuner; 70}; 71 72/* 73 * Reset sequences for analog/digital modes 74 */ 75 76/* Reset for the most [analog] boards */ 77static struct em28xx_reg_seq default_analog[] = { 78 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, 79 { -1, -1, -1, -1}, 80}; 81 82/* Reset for the most [digital] boards */ 83static struct em28xx_reg_seq default_digital[] = { 84 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10}, 85 { -1, -1, -1, -1}, 86}; 87 88/* Board Hauppauge WinTV HVR 900 analog */ 89static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = { 90 {EM28XX_R08_GPIO, 0x2d, ~EM_GPIO_4, 10}, 91 {0x05, 0xff, 0x10, 10}, 92 { -1, -1, -1, -1}, 93}; 94 95/* Board Hauppauge WinTV HVR 900 digital */ 96static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = { 97 {EM28XX_R08_GPIO, 0x2e, ~EM_GPIO_4, 10}, 98 {EM2880_R04_GPO, 0x04, 0x0f, 10}, 99 {EM2880_R04_GPO, 0x0c, 0x0f, 10}, 100 { -1, -1, -1, -1}, 101}; 102 103/* Board Hauppauge WinTV HVR 900 (R2) digital */ 104static struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = { 105 {EM28XX_R08_GPIO, 0x2e, ~EM_GPIO_4, 10}, 106 {EM2880_R04_GPO, 0x0c, 0x0f, 10}, 107 { -1, -1, -1, -1}, 108}; 109 110/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */ 111static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = { 112 {EM28XX_R08_GPIO, 0x69, ~EM_GPIO_4, 10}, 113 { -1, -1, -1, -1}, 114}; 115 116/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */ 117 118/* Board - EM2870 Kworld 355u 119 Analog - No input analog */ 120 121/* Board - EM2882 Kworld 315U digital */ 122static struct em28xx_reg_seq em2882_kworld_315u_digital[] = { 123 {EM28XX_R08_GPIO, 0xff, 0xff, 10}, 124 {EM28XX_R08_GPIO, 0xfe, 0xff, 10}, 125 {EM2880_R04_GPO, 0x04, 0xff, 10}, 126 {EM2880_R04_GPO, 0x0c, 0xff, 10}, 127 {EM28XX_R08_GPIO, 0x7e, 0xff, 10}, 128 { -1, -1, -1, -1}, 129}; 130 131static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = { 132 {EM2880_R04_GPO, 0x08, 0xff, 10}, 133 {EM2880_R04_GPO, 0x0c, 0xff, 10}, 134 {EM2880_R04_GPO, 0x08, 0xff, 10}, 135 {EM2880_R04_GPO, 0x0c, 0xff, 10}, 136 { -1, -1, -1, -1}, 137}; 138 139static struct em28xx_reg_seq kworld_330u_analog[] = { 140 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, 141 {EM2880_R04_GPO, 0x00, 0xff, 10}, 142 { -1, -1, -1, -1}, 143}; 144 145static struct em28xx_reg_seq kworld_330u_digital[] = { 146 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10}, 147 {EM2880_R04_GPO, 0x08, 0xff, 10}, 148 { -1, -1, -1, -1}, 149}; 150 151/* Evga inDtube 152 GPIO0 - Enable digital power (s5h1409) - low to enable 153 GPIO1 - Enable analog power (tvp5150/emp202) - low to enable 154 GPIO4 - xc3028 reset 155 GOP3 - s5h1409 reset 156 */ 157static struct em28xx_reg_seq evga_indtube_analog[] = { 158 {EM28XX_R08_GPIO, 0x79, 0xff, 60}, 159 { -1, -1, -1, -1}, 160}; 161 162static struct em28xx_reg_seq evga_indtube_digital[] = { 163 {EM28XX_R08_GPIO, 0x7a, 0xff, 1}, 164 {EM2880_R04_GPO, 0x04, 0xff, 10}, 165 {EM2880_R04_GPO, 0x0c, 0xff, 1}, 166 { -1, -1, -1, -1}, 167}; 168 169/* 170 * KWorld PlusTV 340U and UB435-Q (ATSC) GPIOs map: 171 * EM_GPIO_0 - currently unknown 172 * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on) 173 * EM_GPIO_2 - currently unknown 174 * EM_GPIO_3 - currently unknown 175 * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset) 176 * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset) 177 * EM_GPIO_6 - currently unknown 178 * EM_GPIO_7 - currently unknown 179 */ 180static struct em28xx_reg_seq kworld_a340_digital[] = { 181 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, 182 { -1, -1, -1, -1}, 183}; 184 185/* Pinnacle Hybrid Pro eb1a:2881 */ 186static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = { 187 {EM28XX_R08_GPIO, 0xfd, ~EM_GPIO_4, 10}, 188 { -1, -1, -1, -1}, 189}; 190 191static struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = { 192 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10}, 193 {EM2880_R04_GPO, 0x04, 0xff, 100},/* zl10353 reset */ 194 {EM2880_R04_GPO, 0x0c, 0xff, 1}, 195 { -1, -1, -1, -1}, 196}; 197 198static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = { 199 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, 200 {EM2880_R04_GPO, 0x00, 0xff, 10}, 201 { -1, -1, -1, -1}, 202}; 203 204static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = { 205 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10}, 206 {EM2880_R04_GPO, 0x08, 0xff, 10}, 207 { -1, -1, -1, -1}, 208}; 209 210/* eb1a:2868 Reddo DVB-C USB TV Box 211 GPIO4 - CU1216L NIM 212 Other GPIOs seems to be don't care. */ 213static struct em28xx_reg_seq reddo_dvb_c_usb_box[] = { 214 {EM28XX_R08_GPIO, 0xfe, 0xff, 10}, 215 {EM28XX_R08_GPIO, 0xde, 0xff, 10}, 216 {EM28XX_R08_GPIO, 0xfe, 0xff, 10}, 217 {EM28XX_R08_GPIO, 0xff, 0xff, 10}, 218 {EM28XX_R08_GPIO, 0x7f, 0xff, 10}, 219 {EM28XX_R08_GPIO, 0x6f, 0xff, 10}, 220 {EM28XX_R08_GPIO, 0xff, 0xff, 10}, 221 {-1, -1, -1, -1}, 222}; 223 224/* Callback for the most boards */ 225static struct em28xx_reg_seq default_tuner_gpio[] = { 226 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, 227 {EM28XX_R08_GPIO, 0, EM_GPIO_4, 10}, 228 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, 229 { -1, -1, -1, -1}, 230}; 231 232/* Mute/unmute */ 233static struct em28xx_reg_seq compro_unmute_tv_gpio[] = { 234 {EM28XX_R08_GPIO, 5, 7, 10}, 235 { -1, -1, -1, -1}, 236}; 237 238static struct em28xx_reg_seq compro_unmute_svid_gpio[] = { 239 {EM28XX_R08_GPIO, 4, 7, 10}, 240 { -1, -1, -1, -1}, 241}; 242 243static struct em28xx_reg_seq compro_mute_gpio[] = { 244 {EM28XX_R08_GPIO, 6, 7, 10}, 245 { -1, -1, -1, -1}, 246}; 247 248/* Terratec AV350 */ 249static struct em28xx_reg_seq terratec_av350_mute_gpio[] = { 250 {EM28XX_R08_GPIO, 0xff, 0x7f, 10}, 251 { -1, -1, -1, -1}, 252}; 253 254static struct em28xx_reg_seq terratec_av350_unmute_gpio[] = { 255 {EM28XX_R08_GPIO, 0xff, 0xff, 10}, 256 { -1, -1, -1, -1}, 257}; 258 259static struct em28xx_reg_seq silvercrest_reg_seq[] = { 260 {EM28XX_R08_GPIO, 0xff, 0xff, 10}, 261 {EM28XX_R08_GPIO, 0x01, 0xf7, 10}, 262 { -1, -1, -1, -1}, 263}; 264 265static struct em28xx_reg_seq vc211a_enable[] = { 266 {EM28XX_R08_GPIO, 0xff, 0x07, 10}, 267 {EM28XX_R08_GPIO, 0xff, 0x0f, 10}, 268 {EM28XX_R08_GPIO, 0xff, 0x0b, 10}, 269 { -1, -1, -1, -1}, 270}; 271 272static struct em28xx_reg_seq dikom_dk300_digital[] = { 273 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10}, 274 {EM2880_R04_GPO, 0x08, 0xff, 10}, 275 { -1, -1, -1, -1}, 276}; 277 278 279/* Reset for the most [digital] boards */ 280static struct em28xx_reg_seq leadership_digital[] = { 281 {EM2874_R80_GPIO, 0x70, 0xff, 10}, 282 { -1, -1, -1, -1}, 283}; 284 285static struct em28xx_reg_seq leadership_reset[] = { 286 {EM2874_R80_GPIO, 0xf0, 0xff, 10}, 287 {EM2874_R80_GPIO, 0xb0, 0xff, 10}, 288 {EM2874_R80_GPIO, 0xf0, 0xff, 10}, 289 { -1, -1, -1, -1}, 290}; 291 292/* 2013:024f PCTV nanoStick T2 290e 293 * GPIO_6 - demod reset 294 * GPIO_7 - LED 295 */ 296static struct em28xx_reg_seq pctv_290e[] = { 297 {EM2874_R80_GPIO, 0x00, 0xff, 80}, 298 {EM2874_R80_GPIO, 0x40, 0xff, 80}, /* GPIO_6 = 1 */ 299 {EM2874_R80_GPIO, 0xc0, 0xff, 80}, /* GPIO_7 = 1 */ 300 {-1, -1, -1, -1}, 301}; 302 303#if 0 304static struct em28xx_reg_seq terratec_h5_gpio[] = { 305 {EM28XX_R08_GPIO, 0xff, 0xff, 10}, 306 {EM2874_R80_GPIO, 0xf6, 0xff, 100}, 307 {EM2874_R80_GPIO, 0xf2, 0xff, 50}, 308 {EM2874_R80_GPIO, 0xf6, 0xff, 50}, 309 { -1, -1, -1, -1}, 310}; 311 312static struct em28xx_reg_seq terratec_h5_digital[] = { 313 {EM2874_R80_GPIO, 0xf6, 0xff, 10}, 314 {EM2874_R80_GPIO, 0xe6, 0xff, 100}, 315 {EM2874_R80_GPIO, 0xa6, 0xff, 10}, 316 { -1, -1, -1, -1}, 317}; 318#endif 319 320/* 2013:024f PCTV DVB-S2 Stick 460e 321 * GPIO_0 - POWER_ON 322 * GPIO_1 - BOOST 323 * GPIO_2 - VUV_LNB (red LED) 324 * GPIO_3 - EXT_12V 325 * GPIO_4 - INT_DEM (DEMOD GPIO_0) 326 * GPIO_5 - INT_LNB 327 * GPIO_6 - RESET_DEM 328 * GPIO_7 - LED (green LED) 329 */ 330static struct em28xx_reg_seq pctv_460e[] = { 331 {EM2874_R80_GPIO, 0x01, 0xff, 50}, 332 {0x0d, 0xff, 0xff, 50}, 333 {EM2874_R80_GPIO, 0x41, 0xff, 50}, /* GPIO_6=1 */ 334 {0x0d, 0x42, 0xff, 50}, 335 {EM2874_R80_GPIO, 0x61, 0xff, 50}, /* GPIO_5=1 */ 336 { -1, -1, -1, -1}, 337}; 338 339#if 0 340static struct em28xx_reg_seq hauppauge_930c_gpio[] = { 341 {EM2874_R80_GPIO, 0x6f, 0xff, 10}, 342 {EM2874_R80_GPIO, 0x4f, 0xff, 10}, /* xc5000 reset */ 343 {EM2874_R80_GPIO, 0x6f, 0xff, 10}, 344 {EM2874_R80_GPIO, 0x4f, 0xff, 10}, 345 { -1, -1, -1, -1}, 346}; 347 348static struct em28xx_reg_seq hauppauge_930c_digital[] = { 349 {EM2874_R80_GPIO, 0xf6, 0xff, 10}, 350 {EM2874_R80_GPIO, 0xe6, 0xff, 100}, 351 {EM2874_R80_GPIO, 0xa6, 0xff, 10}, 352 { -1, -1, -1, -1}, 353}; 354#endif 355 356/* 1b80:e425 MaxMedia UB425-TC 357 * GPIO_6 - demod reset, 0=active 358 * GPIO_7 - LED, 0=active 359 */ 360static struct em28xx_reg_seq maxmedia_ub425_tc[] = { 361 {EM2874_R80_GPIO, 0x83, 0xff, 100}, 362 {EM2874_R80_GPIO, 0xc3, 0xff, 100}, /* GPIO_6 = 1 */ 363 {EM2874_R80_GPIO, 0x43, 0xff, 000}, /* GPIO_7 = 0 */ 364 {-1, -1, -1, -1}, 365}; 366 367/* 368 * Board definitions 369 */ 370struct em28xx_board em28xx_boards[] = { 371 [EM2750_BOARD_UNKNOWN] = { 372 .name = "EM2710/EM2750/EM2751 webcam grabber", 373 .xclk = EM28XX_XCLK_FREQUENCY_20MHZ, 374 .tuner_type = TUNER_ABSENT, 375 .is_webcam = 1, 376 .input = { { 377 .type = EM28XX_VMUX_COMPOSITE1, 378 .vmux = 0, 379 .amux = EM28XX_AMUX_VIDEO, 380 .gpio = silvercrest_reg_seq, 381 } }, 382 }, 383 [EM2800_BOARD_UNKNOWN] = { 384 .name = "Unknown EM2800 video grabber", 385 .is_em2800 = 1, 386 .tda9887_conf = TDA9887_PRESENT, 387 .decoder = EM28XX_SAA711X, 388 .tuner_type = TUNER_ABSENT, 389 .input = { { 390 .type = EM28XX_VMUX_COMPOSITE1, 391 .vmux = SAA7115_COMPOSITE0, 392 .amux = EM28XX_AMUX_LINE_IN, 393 }, { 394 .type = EM28XX_VMUX_SVIDEO, 395 .vmux = SAA7115_SVIDEO3, 396 .amux = EM28XX_AMUX_LINE_IN, 397 } }, 398 }, 399 [EM2820_BOARD_UNKNOWN] = { 400 .name = "Unknown EM2750/28xx video grabber", 401 .tuner_type = TUNER_ABSENT, 402 .is_webcam = 1, /* To enable sensor probe */ 403 }, 404 [EM2750_BOARD_DLCW_130] = { 405 /* Beijing Huaqi Information Digital Technology Co., Ltd */ 406 .name = "Huaqi DLCW-130", 407 .valid = EM28XX_BOARD_NOT_VALIDATED, 408 .xclk = EM28XX_XCLK_FREQUENCY_48MHZ, 409 .tuner_type = TUNER_ABSENT, 410 .is_webcam = 1, 411 .input = { { 412 .type = EM28XX_VMUX_COMPOSITE1, 413 .vmux = 0, 414 .amux = EM28XX_AMUX_VIDEO, 415 } }, 416 }, 417 [EM2820_BOARD_KWORLD_PVRTV2800RF] = { 418 .name = "Kworld PVR TV 2800 RF", 419 .tuner_type = TUNER_TEMIC_PAL, 420 .tda9887_conf = TDA9887_PRESENT, 421 .decoder = EM28XX_SAA711X, 422 .input = { { 423 .type = EM28XX_VMUX_COMPOSITE1, 424 .vmux = SAA7115_COMPOSITE0, 425 .amux = EM28XX_AMUX_LINE_IN, 426 }, { 427 .type = EM28XX_VMUX_SVIDEO, 428 .vmux = SAA7115_SVIDEO3, 429 .amux = EM28XX_AMUX_LINE_IN, 430 } }, 431 }, 432 [EM2820_BOARD_GADMEI_TVR200] = { 433 .name = "Gadmei TVR200", 434 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 435 .tda9887_conf = TDA9887_PRESENT, 436 .decoder = EM28XX_SAA711X, 437 .input = { { 438 .type = EM28XX_VMUX_TELEVISION, 439 .vmux = SAA7115_COMPOSITE2, 440 .amux = EM28XX_AMUX_LINE_IN, 441 }, { 442 .type = EM28XX_VMUX_COMPOSITE1, 443 .vmux = SAA7115_COMPOSITE0, 444 .amux = EM28XX_AMUX_LINE_IN, 445 }, { 446 .type = EM28XX_VMUX_SVIDEO, 447 .vmux = SAA7115_SVIDEO3, 448 .amux = EM28XX_AMUX_LINE_IN, 449 } }, 450 }, 451 [EM2820_BOARD_TERRATEC_CINERGY_250] = { 452 .name = "Terratec Cinergy 250 USB", 453 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 454 .has_ir_i2c = 1, 455 .tda9887_conf = TDA9887_PRESENT, 456 .decoder = EM28XX_SAA711X, 457 .input = { { 458 .type = EM28XX_VMUX_TELEVISION, 459 .vmux = SAA7115_COMPOSITE2, 460 .amux = EM28XX_AMUX_LINE_IN, 461 }, { 462 .type = EM28XX_VMUX_COMPOSITE1, 463 .vmux = SAA7115_COMPOSITE0, 464 .amux = EM28XX_AMUX_LINE_IN, 465 }, { 466 .type = EM28XX_VMUX_SVIDEO, 467 .vmux = SAA7115_SVIDEO3, 468 .amux = EM28XX_AMUX_LINE_IN, 469 } }, 470 }, 471 [EM2820_BOARD_PINNACLE_USB_2] = { 472 .name = "Pinnacle PCTV USB 2", 473 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 474 .has_ir_i2c = 1, 475 .tda9887_conf = TDA9887_PRESENT, 476 .decoder = EM28XX_SAA711X, 477 .input = { { 478 .type = EM28XX_VMUX_TELEVISION, 479 .vmux = SAA7115_COMPOSITE2, 480 .amux = EM28XX_AMUX_VIDEO, 481 }, { 482 .type = EM28XX_VMUX_COMPOSITE1, 483 .vmux = SAA7115_COMPOSITE0, 484 .amux = EM28XX_AMUX_LINE_IN, 485 }, { 486 .type = EM28XX_VMUX_SVIDEO, 487 .vmux = SAA7115_SVIDEO3, 488 .amux = EM28XX_AMUX_LINE_IN, 489 } }, 490 }, 491 [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = { 492 .name = "Hauppauge WinTV USB 2", 493 .tuner_type = TUNER_PHILIPS_FM1236_MK3, 494 .tda9887_conf = TDA9887_PRESENT | 495 TDA9887_PORT1_ACTIVE | 496 TDA9887_PORT2_ACTIVE, 497 .decoder = EM28XX_TVP5150, 498 .has_msp34xx = 1, 499 .has_ir_i2c = 1, 500 .input = { { 501 .type = EM28XX_VMUX_TELEVISION, 502 .vmux = TVP5150_COMPOSITE0, 503 .amux = MSP_INPUT_DEFAULT, 504 }, { 505 .type = EM28XX_VMUX_SVIDEO, 506 .vmux = TVP5150_SVIDEO, 507 .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, 508 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART), 509 } }, 510 }, 511 [EM2820_BOARD_DLINK_USB_TV] = { 512 .name = "D-Link DUB-T210 TV Tuner", 513 .valid = EM28XX_BOARD_NOT_VALIDATED, 514 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 515 .tda9887_conf = TDA9887_PRESENT, 516 .decoder = EM28XX_SAA711X, 517 .input = { { 518 .type = EM28XX_VMUX_TELEVISION, 519 .vmux = SAA7115_COMPOSITE2, 520 .amux = EM28XX_AMUX_LINE_IN, 521 }, { 522 .type = EM28XX_VMUX_COMPOSITE1, 523 .vmux = SAA7115_COMPOSITE0, 524 .amux = EM28XX_AMUX_LINE_IN, 525 }, { 526 .type = EM28XX_VMUX_SVIDEO, 527 .vmux = SAA7115_SVIDEO3, 528 .amux = EM28XX_AMUX_LINE_IN, 529 } }, 530 }, 531 [EM2820_BOARD_HERCULES_SMART_TV_USB2] = { 532 .name = "Hercules Smart TV USB 2.0", 533 .valid = EM28XX_BOARD_NOT_VALIDATED, 534 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 535 .tda9887_conf = TDA9887_PRESENT, 536 .decoder = EM28XX_SAA711X, 537 .input = { { 538 .type = EM28XX_VMUX_TELEVISION, 539 .vmux = SAA7115_COMPOSITE2, 540 .amux = EM28XX_AMUX_LINE_IN, 541 }, { 542 .type = EM28XX_VMUX_COMPOSITE1, 543 .vmux = SAA7115_COMPOSITE0, 544 .amux = EM28XX_AMUX_LINE_IN, 545 }, { 546 .type = EM28XX_VMUX_SVIDEO, 547 .vmux = SAA7115_SVIDEO3, 548 .amux = EM28XX_AMUX_LINE_IN, 549 } }, 550 }, 551 [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = { 552 .name = "Pinnacle PCTV USB 2 (Philips FM1216ME)", 553 .valid = EM28XX_BOARD_NOT_VALIDATED, 554 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 555 .tda9887_conf = TDA9887_PRESENT, 556 .decoder = EM28XX_SAA711X, 557 .input = { { 558 .type = EM28XX_VMUX_TELEVISION, 559 .vmux = SAA7115_COMPOSITE2, 560 .amux = EM28XX_AMUX_VIDEO, 561 }, { 562 .type = EM28XX_VMUX_COMPOSITE1, 563 .vmux = SAA7115_COMPOSITE0, 564 .amux = EM28XX_AMUX_LINE_IN, 565 }, { 566 .type = EM28XX_VMUX_SVIDEO, 567 .vmux = SAA7115_SVIDEO3, 568 .amux = EM28XX_AMUX_LINE_IN, 569 } }, 570 }, 571 [EM2820_BOARD_GADMEI_UTV310] = { 572 .name = "Gadmei UTV310", 573 .valid = EM28XX_BOARD_NOT_VALIDATED, 574 .tuner_type = TUNER_TNF_5335MF, 575 .tda9887_conf = TDA9887_PRESENT, 576 .decoder = EM28XX_SAA711X, 577 .input = { { 578 .type = EM28XX_VMUX_TELEVISION, 579 .vmux = SAA7115_COMPOSITE1, 580 .amux = EM28XX_AMUX_LINE_IN, 581 }, { 582 .type = EM28XX_VMUX_COMPOSITE1, 583 .vmux = SAA7115_COMPOSITE0, 584 .amux = EM28XX_AMUX_LINE_IN, 585 }, { 586 .type = EM28XX_VMUX_SVIDEO, 587 .vmux = SAA7115_SVIDEO3, 588 .amux = EM28XX_AMUX_LINE_IN, 589 } }, 590 }, 591 [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = { 592 .name = "Leadtek Winfast USB II Deluxe", 593 .valid = EM28XX_BOARD_NOT_VALIDATED, 594 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 595 .has_ir_i2c = 1, 596 .tvaudio_addr = 0x58, 597 .tda9887_conf = TDA9887_PRESENT | 598 TDA9887_PORT2_ACTIVE | 599 TDA9887_QSS, 600 .decoder = EM28XX_SAA711X, 601 .adecoder = EM28XX_TVAUDIO, 602 .input = { { 603 .type = EM28XX_VMUX_TELEVISION, 604 .vmux = SAA7115_COMPOSITE4, 605 .amux = EM28XX_AMUX_AUX, 606 }, { 607 .type = EM28XX_VMUX_COMPOSITE1, 608 .vmux = SAA7115_COMPOSITE5, 609 .amux = EM28XX_AMUX_LINE_IN, 610 }, { 611 .type = EM28XX_VMUX_SVIDEO, 612 .vmux = SAA7115_SVIDEO3, 613 .amux = EM28XX_AMUX_LINE_IN, 614 } }, 615 .radio = { 616 .type = EM28XX_RADIO, 617 .amux = EM28XX_AMUX_AUX, 618 } 619 }, 620 [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = { 621 .name = "Videology 20K14XUSB USB2.0", 622 .valid = EM28XX_BOARD_NOT_VALIDATED, 623 .tuner_type = TUNER_ABSENT, 624 .is_webcam = 1, 625 .input = { { 626 .type = EM28XX_VMUX_COMPOSITE1, 627 .vmux = 0, 628 .amux = EM28XX_AMUX_VIDEO, 629 } }, 630 }, 631 [EM2820_BOARD_SILVERCREST_WEBCAM] = { 632 .name = "Silvercrest Webcam 1.3mpix", 633 .tuner_type = TUNER_ABSENT, 634 .is_webcam = 1, 635 .input = { { 636 .type = EM28XX_VMUX_COMPOSITE1, 637 .vmux = 0, 638 .amux = EM28XX_AMUX_VIDEO, 639 .gpio = silvercrest_reg_seq, 640 } }, 641 }, 642 [EM2821_BOARD_SUPERCOMP_USB_2] = { 643 .name = "Supercomp USB 2.0 TV", 644 .valid = EM28XX_BOARD_NOT_VALIDATED, 645 .tuner_type = TUNER_PHILIPS_FM1236_MK3, 646 .tda9887_conf = TDA9887_PRESENT | 647 TDA9887_PORT1_ACTIVE | 648 TDA9887_PORT2_ACTIVE, 649 .decoder = EM28XX_SAA711X, 650 .input = { { 651 .type = EM28XX_VMUX_TELEVISION, 652 .vmux = SAA7115_COMPOSITE2, 653 .amux = EM28XX_AMUX_LINE_IN, 654 }, { 655 .type = EM28XX_VMUX_COMPOSITE1, 656 .vmux = SAA7115_COMPOSITE0, 657 .amux = EM28XX_AMUX_VIDEO, 658 }, { 659 .type = EM28XX_VMUX_SVIDEO, 660 .vmux = SAA7115_SVIDEO3, 661 .amux = EM28XX_AMUX_LINE_IN, 662 } }, 663 }, 664 [EM2821_BOARD_USBGEAR_VD204] = { 665 .name = "Usbgear VD204v9", 666 .valid = EM28XX_BOARD_NOT_VALIDATED, 667 .tuner_type = TUNER_ABSENT, /* Capture only device */ 668 .decoder = EM28XX_SAA711X, 669 .input = { { 670 .type = EM28XX_VMUX_COMPOSITE1, 671 .vmux = SAA7115_COMPOSITE0, 672 .amux = EM28XX_AMUX_LINE_IN, 673 }, { 674 .type = EM28XX_VMUX_SVIDEO, 675 .vmux = SAA7115_SVIDEO3, 676 .amux = EM28XX_AMUX_LINE_IN, 677 } }, 678 }, 679 [EM2860_BOARD_NETGMBH_CAM] = { 680 /* Beijing Huaqi Information Digital Technology Co., Ltd */ 681 .name = "NetGMBH Cam", 682 .valid = EM28XX_BOARD_NOT_VALIDATED, 683 .tuner_type = TUNER_ABSENT, 684 .is_webcam = 1, 685 .input = { { 686 .type = EM28XX_VMUX_COMPOSITE1, 687 .vmux = 0, 688 .amux = EM28XX_AMUX_VIDEO, 689 } }, 690 }, 691 [EM2860_BOARD_TYPHOON_DVD_MAKER] = { 692 .name = "Typhoon DVD Maker", 693 .decoder = EM28XX_SAA711X, 694 .tuner_type = TUNER_ABSENT, /* Capture only device */ 695 .input = { { 696 .type = EM28XX_VMUX_COMPOSITE1, 697 .vmux = SAA7115_COMPOSITE0, 698 .amux = EM28XX_AMUX_LINE_IN, 699 }, { 700 .type = EM28XX_VMUX_SVIDEO, 701 .vmux = SAA7115_SVIDEO3, 702 .amux = EM28XX_AMUX_LINE_IN, 703 } }, 704 }, 705 [EM2860_BOARD_GADMEI_UTV330] = { 706 .name = "Gadmei UTV330", 707 .valid = EM28XX_BOARD_NOT_VALIDATED, 708 .tuner_type = TUNER_TNF_5335MF, 709 .tda9887_conf = TDA9887_PRESENT, 710 .decoder = EM28XX_SAA711X, 711 .input = { { 712 .type = EM28XX_VMUX_TELEVISION, 713 .vmux = SAA7115_COMPOSITE2, 714 .amux = EM28XX_AMUX_VIDEO, 715 }, { 716 .type = EM28XX_VMUX_COMPOSITE1, 717 .vmux = SAA7115_COMPOSITE0, 718 .amux = EM28XX_AMUX_LINE_IN, 719 }, { 720 .type = EM28XX_VMUX_SVIDEO, 721 .vmux = SAA7115_SVIDEO3, 722 .amux = EM28XX_AMUX_LINE_IN, 723 } }, 724 }, 725 [EM2861_BOARD_GADMEI_UTV330PLUS] = { 726 .name = "Gadmei UTV330+", 727 .tuner_type = TUNER_TNF_5335MF, 728 .tda9887_conf = TDA9887_PRESENT, 729 .ir_codes = RC_MAP_GADMEI_RM008Z, 730 .decoder = EM28XX_SAA711X, 731 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, 732 .input = { { 733 .type = EM28XX_VMUX_TELEVISION, 734 .vmux = SAA7115_COMPOSITE2, 735 .amux = EM28XX_AMUX_VIDEO, 736 }, { 737 .type = EM28XX_VMUX_COMPOSITE1, 738 .vmux = SAA7115_COMPOSITE0, 739 .amux = EM28XX_AMUX_LINE_IN, 740 }, { 741 .type = EM28XX_VMUX_SVIDEO, 742 .vmux = SAA7115_SVIDEO3, 743 .amux = EM28XX_AMUX_LINE_IN, 744 } }, 745 }, 746 [EM2860_BOARD_TERRATEC_HYBRID_XS] = { 747 .name = "Terratec Cinergy A Hybrid XS", 748 .valid = EM28XX_BOARD_NOT_VALIDATED, 749 .tuner_type = TUNER_XC2028, 750 .tuner_gpio = default_tuner_gpio, 751 .decoder = EM28XX_TVP5150, 752 753 .input = { { 754 .type = EM28XX_VMUX_TELEVISION, 755 .vmux = TVP5150_COMPOSITE0, 756 .amux = EM28XX_AMUX_VIDEO, 757 .gpio = hauppauge_wintv_hvr_900_analog, 758 }, { 759 .type = EM28XX_VMUX_COMPOSITE1, 760 .vmux = TVP5150_COMPOSITE1, 761 .amux = EM28XX_AMUX_LINE_IN, 762 .gpio = hauppauge_wintv_hvr_900_analog, 763 }, { 764 .type = EM28XX_VMUX_SVIDEO, 765 .vmux = TVP5150_SVIDEO, 766 .amux = EM28XX_AMUX_LINE_IN, 767 .gpio = hauppauge_wintv_hvr_900_analog, 768 } }, 769 }, 770 [EM2861_BOARD_KWORLD_PVRTV_300U] = { 771 .name = "KWorld PVRTV 300U", 772 .valid = EM28XX_BOARD_NOT_VALIDATED, 773 .tuner_type = TUNER_XC2028, 774 .tuner_gpio = default_tuner_gpio, 775 .decoder = EM28XX_TVP5150, 776 .input = { { 777 .type = EM28XX_VMUX_TELEVISION, 778 .vmux = TVP5150_COMPOSITE0, 779 .amux = EM28XX_AMUX_VIDEO, 780 }, { 781 .type = EM28XX_VMUX_COMPOSITE1, 782 .vmux = TVP5150_COMPOSITE1, 783 .amux = EM28XX_AMUX_LINE_IN, 784 }, { 785 .type = EM28XX_VMUX_SVIDEO, 786 .vmux = TVP5150_SVIDEO, 787 .amux = EM28XX_AMUX_LINE_IN, 788 } }, 789 }, 790 [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = { 791 .name = "Yakumo MovieMixer", 792 .tuner_type = TUNER_ABSENT, /* Capture only device */ 793 .decoder = EM28XX_TVP5150, 794 .input = { { 795 .type = EM28XX_VMUX_TELEVISION, 796 .vmux = TVP5150_COMPOSITE0, 797 .amux = EM28XX_AMUX_VIDEO, 798 }, { 799 .type = EM28XX_VMUX_COMPOSITE1, 800 .vmux = TVP5150_COMPOSITE1, 801 .amux = EM28XX_AMUX_LINE_IN, 802 }, { 803 .type = EM28XX_VMUX_SVIDEO, 804 .vmux = TVP5150_SVIDEO, 805 .amux = EM28XX_AMUX_LINE_IN, 806 } }, 807 }, 808 [EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = { 809 .name = "EM2860/TVP5150 Reference Design", 810 .tuner_type = TUNER_ABSENT, /* Capture only device */ 811 .decoder = EM28XX_TVP5150, 812 .input = { { 813 .type = EM28XX_VMUX_COMPOSITE1, 814 .vmux = TVP5150_COMPOSITE1, 815 .amux = EM28XX_AMUX_LINE_IN, 816 }, { 817 .type = EM28XX_VMUX_SVIDEO, 818 .vmux = TVP5150_SVIDEO, 819 .amux = EM28XX_AMUX_LINE_IN, 820 } }, 821 }, 822 [EM2861_BOARD_PLEXTOR_PX_TV100U] = { 823 .name = "Plextor ConvertX PX-TV100U", 824 .tuner_type = TUNER_TNF_5335MF, 825 .xclk = EM28XX_XCLK_I2S_MSB_TIMING | 826 EM28XX_XCLK_FREQUENCY_12MHZ, 827 .tda9887_conf = TDA9887_PRESENT, 828 .decoder = EM28XX_TVP5150, 829 .has_msp34xx = 1, 830 .input = { { 831 .type = EM28XX_VMUX_TELEVISION, 832 .vmux = TVP5150_COMPOSITE0, 833 .amux = EM28XX_AMUX_LINE_IN, 834 .gpio = pinnacle_hybrid_pro_analog, 835 }, { 836 .type = EM28XX_VMUX_COMPOSITE1, 837 .vmux = TVP5150_COMPOSITE1, 838 .amux = EM28XX_AMUX_LINE_IN, 839 .gpio = pinnacle_hybrid_pro_analog, 840 }, { 841 .type = EM28XX_VMUX_SVIDEO, 842 .vmux = TVP5150_SVIDEO, 843 .amux = EM28XX_AMUX_LINE_IN, 844 .gpio = pinnacle_hybrid_pro_analog, 845 } }, 846 }, 847 848 /* Those boards with em2870 are DVB Only*/ 849 850 [EM2870_BOARD_TERRATEC_XS] = { 851 .name = "Terratec Cinergy T XS", 852 .valid = EM28XX_BOARD_NOT_VALIDATED, 853 .tuner_type = TUNER_XC2028, 854 .tuner_gpio = default_tuner_gpio, 855 }, 856 [EM2870_BOARD_TERRATEC_XS_MT2060] = { 857 .name = "Terratec Cinergy T XS (MT2060)", 858 .valid = EM28XX_BOARD_NOT_VALIDATED, 859 .tuner_type = TUNER_ABSENT, /* MT2060 */ 860 }, 861 [EM2870_BOARD_KWORLD_350U] = { 862 .name = "Kworld 350 U DVB-T", 863 .valid = EM28XX_BOARD_NOT_VALIDATED, 864 .tuner_type = TUNER_XC2028, 865 .tuner_gpio = default_tuner_gpio, 866 }, 867 [EM2870_BOARD_KWORLD_355U] = { 868 .name = "Kworld 355 U DVB-T", 869 .valid = EM28XX_BOARD_NOT_VALIDATED, 870 .tuner_type = TUNER_ABSENT, 871 .tuner_gpio = default_tuner_gpio, 872 .has_dvb = 1, 873 .dvb_gpio = default_digital, 874 }, 875 [EM2870_BOARD_PINNACLE_PCTV_DVB] = { 876 .name = "Pinnacle PCTV DVB-T", 877 .valid = EM28XX_BOARD_NOT_VALIDATED, 878 .tuner_type = TUNER_ABSENT, /* MT2060 */ 879 /* djh - I have serious doubts this is right... */ 880 .xclk = EM28XX_XCLK_IR_RC5_MODE | 881 EM28XX_XCLK_FREQUENCY_10MHZ, 882 }, 883 [EM2870_BOARD_COMPRO_VIDEOMATE] = { 884 .name = "Compro, VideoMate U3", 885 .valid = EM28XX_BOARD_NOT_VALIDATED, 886 .tuner_type = TUNER_ABSENT, /* MT2060 */ 887 }, 888 889 [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = { 890 .name = "Terratec Hybrid XS Secam", 891 .has_msp34xx = 1, 892 .tuner_type = TUNER_XC2028, 893 .tuner_gpio = default_tuner_gpio, 894 .decoder = EM28XX_TVP5150, 895 .has_dvb = 1, 896 .dvb_gpio = terratec_cinergy_USB_XS_FR_digital, 897 .input = { { 898 .type = EM28XX_VMUX_TELEVISION, 899 .vmux = TVP5150_COMPOSITE0, 900 .amux = EM28XX_AMUX_VIDEO, 901 .gpio = terratec_cinergy_USB_XS_FR_analog, 902 }, { 903 .type = EM28XX_VMUX_COMPOSITE1, 904 .vmux = TVP5150_COMPOSITE1, 905 .amux = EM28XX_AMUX_LINE_IN, 906 .gpio = terratec_cinergy_USB_XS_FR_analog, 907 }, { 908 .type = EM28XX_VMUX_SVIDEO, 909 .vmux = TVP5150_SVIDEO, 910 .amux = EM28XX_AMUX_LINE_IN, 911 .gpio = terratec_cinergy_USB_XS_FR_analog, 912 } }, 913 }, 914 [EM2884_BOARD_TERRATEC_H5] = { 915 .name = "Terratec Cinergy H5", 916 .has_dvb = 1, 917#if 0 918 .tuner_type = TUNER_PHILIPS_TDA8290, 919 .tuner_addr = 0x41, 920 .dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */ 921 .tuner_gpio = terratec_h5_gpio, 922#else 923 .tuner_type = TUNER_ABSENT, 924#endif 925 .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | 926 EM28XX_I2C_CLK_WAIT_ENABLE | 927 EM28XX_I2C_FREQ_400_KHZ, 928 }, 929 [EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = { 930 .name = "Hauppauge WinTV HVR 930C", 931 .has_dvb = 1, 932#if 0 /* FIXME: Add analog support */ 933 .tuner_type = TUNER_XC5000, 934 .tuner_addr = 0x41, 935 .dvb_gpio = hauppauge_930c_digital, 936 .tuner_gpio = hauppauge_930c_gpio, 937#else 938 .tuner_type = TUNER_ABSENT, 939#endif 940 .ir_codes = RC_MAP_HAUPPAUGE, 941 .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | 942 EM28XX_I2C_CLK_WAIT_ENABLE | 943 EM28XX_I2C_FREQ_400_KHZ, 944 }, 945 [EM2884_BOARD_CINERGY_HTC_STICK] = { 946 .name = "Terratec Cinergy HTC Stick", 947 .has_dvb = 1, 948#if 0 949 .tuner_type = TUNER_PHILIPS_TDA8290, 950 .tuner_addr = 0x41, 951 .dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */ 952 .tuner_gpio = terratec_h5_gpio, 953#endif 954 .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | 955 EM28XX_I2C_CLK_WAIT_ENABLE | 956 EM28XX_I2C_FREQ_400_KHZ, 957 }, 958 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = { 959 .name = "Hauppauge WinTV HVR 900", 960 .tda9887_conf = TDA9887_PRESENT, 961 .tuner_type = TUNER_XC2028, 962 .tuner_gpio = default_tuner_gpio, 963 .mts_firmware = 1, 964 .has_dvb = 1, 965 .dvb_gpio = hauppauge_wintv_hvr_900_digital, 966 .ir_codes = RC_MAP_HAUPPAUGE, 967 .decoder = EM28XX_TVP5150, 968 .input = { { 969 .type = EM28XX_VMUX_TELEVISION, 970 .vmux = TVP5150_COMPOSITE0, 971 .amux = EM28XX_AMUX_VIDEO, 972 .gpio = hauppauge_wintv_hvr_900_analog, 973 }, { 974 .type = EM28XX_VMUX_COMPOSITE1, 975 .vmux = TVP5150_COMPOSITE1, 976 .amux = EM28XX_AMUX_LINE_IN, 977 .gpio = hauppauge_wintv_hvr_900_analog, 978 }, { 979 .type = EM28XX_VMUX_SVIDEO, 980 .vmux = TVP5150_SVIDEO, 981 .amux = EM28XX_AMUX_LINE_IN, 982 .gpio = hauppauge_wintv_hvr_900_analog, 983 } }, 984 }, 985 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = { 986 .name = "Hauppauge WinTV HVR 900 (R2)", 987 .tda9887_conf = TDA9887_PRESENT, 988 .tuner_type = TUNER_XC2028, 989 .tuner_gpio = default_tuner_gpio, 990 .mts_firmware = 1, 991 .has_dvb = 1, 992 .dvb_gpio = hauppauge_wintv_hvr_900R2_digital, 993 .ir_codes = RC_MAP_HAUPPAUGE, 994 .decoder = EM28XX_TVP5150, 995 .input = { { 996 .type = EM28XX_VMUX_TELEVISION, 997 .vmux = TVP5150_COMPOSITE0, 998 .amux = EM28XX_AMUX_VIDEO, 999 .gpio = hauppauge_wintv_hvr_900_analog, 1000 }, { 1001 .type = EM28XX_VMUX_COMPOSITE1, 1002 .vmux = TVP5150_COMPOSITE1, 1003 .amux = EM28XX_AMUX_LINE_IN, 1004 .gpio = hauppauge_wintv_hvr_900_analog, 1005 }, { 1006 .type = EM28XX_VMUX_SVIDEO, 1007 .vmux = TVP5150_SVIDEO, 1008 .amux = EM28XX_AMUX_LINE_IN, 1009 .gpio = hauppauge_wintv_hvr_900_analog, 1010 } }, 1011 }, 1012 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = { 1013 .name = "Hauppauge WinTV HVR 850", 1014 .tuner_type = TUNER_XC2028, 1015 .tuner_gpio = default_tuner_gpio, 1016 .mts_firmware = 1, 1017 .has_dvb = 1, 1018 .dvb_gpio = hauppauge_wintv_hvr_900_digital, 1019 .ir_codes = RC_MAP_HAUPPAUGE, 1020 .decoder = EM28XX_TVP5150, 1021 .input = { { 1022 .type = EM28XX_VMUX_TELEVISION, 1023 .vmux = TVP5150_COMPOSITE0, 1024 .amux = EM28XX_AMUX_VIDEO, 1025 .gpio = hauppauge_wintv_hvr_900_analog, 1026 }, { 1027 .type = EM28XX_VMUX_COMPOSITE1, 1028 .vmux = TVP5150_COMPOSITE1, 1029 .amux = EM28XX_AMUX_LINE_IN, 1030 .gpio = hauppauge_wintv_hvr_900_analog, 1031 }, { 1032 .type = EM28XX_VMUX_SVIDEO, 1033 .vmux = TVP5150_SVIDEO, 1034 .amux = EM28XX_AMUX_LINE_IN, 1035 .gpio = hauppauge_wintv_hvr_900_analog, 1036 } }, 1037 }, 1038 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = { 1039 .name = "Hauppauge WinTV HVR 950", 1040 .tuner_type = TUNER_XC2028, 1041 .tuner_gpio = default_tuner_gpio, 1042 .mts_firmware = 1, 1043 .has_dvb = 1, 1044 .dvb_gpio = hauppauge_wintv_hvr_900_digital, 1045 .ir_codes = RC_MAP_HAUPPAUGE, 1046 .decoder = EM28XX_TVP5150, 1047 .input = { { 1048 .type = EM28XX_VMUX_TELEVISION, 1049 .vmux = TVP5150_COMPOSITE0, 1050 .amux = EM28XX_AMUX_VIDEO, 1051 .gpio = hauppauge_wintv_hvr_900_analog, 1052 }, { 1053 .type = EM28XX_VMUX_COMPOSITE1, 1054 .vmux = TVP5150_COMPOSITE1, 1055 .amux = EM28XX_AMUX_LINE_IN, 1056 .gpio = hauppauge_wintv_hvr_900_analog, 1057 }, { 1058 .type = EM28XX_VMUX_SVIDEO, 1059 .vmux = TVP5150_SVIDEO, 1060 .amux = EM28XX_AMUX_LINE_IN, 1061 .gpio = hauppauge_wintv_hvr_900_analog, 1062 } }, 1063 }, 1064 [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = { 1065 .name = "Pinnacle PCTV HD Pro Stick", 1066 .tuner_type = TUNER_XC2028, 1067 .tuner_gpio = default_tuner_gpio, 1068 .mts_firmware = 1, 1069 .has_dvb = 1, 1070 .dvb_gpio = hauppauge_wintv_hvr_900_digital, 1071 .ir_codes = RC_MAP_PINNACLE_PCTV_HD, 1072 .decoder = EM28XX_TVP5150, 1073 .input = { { 1074 .type = EM28XX_VMUX_TELEVISION, 1075 .vmux = TVP5150_COMPOSITE0, 1076 .amux = EM28XX_AMUX_VIDEO, 1077 .gpio = hauppauge_wintv_hvr_900_analog, 1078 }, { 1079 .type = EM28XX_VMUX_COMPOSITE1, 1080 .vmux = TVP5150_COMPOSITE1, 1081 .amux = EM28XX_AMUX_LINE_IN, 1082 .gpio = hauppauge_wintv_hvr_900_analog, 1083 }, { 1084 .type = EM28XX_VMUX_SVIDEO, 1085 .vmux = TVP5150_SVIDEO, 1086 .amux = EM28XX_AMUX_LINE_IN, 1087 .gpio = hauppauge_wintv_hvr_900_analog, 1088 } }, 1089 }, 1090 [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = { 1091 .name = "AMD ATI TV Wonder HD 600", 1092 .tuner_type = TUNER_XC2028, 1093 .tuner_gpio = default_tuner_gpio, 1094 .mts_firmware = 1, 1095 .has_dvb = 1, 1096 .dvb_gpio = hauppauge_wintv_hvr_900_digital, 1097 .ir_codes = RC_MAP_ATI_TV_WONDER_HD_600, 1098 .decoder = EM28XX_TVP5150, 1099 .input = { { 1100 .type = EM28XX_VMUX_TELEVISION, 1101 .vmux = TVP5150_COMPOSITE0, 1102 .amux = EM28XX_AMUX_VIDEO, 1103 .gpio = hauppauge_wintv_hvr_900_analog, 1104 }, { 1105 .type = EM28XX_VMUX_COMPOSITE1, 1106 .vmux = TVP5150_COMPOSITE1, 1107 .amux = EM28XX_AMUX_LINE_IN, 1108 .gpio = hauppauge_wintv_hvr_900_analog, 1109 }, { 1110 .type = EM28XX_VMUX_SVIDEO, 1111 .vmux = TVP5150_SVIDEO, 1112 .amux = EM28XX_AMUX_LINE_IN, 1113 .gpio = hauppauge_wintv_hvr_900_analog, 1114 } }, 1115 }, 1116 [EM2880_BOARD_TERRATEC_HYBRID_XS] = { 1117 .name = "Terratec Hybrid XS", 1118 .tuner_type = TUNER_XC2028, 1119 .tuner_gpio = default_tuner_gpio, 1120 .decoder = EM28XX_TVP5150, 1121 .has_dvb = 1, 1122 .dvb_gpio = default_digital, 1123 .ir_codes = RC_MAP_TERRATEC_CINERGY_XS, 1124 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */ 1125 .input = { { 1126 .type = EM28XX_VMUX_TELEVISION, 1127 .vmux = TVP5150_COMPOSITE0, 1128 .amux = EM28XX_AMUX_VIDEO, 1129 .gpio = default_analog, 1130 }, { 1131 .type = EM28XX_VMUX_COMPOSITE1, 1132 .vmux = TVP5150_COMPOSITE1, 1133 .amux = EM28XX_AMUX_LINE_IN, 1134 .gpio = default_analog, 1135 }, { 1136 .type = EM28XX_VMUX_SVIDEO, 1137 .vmux = TVP5150_SVIDEO, 1138 .amux = EM28XX_AMUX_LINE_IN, 1139 .gpio = default_analog, 1140 } }, 1141 }, 1142 /* maybe there's a reason behind it why Terratec sells the Hybrid XS 1143 as Prodigy XS with a different PID, let's keep it separated for now 1144 maybe we'll need it lateron */ 1145 [EM2880_BOARD_TERRATEC_PRODIGY_XS] = { 1146 .name = "Terratec Prodigy XS", 1147 .tuner_type = TUNER_XC2028, 1148 .tuner_gpio = default_tuner_gpio, 1149 .decoder = EM28XX_TVP5150, 1150 .input = { { 1151 .type = EM28XX_VMUX_TELEVISION, 1152 .vmux = TVP5150_COMPOSITE0, 1153 .amux = EM28XX_AMUX_VIDEO, 1154 .gpio = hauppauge_wintv_hvr_900_analog, 1155 }, { 1156 .type = EM28XX_VMUX_COMPOSITE1, 1157 .vmux = TVP5150_COMPOSITE1, 1158 .amux = EM28XX_AMUX_LINE_IN, 1159 .gpio = hauppauge_wintv_hvr_900_analog, 1160 }, { 1161 .type = EM28XX_VMUX_SVIDEO, 1162 .vmux = TVP5150_SVIDEO, 1163 .amux = EM28XX_AMUX_LINE_IN, 1164 .gpio = hauppauge_wintv_hvr_900_analog, 1165 } }, 1166 }, 1167 [EM2820_BOARD_MSI_VOX_USB_2] = { 1168 .name = "MSI VOX USB 2.0", 1169 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 1170 .tda9887_conf = TDA9887_PRESENT | 1171 TDA9887_PORT1_ACTIVE | 1172 TDA9887_PORT2_ACTIVE, 1173 .max_range_640_480 = 1, 1174 .decoder = EM28XX_SAA711X, 1175 .input = { { 1176 .type = EM28XX_VMUX_TELEVISION, 1177 .vmux = SAA7115_COMPOSITE4, 1178 .amux = EM28XX_AMUX_VIDEO, 1179 }, { 1180 .type = EM28XX_VMUX_COMPOSITE1, 1181 .vmux = SAA7115_COMPOSITE0, 1182 .amux = EM28XX_AMUX_LINE_IN, 1183 }, { 1184 .type = EM28XX_VMUX_SVIDEO, 1185 .vmux = SAA7115_SVIDEO3, 1186 .amux = EM28XX_AMUX_LINE_IN, 1187 } }, 1188 }, 1189 [EM2800_BOARD_TERRATEC_CINERGY_200] = { 1190 .name = "Terratec Cinergy 200 USB", 1191 .is_em2800 = 1, 1192 .has_ir_i2c = 1, 1193 .tuner_type = TUNER_LG_TALN, 1194 .tda9887_conf = TDA9887_PRESENT, 1195 .decoder = EM28XX_SAA711X, 1196 .input = { { 1197 .type = EM28XX_VMUX_TELEVISION, 1198 .vmux = SAA7115_COMPOSITE2, 1199 .amux = EM28XX_AMUX_VIDEO, 1200 }, { 1201 .type = EM28XX_VMUX_COMPOSITE1, 1202 .vmux = SAA7115_COMPOSITE0, 1203 .amux = EM28XX_AMUX_LINE_IN, 1204 }, { 1205 .type = EM28XX_VMUX_SVIDEO, 1206 .vmux = SAA7115_SVIDEO3, 1207 .amux = EM28XX_AMUX_LINE_IN, 1208 } }, 1209 }, 1210 [EM2800_BOARD_GRABBEEX_USB2800] = { 1211 .name = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder", 1212 .is_em2800 = 1, 1213 .decoder = EM28XX_SAA711X, 1214 .tuner_type = TUNER_ABSENT, /* capture only board */ 1215 .input = { { 1216 .type = EM28XX_VMUX_COMPOSITE1, 1217 .vmux = SAA7115_COMPOSITE0, 1218 .amux = EM28XX_AMUX_LINE_IN, 1219 }, { 1220 .type = EM28XX_VMUX_SVIDEO, 1221 .vmux = SAA7115_SVIDEO3, 1222 .amux = EM28XX_AMUX_LINE_IN, 1223 } }, 1224 }, 1225 [EM2800_BOARD_VC211A] = { 1226 .name = "Actionmaster/LinXcel/Digitus VC211A", 1227 .is_em2800 = 1, 1228 .tuner_type = TUNER_ABSENT, /* Capture-only board */ 1229 .decoder = EM28XX_SAA711X, 1230 .input = { { 1231 .type = EM28XX_VMUX_COMPOSITE1, 1232 .vmux = SAA7115_COMPOSITE0, 1233 .amux = EM28XX_AMUX_LINE_IN, 1234 .gpio = vc211a_enable, 1235 }, { 1236 .type = EM28XX_VMUX_SVIDEO, 1237 .vmux = SAA7115_SVIDEO3, 1238 .amux = EM28XX_AMUX_LINE_IN, 1239 .gpio = vc211a_enable, 1240 } }, 1241 }, 1242 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = { 1243 .name = "Leadtek Winfast USB II", 1244 .is_em2800 = 1, 1245 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 1246 .tda9887_conf = TDA9887_PRESENT, 1247 .decoder = EM28XX_SAA711X, 1248 .input = { { 1249 .type = EM28XX_VMUX_TELEVISION, 1250 .vmux = SAA7115_COMPOSITE2, 1251 .amux = EM28XX_AMUX_VIDEO, 1252 }, { 1253 .type = EM28XX_VMUX_COMPOSITE1, 1254 .vmux = SAA7115_COMPOSITE0, 1255 .amux = EM28XX_AMUX_LINE_IN, 1256 }, { 1257 .type = EM28XX_VMUX_SVIDEO, 1258 .vmux = SAA7115_SVIDEO3, 1259 .amux = EM28XX_AMUX_LINE_IN, 1260 } }, 1261 }, 1262 [EM2800_BOARD_KWORLD_USB2800] = { 1263 .name = "Kworld USB2800", 1264 .is_em2800 = 1, 1265 .tuner_type = TUNER_PHILIPS_FCV1236D, 1266 .tda9887_conf = TDA9887_PRESENT, 1267 .decoder = EM28XX_SAA711X, 1268 .input = { { 1269 .type = EM28XX_VMUX_TELEVISION, 1270 .vmux = SAA7115_COMPOSITE2, 1271 .amux = EM28XX_AMUX_VIDEO, 1272 }, { 1273 .type = EM28XX_VMUX_COMPOSITE1, 1274 .vmux = SAA7115_COMPOSITE0, 1275 .amux = EM28XX_AMUX_LINE_IN, 1276 }, { 1277 .type = EM28XX_VMUX_SVIDEO, 1278 .vmux = SAA7115_SVIDEO3, 1279 .amux = EM28XX_AMUX_LINE_IN, 1280 } }, 1281 }, 1282 [EM2820_BOARD_PINNACLE_DVC_90] = { 1283 .name = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker " 1284 "/ Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U", 1285 .tuner_type = TUNER_ABSENT, /* capture only board */ 1286 .decoder = EM28XX_SAA711X, 1287 .input = { { 1288 .type = EM28XX_VMUX_COMPOSITE1, 1289 .vmux = SAA7115_COMPOSITE0, 1290 .amux = EM28XX_AMUX_LINE_IN, 1291 }, { 1292 .type = EM28XX_VMUX_SVIDEO, 1293 .vmux = SAA7115_SVIDEO3, 1294 .amux = EM28XX_AMUX_LINE_IN, 1295 } }, 1296 }, 1297 [EM2800_BOARD_VGEAR_POCKETTV] = { 1298 .name = "V-Gear PocketTV", 1299 .is_em2800 = 1, 1300 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 1301 .tda9887_conf = TDA9887_PRESENT, 1302 .decoder = EM28XX_SAA711X, 1303 .input = { { 1304 .type = EM28XX_VMUX_TELEVISION, 1305 .vmux = SAA7115_COMPOSITE2, 1306 .amux = EM28XX_AMUX_VIDEO, 1307 }, { 1308 .type = EM28XX_VMUX_COMPOSITE1, 1309 .vmux = SAA7115_COMPOSITE0, 1310 .amux = EM28XX_AMUX_LINE_IN, 1311 }, { 1312 .type = EM28XX_VMUX_SVIDEO, 1313 .vmux = SAA7115_SVIDEO3, 1314 .amux = EM28XX_AMUX_LINE_IN, 1315 } }, 1316 }, 1317 [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = { 1318 .name = "Pixelview PlayTV Box 4 USB 2.0", 1319 .tda9887_conf = TDA9887_PRESENT, 1320 .tuner_type = TUNER_YMEC_TVF_5533MF, 1321 .decoder = EM28XX_SAA711X, 1322 .input = { { 1323 .type = EM28XX_VMUX_TELEVISION, 1324 .vmux = SAA7115_COMPOSITE2, 1325 .amux = EM28XX_AMUX_VIDEO, 1326 .aout = EM28XX_AOUT_MONO | /* I2S */ 1327 EM28XX_AOUT_MASTER, /* Line out pin */ 1328 }, { 1329 .type = EM28XX_VMUX_COMPOSITE1, 1330 .vmux = SAA7115_COMPOSITE0, 1331 .amux = EM28XX_AMUX_LINE_IN, 1332 }, { 1333 .type = EM28XX_VMUX_SVIDEO, 1334 .vmux = SAA7115_SVIDEO3, 1335 .amux = EM28XX_AMUX_LINE_IN, 1336 } }, 1337 }, 1338 [EM2820_BOARD_PROLINK_PLAYTV_USB2] = { 1339 .name = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0", 1340 .has_snapshot_button = 1, 1341 .tda9887_conf = TDA9887_PRESENT, 1342 .tuner_type = TUNER_YMEC_TVF_5533MF, 1343 .decoder = EM28XX_SAA711X, 1344 .input = { { 1345 .type = EM28XX_VMUX_TELEVISION, 1346 .vmux = SAA7115_COMPOSITE2, 1347 .amux = EM28XX_AMUX_VIDEO, 1348 .aout = EM28XX_AOUT_MONO | /* I2S */ 1349 EM28XX_AOUT_MASTER, /* Line out pin */ 1350 }, { 1351 .type = EM28XX_VMUX_COMPOSITE1, 1352 .vmux = SAA7115_COMPOSITE0, 1353 .amux = EM28XX_AMUX_LINE_IN, 1354 }, { 1355 .type = EM28XX_VMUX_SVIDEO, 1356 .vmux = SAA7115_SVIDEO3, 1357 .amux = EM28XX_AMUX_LINE_IN, 1358 } }, 1359 }, 1360 [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = { 1361 .name = "EM2860/SAA711X Reference Design", 1362 .has_snapshot_button = 1, 1363 .tuner_type = TUNER_ABSENT, 1364 .decoder = EM28XX_SAA711X, 1365 .input = { { 1366 .type = EM28XX_VMUX_SVIDEO, 1367 .vmux = SAA7115_SVIDEO3, 1368 }, { 1369 .type = EM28XX_VMUX_COMPOSITE1, 1370 .vmux = SAA7115_COMPOSITE0, 1371 } }, 1372 }, 1373 1374 [EM2874_BOARD_LEADERSHIP_ISDBT] = { 1375 .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | 1376 EM28XX_I2C_CLK_WAIT_ENABLE | 1377 EM28XX_I2C_FREQ_100_KHZ, 1378 .xclk = EM28XX_XCLK_FREQUENCY_10MHZ, 1379 .name = "EM2874 Leadership ISDBT", 1380 .tuner_type = TUNER_ABSENT, 1381 .tuner_gpio = leadership_reset, 1382 .dvb_gpio = leadership_digital, 1383 .has_dvb = 1, 1384 }, 1385 1386 [EM2880_BOARD_MSI_DIGIVOX_AD] = { 1387 .name = "MSI DigiVox A/D", 1388 .valid = EM28XX_BOARD_NOT_VALIDATED, 1389 .tuner_type = TUNER_XC2028, 1390 .tuner_gpio = default_tuner_gpio, 1391 .decoder = EM28XX_TVP5150, 1392 .input = { { 1393 .type = EM28XX_VMUX_TELEVISION, 1394 .vmux = TVP5150_COMPOSITE0, 1395 .amux = EM28XX_AMUX_VIDEO, 1396 .gpio = em2880_msi_digivox_ad_analog, 1397 }, { 1398 .type = EM28XX_VMUX_COMPOSITE1, 1399 .vmux = TVP5150_COMPOSITE1, 1400 .amux = EM28XX_AMUX_LINE_IN, 1401 .gpio = em2880_msi_digivox_ad_analog, 1402 }, { 1403 .type = EM28XX_VMUX_SVIDEO, 1404 .vmux = TVP5150_SVIDEO, 1405 .amux = EM28XX_AMUX_LINE_IN, 1406 .gpio = em2880_msi_digivox_ad_analog, 1407 } }, 1408 }, 1409 [EM2880_BOARD_MSI_DIGIVOX_AD_II] = { 1410 .name = "MSI DigiVox A/D II", 1411 .valid = EM28XX_BOARD_NOT_VALIDATED, 1412 .tuner_type = TUNER_XC2028, 1413 .tuner_gpio = default_tuner_gpio, 1414 .decoder = EM28XX_TVP5150, 1415 .input = { { 1416 .type = EM28XX_VMUX_TELEVISION, 1417 .vmux = TVP5150_COMPOSITE0, 1418 .amux = EM28XX_AMUX_VIDEO, 1419 .gpio = em2880_msi_digivox_ad_analog, 1420 }, { 1421 .type = EM28XX_VMUX_COMPOSITE1, 1422 .vmux = TVP5150_COMPOSITE1, 1423 .amux = EM28XX_AMUX_LINE_IN, 1424 .gpio = em2880_msi_digivox_ad_analog, 1425 }, { 1426 .type = EM28XX_VMUX_SVIDEO, 1427 .vmux = TVP5150_SVIDEO, 1428 .amux = EM28XX_AMUX_LINE_IN, 1429 .gpio = em2880_msi_digivox_ad_analog, 1430 } }, 1431 }, 1432 [EM2880_BOARD_KWORLD_DVB_305U] = { 1433 .name = "KWorld DVB-T 305U", 1434 .tuner_type = TUNER_XC2028, 1435 .tuner_gpio = default_tuner_gpio, 1436 .decoder = EM28XX_TVP5150, 1437 .input = { { 1438 .type = EM28XX_VMUX_TELEVISION, 1439 .vmux = TVP5150_COMPOSITE0, 1440 .amux = EM28XX_AMUX_VIDEO, 1441 }, { 1442 .type = EM28XX_VMUX_COMPOSITE1, 1443 .vmux = TVP5150_COMPOSITE1, 1444 .amux = EM28XX_AMUX_LINE_IN, 1445 }, { 1446 .type = EM28XX_VMUX_SVIDEO, 1447 .vmux = TVP5150_SVIDEO, 1448 .amux = EM28XX_AMUX_LINE_IN, 1449 } }, 1450 }, 1451 [EM2880_BOARD_KWORLD_DVB_310U] = { 1452 .name = "KWorld DVB-T 310U", 1453 .tuner_type = TUNER_XC2028, 1454 .tuner_gpio = default_tuner_gpio, 1455 .has_dvb = 1, 1456 .dvb_gpio = default_digital, 1457 .mts_firmware = 1, 1458 .decoder = EM28XX_TVP5150, 1459 .input = { { 1460 .type = EM28XX_VMUX_TELEVISION, 1461 .vmux = TVP5150_COMPOSITE0, 1462 .amux = EM28XX_AMUX_VIDEO, 1463 .gpio = default_analog, 1464 }, { 1465 .type = EM28XX_VMUX_COMPOSITE1, 1466 .vmux = TVP5150_COMPOSITE1, 1467 .amux = EM28XX_AMUX_LINE_IN, 1468 .gpio = default_analog, 1469 }, { /* S-video has not been tested yet */ 1470 .type = EM28XX_VMUX_SVIDEO, 1471 .vmux = TVP5150_SVIDEO, 1472 .amux = EM28XX_AMUX_LINE_IN, 1473 .gpio = default_analog, 1474 } }, 1475 }, 1476 [EM2882_BOARD_KWORLD_ATSC_315U] = { 1477 .name = "KWorld ATSC 315U HDTV TV Box", 1478 .valid = EM28XX_BOARD_NOT_VALIDATED, 1479 .tuner_type = TUNER_THOMSON_DTT761X, 1480 .tuner_gpio = em2882_kworld_315u_tuner_gpio, 1481 .tda9887_conf = TDA9887_PRESENT, 1482 .decoder = EM28XX_SAA711X, 1483 .has_dvb = 1, 1484 .dvb_gpio = em2882_kworld_315u_digital, 1485 .ir_codes = RC_MAP_KWORLD_315U, 1486 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, 1487 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE, 1488 /* Analog mode - still not ready */ 1489 /*.input = { { 1490 .type = EM28XX_VMUX_TELEVISION, 1491 .vmux = SAA7115_COMPOSITE2, 1492 .amux = EM28XX_AMUX_VIDEO, 1493 .gpio = em2882_kworld_315u_analog, 1494 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO, 1495 }, { 1496 .type = EM28XX_VMUX_COMPOSITE1, 1497 .vmux = SAA7115_COMPOSITE0, 1498 .amux = EM28XX_AMUX_LINE_IN, 1499 .gpio = em2882_kworld_315u_analog1, 1500 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO, 1501 }, { 1502 .type = EM28XX_VMUX_SVIDEO, 1503 .vmux = SAA7115_SVIDEO3, 1504 .amux = EM28XX_AMUX_LINE_IN, 1505 .gpio = em2882_kworld_315u_analog1, 1506 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO, 1507 } }, */ 1508 }, 1509 [EM2880_BOARD_EMPIRE_DUAL_TV] = { 1510 .name = "Empire dual TV", 1511 .tuner_type = TUNER_XC2028, 1512 .tuner_gpio = default_tuner_gpio, 1513 .has_dvb = 1, 1514 .dvb_gpio = default_digital, 1515 .mts_firmware = 1, 1516 .decoder = EM28XX_TVP5150, 1517 .input = { { 1518 .type = EM28XX_VMUX_TELEVISION, 1519 .vmux = TVP5150_COMPOSITE0, 1520 .amux = EM28XX_AMUX_VIDEO, 1521 .gpio = default_analog, 1522 }, { 1523 .type = EM28XX_VMUX_COMPOSITE1, 1524 .vmux = TVP5150_COMPOSITE1, 1525 .amux = EM28XX_AMUX_LINE_IN, 1526 .gpio = default_analog, 1527 }, { 1528 .type = EM28XX_VMUX_SVIDEO, 1529 .vmux = TVP5150_SVIDEO, 1530 .amux = EM28XX_AMUX_LINE_IN, 1531 .gpio = default_analog, 1532 } }, 1533 }, 1534 [EM2881_BOARD_DNT_DA2_HYBRID] = { 1535 .name = "DNT DA2 Hybrid", 1536 .valid = EM28XX_BOARD_NOT_VALIDATED, 1537 .tuner_type = TUNER_XC2028, 1538 .tuner_gpio = default_tuner_gpio, 1539 .decoder = EM28XX_TVP5150, 1540 .input = { { 1541 .type = EM28XX_VMUX_TELEVISION, 1542 .vmux = TVP5150_COMPOSITE0, 1543 .amux = EM28XX_AMUX_VIDEO, 1544 .gpio = default_analog, 1545 }, { 1546 .type = EM28XX_VMUX_COMPOSITE1, 1547 .vmux = TVP5150_COMPOSITE1, 1548 .amux = EM28XX_AMUX_LINE_IN, 1549 .gpio = default_analog, 1550 }, { 1551 .type = EM28XX_VMUX_SVIDEO, 1552 .vmux = TVP5150_SVIDEO, 1553 .amux = EM28XX_AMUX_LINE_IN, 1554 .gpio = default_analog, 1555 } }, 1556 }, 1557 [EM2881_BOARD_PINNACLE_HYBRID_PRO] = { 1558 .name = "Pinnacle Hybrid Pro", 1559 .tuner_type = TUNER_XC2028, 1560 .tuner_gpio = default_tuner_gpio, 1561 .decoder = EM28XX_TVP5150, 1562 .has_dvb = 1, 1563 .dvb_gpio = pinnacle_hybrid_pro_digital, 1564 .input = { { 1565 .type = EM28XX_VMUX_TELEVISION, 1566 .vmux = TVP5150_COMPOSITE0, 1567 .amux = EM28XX_AMUX_VIDEO, 1568 .gpio = pinnacle_hybrid_pro_analog, 1569 }, { 1570 .type = EM28XX_VMUX_COMPOSITE1, 1571 .vmux = TVP5150_COMPOSITE1, 1572 .amux = EM28XX_AMUX_LINE_IN, 1573 .gpio = pinnacle_hybrid_pro_analog, 1574 }, { 1575 .type = EM28XX_VMUX_SVIDEO, 1576 .vmux = TVP5150_SVIDEO, 1577 .amux = EM28XX_AMUX_LINE_IN, 1578 .gpio = pinnacle_hybrid_pro_analog, 1579 } }, 1580 }, 1581 [EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = { 1582 .name = "Pinnacle Hybrid Pro (330e)", 1583 .tuner_type = TUNER_XC2028, 1584 .tuner_gpio = default_tuner_gpio, 1585 .mts_firmware = 1, 1586 .has_dvb = 1, 1587 .dvb_gpio = hauppauge_wintv_hvr_900R2_digital, 1588 .ir_codes = RC_MAP_PINNACLE_PCTV_HD, 1589 .decoder = EM28XX_TVP5150, 1590 .input = { { 1591 .type = EM28XX_VMUX_TELEVISION, 1592 .vmux = TVP5150_COMPOSITE0, 1593 .amux = EM28XX_AMUX_VIDEO, 1594 .gpio = hauppauge_wintv_hvr_900_analog, 1595 }, { 1596 .type = EM28XX_VMUX_COMPOSITE1, 1597 .vmux = TVP5150_COMPOSITE1, 1598 .amux = EM28XX_AMUX_LINE_IN, 1599 .gpio = hauppauge_wintv_hvr_900_analog, 1600 }, { 1601 .type = EM28XX_VMUX_SVIDEO, 1602 .vmux = TVP5150_SVIDEO, 1603 .amux = EM28XX_AMUX_LINE_IN, 1604 .gpio = hauppauge_wintv_hvr_900_analog, 1605 } }, 1606 }, 1607 [EM2882_BOARD_KWORLD_VS_DVBT] = { 1608 .name = "Kworld VS-DVB-T 323UR", 1609 .tuner_type = TUNER_XC2028, 1610 .tuner_gpio = default_tuner_gpio, 1611 .decoder = EM28XX_TVP5150, 1612 .mts_firmware = 1, 1613 .has_dvb = 1, 1614 .dvb_gpio = kworld_330u_digital, 1615 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */ 1616 .ir_codes = RC_MAP_KWORLD_315U, 1617 .input = { { 1618 .type = EM28XX_VMUX_TELEVISION, 1619 .vmux = TVP5150_COMPOSITE0, 1620 .amux = EM28XX_AMUX_VIDEO, 1621 }, { 1622 .type = EM28XX_VMUX_COMPOSITE1, 1623 .vmux = TVP5150_COMPOSITE1, 1624 .amux = EM28XX_AMUX_LINE_IN, 1625 }, { 1626 .type = EM28XX_VMUX_SVIDEO, 1627 .vmux = TVP5150_SVIDEO, 1628 .amux = EM28XX_AMUX_LINE_IN, 1629 } }, 1630 }, 1631 [EM2882_BOARD_TERRATEC_HYBRID_XS] = { 1632 .name = "Terratec Cinnergy Hybrid T USB XS (em2882)", 1633 .tuner_type = TUNER_XC2028, 1634 .tuner_gpio = default_tuner_gpio, 1635 .mts_firmware = 1, 1636 .decoder = EM28XX_TVP5150, 1637 .has_dvb = 1, 1638 .dvb_gpio = hauppauge_wintv_hvr_900_digital, 1639 .ir_codes = RC_MAP_TERRATEC_CINERGY_XS, 1640 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, 1641 .input = { { 1642 .type = EM28XX_VMUX_TELEVISION, 1643 .vmux = TVP5150_COMPOSITE0, 1644 .amux = EM28XX_AMUX_VIDEO, 1645 .gpio = hauppauge_wintv_hvr_900_analog, 1646 }, { 1647 .type = EM28XX_VMUX_COMPOSITE1, 1648 .vmux = TVP5150_COMPOSITE1, 1649 .amux = EM28XX_AMUX_LINE_IN, 1650 .gpio = hauppauge_wintv_hvr_900_analog, 1651 }, { 1652 .type = EM28XX_VMUX_SVIDEO, 1653 .vmux = TVP5150_SVIDEO, 1654 .amux = EM28XX_AMUX_LINE_IN, 1655 .gpio = hauppauge_wintv_hvr_900_analog, 1656 } }, 1657 }, 1658 [EM2882_BOARD_DIKOM_DK300] = { 1659 .name = "Dikom DK300", 1660 .tuner_type = TUNER_XC2028, 1661 .tuner_gpio = default_tuner_gpio, 1662 .decoder = EM28XX_TVP5150, 1663 .mts_firmware = 1, 1664 .has_dvb = 1, 1665 .dvb_gpio = dikom_dk300_digital, 1666 .input = { { 1667 .type = EM28XX_VMUX_TELEVISION, 1668 .vmux = TVP5150_COMPOSITE0, 1669 .amux = EM28XX_AMUX_VIDEO, 1670 .gpio = default_analog, 1671 } }, 1672 }, 1673 [EM2883_BOARD_KWORLD_HYBRID_330U] = { 1674 .name = "Kworld PlusTV HD Hybrid 330", 1675 .tuner_type = TUNER_XC2028, 1676 .tuner_gpio = default_tuner_gpio, 1677 .decoder = EM28XX_TVP5150, 1678 .mts_firmware = 1, 1679 .has_dvb = 1, 1680 .dvb_gpio = kworld_330u_digital, 1681 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, 1682 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | 1683 EM28XX_I2C_EEPROM_ON_BOARD | 1684 EM28XX_I2C_EEPROM_KEY_VALID, 1685 .input = { { 1686 .type = EM28XX_VMUX_TELEVISION, 1687 .vmux = TVP5150_COMPOSITE0, 1688 .amux = EM28XX_AMUX_VIDEO, 1689 .gpio = kworld_330u_analog, 1690 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO, 1691 }, { 1692 .type = EM28XX_VMUX_COMPOSITE1, 1693 .vmux = TVP5150_COMPOSITE1, 1694 .amux = EM28XX_AMUX_LINE_IN, 1695 .gpio = kworld_330u_analog, 1696 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO, 1697 }, { 1698 .type = EM28XX_VMUX_SVIDEO, 1699 .vmux = TVP5150_SVIDEO, 1700 .amux = EM28XX_AMUX_LINE_IN, 1701 .gpio = kworld_330u_analog, 1702 } }, 1703 }, 1704 [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = { 1705 .name = "Compro VideoMate ForYou/Stereo", 1706 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 1707 .tvaudio_addr = 0xb0, 1708 .tda9887_conf = TDA9887_PRESENT, 1709 .decoder = EM28XX_TVP5150, 1710 .adecoder = EM28XX_TVAUDIO, 1711 .mute_gpio = compro_mute_gpio, 1712 .input = { { 1713 .type = EM28XX_VMUX_TELEVISION, 1714 .vmux = TVP5150_COMPOSITE0, 1715 .amux = EM28XX_AMUX_VIDEO, 1716 .gpio = compro_unmute_tv_gpio, 1717 }, { 1718 .type = EM28XX_VMUX_SVIDEO, 1719 .vmux = TVP5150_SVIDEO, 1720 .amux = EM28XX_AMUX_LINE_IN, 1721 .gpio = compro_unmute_svid_gpio, 1722 } }, 1723 }, 1724 [EM2860_BOARD_KAIOMY_TVNPC_U2] = { 1725 .name = "Kaiomy TVnPC U2", 1726 .vchannels = 3, 1727 .tuner_type = TUNER_XC2028, 1728 .tuner_addr = 0x61, 1729 .mts_firmware = 1, 1730 .decoder = EM28XX_TVP5150, 1731 .tuner_gpio = default_tuner_gpio, 1732 .ir_codes = RC_MAP_KAIOMY, 1733 .input = { { 1734 .type = EM28XX_VMUX_TELEVISION, 1735 .vmux = TVP5150_COMPOSITE0, 1736 .amux = EM28XX_AMUX_VIDEO, 1737 1738 }, { 1739 .type = EM28XX_VMUX_COMPOSITE1, 1740 .vmux = TVP5150_COMPOSITE1, 1741 .amux = EM28XX_AMUX_LINE_IN, 1742 }, { 1743 .type = EM28XX_VMUX_SVIDEO, 1744 .vmux = TVP5150_SVIDEO, 1745 .amux = EM28XX_AMUX_LINE_IN, 1746 } }, 1747 .radio = { 1748 .type = EM28XX_RADIO, 1749 .amux = EM28XX_AMUX_LINE_IN, 1750 } 1751 }, 1752 [EM2860_BOARD_EASYCAP] = { 1753 .name = "Easy Cap Capture DC-60", 1754 .vchannels = 2, 1755 .tuner_type = TUNER_ABSENT, 1756 .decoder = EM28XX_SAA711X, 1757 .input = { { 1758 .type = EM28XX_VMUX_COMPOSITE1, 1759 .vmux = SAA7115_COMPOSITE0, 1760 .amux = EM28XX_AMUX_LINE_IN, 1761 }, { 1762 .type = EM28XX_VMUX_SVIDEO, 1763 .vmux = SAA7115_SVIDEO3, 1764 .amux = EM28XX_AMUX_LINE_IN, 1765 } }, 1766 }, 1767 [EM2820_BOARD_IODATA_GVMVP_SZ] = { 1768 .name = "IO-DATA GV-MVP/SZ", 1769 .tuner_type = TUNER_PHILIPS_FM1236_MK3, 1770 .tuner_gpio = default_tuner_gpio, 1771 .tda9887_conf = TDA9887_PRESENT, 1772 .decoder = EM28XX_TVP5150, 1773 .input = { { 1774 .type = EM28XX_VMUX_TELEVISION, 1775 .vmux = TVP5150_COMPOSITE0, 1776 .amux = EM28XX_AMUX_VIDEO, 1777 }, { /* Composite has not been tested yet */ 1778 .type = EM28XX_VMUX_COMPOSITE1, 1779 .vmux = TVP5150_COMPOSITE1, 1780 .amux = EM28XX_AMUX_VIDEO, 1781 }, { /* S-video has not been tested yet */ 1782 .type = EM28XX_VMUX_SVIDEO, 1783 .vmux = TVP5150_SVIDEO, 1784 .amux = EM28XX_AMUX_VIDEO, 1785 } }, 1786 }, 1787 [EM2860_BOARD_TERRATEC_GRABBY] = { 1788 .name = "Terratec Grabby", 1789 .vchannels = 2, 1790 .tuner_type = TUNER_ABSENT, 1791 .decoder = EM28XX_SAA711X, 1792 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, 1793 .input = { { 1794 .type = EM28XX_VMUX_COMPOSITE1, 1795 .vmux = SAA7115_COMPOSITE0, 1796 .amux = EM28XX_AMUX_LINE_IN, 1797 }, { 1798 .type = EM28XX_VMUX_SVIDEO, 1799 .vmux = SAA7115_SVIDEO3, 1800 .amux = EM28XX_AMUX_LINE_IN, 1801 } }, 1802 }, 1803 [EM2860_BOARD_TERRATEC_AV350] = { 1804 .name = "Terratec AV350", 1805 .vchannels = 2, 1806 .tuner_type = TUNER_ABSENT, 1807 .decoder = EM28XX_TVP5150, 1808 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, 1809 .mute_gpio = terratec_av350_mute_gpio, 1810 .input = { { 1811 .type = EM28XX_VMUX_COMPOSITE1, 1812 .vmux = TVP5150_COMPOSITE1, 1813 .amux = EM28XX_AUDIO_SRC_LINE, 1814 .gpio = terratec_av350_unmute_gpio, 1815 1816 }, { 1817 .type = EM28XX_VMUX_SVIDEO, 1818 .vmux = TVP5150_SVIDEO, 1819 .amux = EM28XX_AUDIO_SRC_LINE, 1820 .gpio = terratec_av350_unmute_gpio, 1821 } }, 1822 }, 1823 1824 [EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = { 1825 .name = "Elgato Video Capture", 1826 .decoder = EM28XX_SAA711X, 1827 .tuner_type = TUNER_ABSENT, /* Capture only device */ 1828 .input = { { 1829 .type = EM28XX_VMUX_COMPOSITE1, 1830 .vmux = SAA7115_COMPOSITE0, 1831 .amux = EM28XX_AMUX_LINE_IN, 1832 }, { 1833 .type = EM28XX_VMUX_SVIDEO, 1834 .vmux = SAA7115_SVIDEO3, 1835 .amux = EM28XX_AMUX_LINE_IN, 1836 } }, 1837 }, 1838 1839 [EM2882_BOARD_EVGA_INDTUBE] = { 1840 .name = "Evga inDtube", 1841 .tuner_type = TUNER_XC2028, 1842 .tuner_gpio = default_tuner_gpio, 1843 .decoder = EM28XX_TVP5150, 1844 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */ 1845 .mts_firmware = 1, 1846 .has_dvb = 1, 1847 .dvb_gpio = evga_indtube_digital, 1848 .ir_codes = RC_MAP_EVGA_INDTUBE, 1849 .input = { { 1850 .type = EM28XX_VMUX_TELEVISION, 1851 .vmux = TVP5150_COMPOSITE0, 1852 .amux = EM28XX_AMUX_VIDEO, 1853 .gpio = evga_indtube_analog, 1854 }, { 1855 .type = EM28XX_VMUX_COMPOSITE1, 1856 .vmux = TVP5150_COMPOSITE1, 1857 .amux = EM28XX_AMUX_LINE_IN, 1858 .gpio = evga_indtube_analog, 1859 }, { 1860 .type = EM28XX_VMUX_SVIDEO, 1861 .vmux = TVP5150_SVIDEO, 1862 .amux = EM28XX_AMUX_LINE_IN, 1863 .gpio = evga_indtube_analog, 1864 } }, 1865 }, 1866 /* eb1a:2868 Empia EM2870 + Philips CU1216L NIM (Philips TDA10023 + 1867 Infineon TUA6034) */ 1868 [EM2870_BOARD_REDDO_DVB_C_USB_BOX] = { 1869 .name = "Reddo DVB-C USB TV Box", 1870 .tuner_type = TUNER_ABSENT, 1871 .tuner_gpio = reddo_dvb_c_usb_box, 1872 .has_dvb = 1, 1873 }, 1874 /* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold 1875 * initially as the KWorld PlusTV 340U, then as the UB435-Q. 1876 * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */ 1877 [EM2870_BOARD_KWORLD_A340] = { 1878 .name = "KWorld PlusTV 340U or UB435-Q (ATSC)", 1879 .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */ 1880 .has_dvb = 1, 1881 .dvb_gpio = kworld_a340_digital, 1882 .tuner_gpio = default_tuner_gpio, 1883 }, 1884 /* 2013:024f PCTV nanoStick T2 290e. 1885 * Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2 */ 1886 [EM28174_BOARD_PCTV_290E] = { 1887 .name = "PCTV nanoStick T2 290e", 1888 .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | 1889 EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ, 1890 .tuner_type = TUNER_ABSENT, 1891 .tuner_gpio = pctv_290e, 1892 .has_dvb = 1, 1893 .ir_codes = RC_MAP_PINNACLE_PCTV_HD, 1894 }, 1895 /* 2013:024f PCTV DVB-S2 Stick 460e 1896 * Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A8293 */ 1897 [EM28174_BOARD_PCTV_460E] = { 1898 .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | 1899 EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ, 1900 .name = "PCTV DVB-S2 Stick (460e)", 1901 .tuner_type = TUNER_ABSENT, 1902 .tuner_gpio = pctv_460e, 1903 .has_dvb = 1, 1904 .ir_codes = RC_MAP_PINNACLE_PCTV_HD, 1905 }, 1906 /* eb1a:5006 Honestech VIDBOX NW03 1907 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner */ 1908 [EM2860_BOARD_HT_VIDBOX_NW03] = { 1909 .name = "Honestech Vidbox NW03", 1910 .tuner_type = TUNER_ABSENT, 1911 .decoder = EM28XX_SAA711X, 1912 .input = { { 1913 .type = EM28XX_VMUX_COMPOSITE1, 1914 .vmux = SAA7115_COMPOSITE0, 1915 .amux = EM28XX_AMUX_LINE_IN, 1916 }, { 1917 .type = EM28XX_VMUX_SVIDEO, 1918 .vmux = SAA7115_SVIDEO3, /* S-VIDEO needs confirming */ 1919 .amux = EM28XX_AMUX_LINE_IN, 1920 } }, 1921 }, 1922 /* 1b80:e425 MaxMedia UB425-TC 1923 * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2 */ 1924 [EM2874_BOARD_MAXMEDIA_UB425_TC] = { 1925 .name = "MaxMedia UB425-TC", 1926 .tuner_type = TUNER_ABSENT, 1927 .tuner_gpio = maxmedia_ub425_tc, 1928 .has_dvb = 1, 1929 .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | 1930 EM28XX_I2C_CLK_WAIT_ENABLE | 1931 EM28XX_I2C_FREQ_400_KHZ, 1932 }, 1933}; 1934const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); 1935 1936/* table of devices that work with this driver */ 1937struct usb_device_id em28xx_id_table[] = { 1938 { USB_DEVICE(0xeb1a, 0x2750), 1939 .driver_info = EM2750_BOARD_UNKNOWN }, 1940 { USB_DEVICE(0xeb1a, 0x2751), 1941 .driver_info = EM2750_BOARD_UNKNOWN }, 1942 { USB_DEVICE(0xeb1a, 0x2800), 1943 .driver_info = EM2800_BOARD_UNKNOWN }, 1944 { USB_DEVICE(0xeb1a, 0x2710), 1945 .driver_info = EM2820_BOARD_UNKNOWN }, 1946 { USB_DEVICE(0xeb1a, 0x2820), 1947 .driver_info = EM2820_BOARD_UNKNOWN }, 1948 { USB_DEVICE(0xeb1a, 0x2821), 1949 .driver_info = EM2820_BOARD_UNKNOWN }, 1950 { USB_DEVICE(0xeb1a, 0x2860), 1951 .driver_info = EM2820_BOARD_UNKNOWN }, 1952 { USB_DEVICE(0xeb1a, 0x2861), 1953 .driver_info = EM2820_BOARD_UNKNOWN }, 1954 { USB_DEVICE(0xeb1a, 0x2862), 1955 .driver_info = EM2820_BOARD_UNKNOWN }, 1956 { USB_DEVICE(0xeb1a, 0x2863), 1957 .driver_info = EM2820_BOARD_UNKNOWN }, 1958 { USB_DEVICE(0xeb1a, 0x2870), 1959 .driver_info = EM2820_BOARD_UNKNOWN }, 1960 { USB_DEVICE(0xeb1a, 0x2881), 1961 .driver_info = EM2820_BOARD_UNKNOWN }, 1962 { USB_DEVICE(0xeb1a, 0x2883), 1963 .driver_info = EM2820_BOARD_UNKNOWN }, 1964 { USB_DEVICE(0xeb1a, 0x2868), 1965 .driver_info = EM2820_BOARD_UNKNOWN }, 1966 { USB_DEVICE(0xeb1a, 0x2875), 1967 .driver_info = EM2820_BOARD_UNKNOWN }, 1968 { USB_DEVICE(0xeb1a, 0xe300), 1969 .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U }, 1970 { USB_DEVICE(0xeb1a, 0xe303), 1971 .driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 }, 1972 { USB_DEVICE(0xeb1a, 0xe305), 1973 .driver_info = EM2880_BOARD_KWORLD_DVB_305U }, 1974 { USB_DEVICE(0xeb1a, 0xe310), 1975 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD }, 1976 { USB_DEVICE(0xeb1a, 0xa313), 1977 .driver_info = EM2882_BOARD_KWORLD_ATSC_315U }, 1978 { USB_DEVICE(0xeb1a, 0xa316), 1979 .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U }, 1980 { USB_DEVICE(0xeb1a, 0xe320), 1981 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II }, 1982 { USB_DEVICE(0xeb1a, 0xe323), 1983 .driver_info = EM2882_BOARD_KWORLD_VS_DVBT }, 1984 { USB_DEVICE(0xeb1a, 0xe350), 1985 .driver_info = EM2870_BOARD_KWORLD_350U }, 1986 { USB_DEVICE(0xeb1a, 0xe355), 1987 .driver_info = EM2870_BOARD_KWORLD_355U }, 1988 { USB_DEVICE(0xeb1a, 0x2801), 1989 .driver_info = EM2800_BOARD_GRABBEEX_USB2800 }, 1990 { USB_DEVICE(0xeb1a, 0xe357), 1991 .driver_info = EM2870_BOARD_KWORLD_355U }, 1992 { USB_DEVICE(0xeb1a, 0xe359), 1993 .driver_info = EM2870_BOARD_KWORLD_355U }, 1994 { USB_DEVICE(0x1b80, 0xe302), 1995 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */ 1996 { USB_DEVICE(0x1b80, 0xe304), 1997 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kworld DVD Maker 2 */ 1998 { USB_DEVICE(0x0ccd, 0x0036), 1999 .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 }, 2000 { USB_DEVICE(0x0ccd, 0x004c), 2001 .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR }, 2002 { USB_DEVICE(0x0ccd, 0x004f), 2003 .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS }, 2004 { USB_DEVICE(0x0ccd, 0x005e), 2005 .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS }, 2006 { USB_DEVICE(0x0ccd, 0x0042), 2007 .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS }, 2008 { USB_DEVICE(0x0ccd, 0x0043), 2009 .driver_info = EM2870_BOARD_TERRATEC_XS }, 2010 { USB_DEVICE(0x0ccd, 0x008e), /* Cinergy HTC USB XS Rev. 1 */ 2011 .driver_info = EM2884_BOARD_TERRATEC_H5 }, 2012 { USB_DEVICE(0x0ccd, 0x00ac), /* Cinergy HTC USB XS Rev. 2 */ 2013 .driver_info = EM2884_BOARD_TERRATEC_H5 }, 2014 { USB_DEVICE(0x0ccd, 0x10a2), /* H5 Rev. 1 */ 2015 .driver_info = EM2884_BOARD_TERRATEC_H5 }, 2016 { USB_DEVICE(0x0ccd, 0x10ad), /* H5 Rev. 2 */ 2017 .driver_info = EM2884_BOARD_TERRATEC_H5 }, 2018 { USB_DEVICE(0x0ccd, 0x0084), 2019 .driver_info = EM2860_BOARD_TERRATEC_AV350 }, 2020 { USB_DEVICE(0x0ccd, 0x0096), 2021 .driver_info = EM2860_BOARD_TERRATEC_GRABBY }, 2022 { USB_DEVICE(0x0ccd, 0x10AF), 2023 .driver_info = EM2860_BOARD_TERRATEC_GRABBY }, 2024 { USB_DEVICE(0x0ccd, 0x00b2), 2025 .driver_info = EM2884_BOARD_CINERGY_HTC_STICK }, 2026 { USB_DEVICE(0x0fd9, 0x0033), 2027 .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE}, 2028 { USB_DEVICE(0x185b, 0x2870), 2029 .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE }, 2030 { USB_DEVICE(0x185b, 0x2041), 2031 .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU }, 2032 { USB_DEVICE(0x2040, 0x4200), 2033 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, 2034 { USB_DEVICE(0x2040, 0x4201), 2035 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, 2036 { USB_DEVICE(0x2040, 0x6500), 2037 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, 2038 { USB_DEVICE(0x2040, 0x6502), 2039 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 }, 2040 { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */ 2041 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, 2042 { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */ 2043 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, 2044 { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */ 2045 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, 2046 { USB_DEVICE(0x2040, 0x651f), 2047 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 }, 2048 { USB_DEVICE(0x0438, 0xb002), 2049 .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 }, 2050 { USB_DEVICE(0x2001, 0xf112), 2051 .driver_info = EM2820_BOARD_DLINK_USB_TV }, 2052 { USB_DEVICE(0x2304, 0x0207), 2053 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, 2054 { USB_DEVICE(0x2304, 0x0208), 2055 .driver_info = EM2820_BOARD_PINNACLE_USB_2 }, 2056 { USB_DEVICE(0x2304, 0x021a), 2057 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, 2058 { USB_DEVICE(0x2304, 0x0226), 2059 .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E }, 2060 { USB_DEVICE(0x2304, 0x0227), 2061 .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO }, 2062 { USB_DEVICE(0x0413, 0x6023), 2063 .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII }, 2064 { USB_DEVICE(0x093b, 0xa003), 2065 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, 2066 { USB_DEVICE(0x093b, 0xa005), 2067 .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U }, 2068 { USB_DEVICE(0x04bb, 0x0515), 2069 .driver_info = EM2820_BOARD_IODATA_GVMVP_SZ }, 2070 { USB_DEVICE(0xeb1a, 0x50a6), 2071 .driver_info = EM2860_BOARD_GADMEI_UTV330 }, 2072 { USB_DEVICE(0x1b80, 0xa340), 2073 .driver_info = EM2870_BOARD_KWORLD_A340 }, 2074 { USB_DEVICE(0x2013, 0x024f), 2075 .driver_info = EM28174_BOARD_PCTV_290E }, 2076 { USB_DEVICE(0x2013, 0x024c), 2077 .driver_info = EM28174_BOARD_PCTV_460E }, 2078 { USB_DEVICE(0x2040, 0x1605), 2079 .driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C }, 2080 { USB_DEVICE(0xeb1a, 0x5006), 2081 .driver_info = EM2860_BOARD_HT_VIDBOX_NW03 }, 2082 { USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */ 2083 .driver_info = EM2860_BOARD_EASYCAP }, 2084 { USB_DEVICE(0x1b80, 0xe425), 2085 .driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC }, 2086 { }, 2087}; 2088MODULE_DEVICE_TABLE(usb, em28xx_id_table); 2089 2090/* 2091 * EEPROM hash table for devices with generic USB IDs 2092 */ 2093static struct em28xx_hash_table em28xx_eeprom_hash[] = { 2094 /* P/N: SA 60002070465 Tuner: TVF7533-MF */ 2095 {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF}, 2096 {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF}, 2097 {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028}, 2098 {0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028}, 2099 {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028}, 2100 {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028}, 2101 {0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT}, 2102 {0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028}, 2103}; 2104 2105/* I2C devicelist hash table for devices with generic USB IDs */ 2106static struct em28xx_hash_table em28xx_i2c_hash[] = { 2107 {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC}, 2108 {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC}, 2109 {0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT}, 2110 {0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT}, 2111 {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC}, 2112 {0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF}, 2113 {0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT}, 2114}; 2115 2116/* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */ 2117static unsigned short saa711x_addrs[] = { 2118 0x4a >> 1, 0x48 >> 1, /* SAA7111, SAA7111A and SAA7113 */ 2119 0x42 >> 1, 0x40 >> 1, /* SAA7114, SAA7115 and SAA7118 */ 2120 I2C_CLIENT_END }; 2121 2122static unsigned short tvp5150_addrs[] = { 2123 0xb8 >> 1, 2124 0xba >> 1, 2125 I2C_CLIENT_END 2126}; 2127 2128static unsigned short msp3400_addrs[] = { 2129 0x80 >> 1, 2130 0x88 >> 1, 2131 I2C_CLIENT_END 2132}; 2133 2134int em28xx_tuner_callback(void *ptr, int component, int command, int arg) 2135{ 2136 int rc = 0; 2137 struct em28xx *dev = ptr; 2138 2139 if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000) 2140 return 0; 2141 2142 if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET) 2143 return 0; 2144 2145 rc = em28xx_gpio_set(dev, dev->board.tuner_gpio); 2146 2147 return rc; 2148} 2149EXPORT_SYMBOL_GPL(em28xx_tuner_callback); 2150 2151static inline void em28xx_set_model(struct em28xx *dev) 2152{ 2153 memcpy(&dev->board, &em28xx_boards[dev->model], sizeof(dev->board)); 2154 2155 /* Those are the default values for the majority of boards 2156 Use those values if not specified otherwise at boards entry 2157 */ 2158 if (!dev->board.xclk) 2159 dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE | 2160 EM28XX_XCLK_FREQUENCY_12MHZ; 2161 2162 if (!dev->board.i2c_speed) 2163 dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | 2164 EM28XX_I2C_FREQ_100_KHZ; 2165} 2166 2167 2168/* FIXME: Should be replaced by a proper mt9m111 driver */ 2169static int em28xx_initialize_mt9m111(struct em28xx *dev) 2170{ 2171 int i; 2172 unsigned char regs[][3] = { 2173 { 0x0d, 0x00, 0x01, }, /* reset and use defaults */ 2174 { 0x0d, 0x00, 0x00, }, 2175 { 0x0a, 0x00, 0x21, }, 2176 { 0x21, 0x04, 0x00, }, /* full readout speed, no row/col skipping */ 2177 }; 2178 2179 for (i = 0; i < ARRAY_SIZE(regs); i++) 2180 i2c_master_send(&dev->i2c_client, ®s[i][0], 3); 2181 2182 return 0; 2183} 2184 2185 2186/* FIXME: Should be replaced by a proper mt9m001 driver */ 2187static int em28xx_initialize_mt9m001(struct em28xx *dev) 2188{ 2189 int i; 2190 unsigned char regs[][3] = { 2191 { 0x0d, 0x00, 0x01, }, 2192 { 0x0d, 0x00, 0x00, }, 2193 { 0x04, 0x05, 0x00, }, /* hres = 1280 */ 2194 { 0x03, 0x04, 0x00, }, /* vres = 1024 */ 2195 { 0x20, 0x11, 0x00, }, 2196 { 0x06, 0x00, 0x10, }, 2197 { 0x2b, 0x00, 0x24, }, 2198 { 0x2e, 0x00, 0x24, }, 2199 { 0x35, 0x00, 0x24, }, 2200 { 0x2d, 0x00, 0x20, }, 2201 { 0x2c, 0x00, 0x20, }, 2202 { 0x09, 0x0a, 0xd4, }, 2203 { 0x35, 0x00, 0x57, }, 2204 }; 2205 2206 for (i = 0; i < ARRAY_SIZE(regs); i++) 2207 i2c_master_send(&dev->i2c_client, ®s[i][0], 3); 2208 2209 return 0; 2210} 2211 2212/* HINT method: webcam I2C chips 2213 * 2214 * This method works for webcams with Micron sensors 2215 */ 2216static int em28xx_hint_sensor(struct em28xx *dev) 2217{ 2218 int rc; 2219 char *sensor_name; 2220 unsigned char cmd; 2221 __be16 version_be; 2222 u16 version; 2223 2224 /* Micron sensor detection */ 2225 dev->i2c_client.addr = 0xba >> 1; 2226 cmd = 0; 2227 i2c_master_send(&dev->i2c_client, &cmd, 1); 2228 rc = i2c_master_recv(&dev->i2c_client, (char *)&version_be, 2); 2229 if (rc != 2) 2230 return -EINVAL; 2231 2232 version = be16_to_cpu(version_be); 2233 switch (version) { 2234 case 0x8232: /* mt9v011 640x480 1.3 Mpix sensor */ 2235 case 0x8243: /* mt9v011 rev B 640x480 1.3 Mpix sensor */ 2236 dev->model = EM2820_BOARD_SILVERCREST_WEBCAM; 2237 em28xx_set_model(dev); 2238 2239 sensor_name = "mt9v011"; 2240 dev->em28xx_sensor = EM28XX_MT9V011; 2241 dev->sensor_xres = 640; 2242 dev->sensor_yres = 480; 2243 /* 2244 * FIXME: mt9v011 uses I2S speed as xtal clk - at least with 2245 * the Silvercrest cam I have here for testing - for higher 2246 * resolutions, a high clock cause horizontal artifacts, so we 2247 * need to use a lower xclk frequency. 2248 * Yet, it would be possible to adjust xclk depending on the 2249 * desired resolution, since this affects directly the 2250 * frame rate. 2251 */ 2252 dev->board.xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ; 2253 dev->sensor_xtal = 4300000; 2254 2255 /* probably means GRGB 16 bit bayer */ 2256 dev->vinmode = 0x0d; 2257 dev->vinctl = 0x00; 2258 2259 break; 2260 2261 case 0x143a: /* MT9M111 as found in the ECS G200 */ 2262 dev->model = EM2750_BOARD_UNKNOWN; 2263 em28xx_set_model(dev); 2264 2265 sensor_name = "mt9m111"; 2266 dev->board.xclk = EM28XX_XCLK_FREQUENCY_48MHZ; 2267 dev->em28xx_sensor = EM28XX_MT9M111; 2268 em28xx_initialize_mt9m111(dev); 2269 dev->sensor_xres = 640; 2270 dev->sensor_yres = 512; 2271 2272 dev->vinmode = 0x0a; 2273 dev->vinctl = 0x00; 2274 2275 break; 2276 2277 case 0x8431: 2278 dev->model = EM2750_BOARD_UNKNOWN; 2279 em28xx_set_model(dev); 2280 2281 sensor_name = "mt9m001"; 2282 dev->em28xx_sensor = EM28XX_MT9M001; 2283 em28xx_initialize_mt9m001(dev); 2284 dev->sensor_xres = 1280; 2285 dev->sensor_yres = 1024; 2286 2287 /* probably means BGGR 16 bit bayer */ 2288 dev->vinmode = 0x0c; 2289 dev->vinctl = 0x00; 2290 2291 break; 2292 default: 2293 printk("Unknown Micron Sensor 0x%04x\n", version); 2294 return -EINVAL; 2295 } 2296 2297 /* Setup webcam defaults */ 2298 em28xx_pre_card_setup(dev); 2299 2300 em28xx_errdev("Sensor is %s, using model %s entry.\n", 2301 sensor_name, em28xx_boards[dev->model].name); 2302 2303 return 0; 2304} 2305 2306/* Since em28xx_pre_card_setup() requires a proper dev->model, 2307 * this won't work for boards with generic PCI IDs 2308 */ 2309void em28xx_pre_card_setup(struct em28xx *dev) 2310{ 2311 /* Set the initial XCLK and I2C clock values based on the board 2312 definition */ 2313 em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f); 2314 if (!dev->board.is_em2800) 2315 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed); 2316 msleep(50); 2317 2318 /* request some modules */ 2319 switch (dev->model) { 2320 case EM2861_BOARD_PLEXTOR_PX_TV100U: 2321 /* Sets the msp34xx I2S speed */ 2322 dev->i2s_speed = 2048000; 2323 break; 2324 case EM2861_BOARD_KWORLD_PVRTV_300U: 2325 case EM2880_BOARD_KWORLD_DVB_305U: 2326 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x6d); 2327 msleep(10); 2328 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d); 2329 msleep(10); 2330 break; 2331 case EM2870_BOARD_COMPRO_VIDEOMATE: 2332 /* TODO: someone can do some cleanup here... 2333 not everything's needed */ 2334 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00); 2335 msleep(10); 2336 em28xx_write_reg(dev, EM2880_R04_GPO, 0x01); 2337 msleep(10); 2338 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); 2339 mdelay(70); 2340 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc); 2341 mdelay(70); 2342 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xdc); 2343 mdelay(70); 2344 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc); 2345 mdelay(70); 2346 break; 2347 case EM2870_BOARD_TERRATEC_XS_MT2060: 2348 /* this device needs some gpio writes to get the DVB-T 2349 demod work */ 2350 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); 2351 mdelay(70); 2352 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde); 2353 mdelay(70); 2354 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); 2355 mdelay(70); 2356 break; 2357 case EM2870_BOARD_PINNACLE_PCTV_DVB: 2358 /* this device needs some gpio writes to get the 2359 DVB-T demod work */ 2360 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); 2361 mdelay(70); 2362 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde); 2363 mdelay(70); 2364 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); 2365 mdelay(70); 2366 break; 2367 case EM2820_BOARD_GADMEI_UTV310: 2368 case EM2820_BOARD_MSI_VOX_USB_2: 2369 /* enables audio for that devices */ 2370 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); 2371 break; 2372 2373 case EM2882_BOARD_KWORLD_ATSC_315U: 2374 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff); 2375 msleep(10); 2376 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); 2377 msleep(10); 2378 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00); 2379 msleep(10); 2380 em28xx_write_reg(dev, EM2880_R04_GPO, 0x08); 2381 msleep(10); 2382 break; 2383 2384 case EM2860_BOARD_KAIOMY_TVNPC_U2: 2385 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1); 2386 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 2387 em28xx_write_regs(dev, 0x0d, "\x42", 1); 2388 em28xx_write_regs(dev, 0x08, "\xfd", 1); 2389 msleep(10); 2390 em28xx_write_regs(dev, 0x08, "\xff", 1); 2391 msleep(10); 2392 em28xx_write_regs(dev, 0x08, "\x7f", 1); 2393 msleep(10); 2394 em28xx_write_regs(dev, 0x08, "\x6b", 1); 2395 2396 break; 2397 case EM2860_BOARD_EASYCAP: 2398 em28xx_write_regs(dev, 0x08, "\xf8", 1); 2399 break; 2400 2401 case EM2820_BOARD_IODATA_GVMVP_SZ: 2402 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff); 2403 msleep(70); 2404 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7); 2405 msleep(10); 2406 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); 2407 msleep(70); 2408 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); 2409 msleep(70); 2410 break; 2411 } 2412 2413 em28xx_gpio_set(dev, dev->board.tuner_gpio); 2414 em28xx_set_mode(dev, EM28XX_ANALOG_MODE); 2415 2416 /* Unlock device */ 2417 em28xx_set_mode(dev, EM28XX_SUSPEND); 2418} 2419 2420static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl) 2421{ 2422 memset(ctl, 0, sizeof(*ctl)); 2423 2424 ctl->fname = XC2028_DEFAULT_FIRMWARE; 2425 ctl->max_len = 64; 2426 ctl->mts = em28xx_boards[dev->model].mts_firmware; 2427 2428 switch (dev->model) { 2429 case EM2880_BOARD_EMPIRE_DUAL_TV: 2430 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: 2431 case EM2882_BOARD_TERRATEC_HYBRID_XS: 2432 ctl->demod = XC3028_FE_ZARLINK456; 2433 break; 2434 case EM2880_BOARD_TERRATEC_HYBRID_XS: 2435 case EM2880_BOARD_TERRATEC_HYBRID_XS_FR: 2436 case EM2881_BOARD_PINNACLE_HYBRID_PRO: 2437 ctl->demod = XC3028_FE_ZARLINK456; 2438 break; 2439 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: 2440 case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E: 2441 ctl->demod = XC3028_FE_DEFAULT; 2442 break; 2443 case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600: 2444 ctl->demod = XC3028_FE_DEFAULT; 2445 ctl->fname = XC3028L_DEFAULT_FIRMWARE; 2446 break; 2447 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850: 2448 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: 2449 case EM2880_BOARD_PINNACLE_PCTV_HD_PRO: 2450 /* FIXME: Better to specify the needed IF */ 2451 ctl->demod = XC3028_FE_DEFAULT; 2452 break; 2453 case EM2883_BOARD_KWORLD_HYBRID_330U: 2454 case EM2882_BOARD_DIKOM_DK300: 2455 case EM2882_BOARD_KWORLD_VS_DVBT: 2456 ctl->demod = XC3028_FE_CHINA; 2457 ctl->fname = XC2028_DEFAULT_FIRMWARE; 2458 break; 2459 case EM2882_BOARD_EVGA_INDTUBE: 2460 ctl->demod = XC3028_FE_CHINA; 2461 ctl->fname = XC3028L_DEFAULT_FIRMWARE; 2462 break; 2463 default: 2464 ctl->demod = XC3028_FE_OREN538; 2465 } 2466} 2467 2468static void em28xx_tuner_setup(struct em28xx *dev) 2469{ 2470 struct tuner_setup tun_setup; 2471 struct v4l2_frequency f; 2472 2473 if (dev->tuner_type == TUNER_ABSENT) 2474 return; 2475 2476 memset(&tun_setup, 0, sizeof(tun_setup)); 2477 2478 tun_setup.mode_mask = T_ANALOG_TV | T_RADIO; 2479 tun_setup.tuner_callback = em28xx_tuner_callback; 2480 2481 if (dev->board.radio.type) { 2482 tun_setup.type = dev->board.radio.type; 2483 tun_setup.addr = dev->board.radio_addr; 2484 2485 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup); 2486 } 2487 2488 if ((dev->tuner_type != TUNER_ABSENT) && (dev->tuner_type)) { 2489 tun_setup.type = dev->tuner_type; 2490 tun_setup.addr = dev->tuner_addr; 2491 2492 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup); 2493 } 2494 2495 if (dev->tda9887_conf) { 2496 struct v4l2_priv_tun_config tda9887_cfg; 2497 2498 tda9887_cfg.tuner = TUNER_TDA9887; 2499 tda9887_cfg.priv = &dev->tda9887_conf; 2500 2501 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &tda9887_cfg); 2502 } 2503 2504 if (dev->tuner_type == TUNER_XC2028) { 2505 struct v4l2_priv_tun_config xc2028_cfg; 2506 struct xc2028_ctrl ctl; 2507 2508 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg)); 2509 memset(&ctl, 0, sizeof(ctl)); 2510 2511 em28xx_setup_xc3028(dev, &ctl); 2512 2513 xc2028_cfg.tuner = TUNER_XC2028; 2514 xc2028_cfg.priv = &ctl; 2515 2516 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &xc2028_cfg); 2517 } 2518 2519 /* configure tuner */ 2520 f.tuner = 0; 2521 f.type = V4L2_TUNER_ANALOG_TV; 2522 f.frequency = 9076; /* just a magic number */ 2523 dev->ctl_freq = f.frequency; 2524 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f); 2525} 2526 2527static int em28xx_hint_board(struct em28xx *dev) 2528{ 2529 int i; 2530 2531 /* HINT method: EEPROM 2532 * 2533 * This method works only for boards with eeprom. 2534 * Uses a hash of all eeprom bytes. The hash should be 2535 * unique for a vendor/tuner pair. 2536 * There are a high chance that tuners for different 2537 * video standards produce different hashes. 2538 */ 2539 for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) { 2540 if (dev->hash == em28xx_eeprom_hash[i].hash) { 2541 dev->model = em28xx_eeprom_hash[i].model; 2542 dev->tuner_type = em28xx_eeprom_hash[i].tuner; 2543 2544 em28xx_errdev("Your board has no unique USB ID.\n"); 2545 em28xx_errdev("A hint were successfully done, " 2546 "based on eeprom hash.\n"); 2547 em28xx_errdev("This method is not 100%% failproof.\n"); 2548 em28xx_errdev("If the board were missdetected, " 2549 "please email this log to:\n"); 2550 em28xx_errdev("\tV4L Mailing List " 2551 " <linux-media@vger.kernel.org>\n"); 2552 em28xx_errdev("Board detected as %s\n", 2553 em28xx_boards[dev->model].name); 2554 2555 return 0; 2556 } 2557 } 2558 2559 /* HINT method: I2C attached devices 2560 * 2561 * This method works for all boards. 2562 * Uses a hash of i2c scanned devices. 2563 * Devices with the same i2c attached chips will 2564 * be considered equal. 2565 * This method is less precise than the eeprom one. 2566 */ 2567 2568 /* user did not request i2c scanning => do it now */ 2569 if (!dev->i2c_hash) 2570 em28xx_do_i2c_scan(dev); 2571 2572 for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) { 2573 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) { 2574 dev->model = em28xx_i2c_hash[i].model; 2575 dev->tuner_type = em28xx_i2c_hash[i].tuner; 2576 em28xx_errdev("Your board has no unique USB ID.\n"); 2577 em28xx_errdev("A hint were successfully done, " 2578 "based on i2c devicelist hash.\n"); 2579 em28xx_errdev("This method is not 100%% failproof.\n"); 2580 em28xx_errdev("If the board were missdetected, " 2581 "please email this log to:\n"); 2582 em28xx_errdev("\tV4L Mailing List " 2583 " <linux-media@vger.kernel.org>\n"); 2584 em28xx_errdev("Board detected as %s\n", 2585 em28xx_boards[dev->model].name); 2586 2587 return 0; 2588 } 2589 } 2590 2591 em28xx_errdev("Your board has no unique USB ID and thus need a " 2592 "hint to be detected.\n"); 2593 em28xx_errdev("You may try to use card=<n> insmod option to " 2594 "workaround that.\n"); 2595 em28xx_errdev("Please send an email with this log to:\n"); 2596 em28xx_errdev("\tV4L Mailing List <linux-media@vger.kernel.org>\n"); 2597 em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash); 2598 em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash); 2599 2600 em28xx_errdev("Here is a list of valid choices for the card=<n>" 2601 " insmod option:\n"); 2602 for (i = 0; i < em28xx_bcount; i++) { 2603 em28xx_errdev(" card=%d -> %s\n", 2604 i, em28xx_boards[i].name); 2605 } 2606 return -1; 2607} 2608 2609/* ----------------------------------------------------------------------- */ 2610void em28xx_register_i2c_ir(struct em28xx *dev) 2611{ 2612 /* Leadtek winfast tv USBII deluxe can find a non working IR-device */ 2613 /* at address 0x18, so if that address is needed for another board in */ 2614 /* the future, please put it after 0x1f. */ 2615 struct i2c_board_info info; 2616 const unsigned short addr_list[] = { 2617 0x1f, 0x30, 0x47, I2C_CLIENT_END 2618 }; 2619 2620 if (disable_ir) 2621 return; 2622 2623 memset(&info, 0, sizeof(struct i2c_board_info)); 2624 memset(&dev->init_data, 0, sizeof(dev->init_data)); 2625 strlcpy(info.type, "ir_video", I2C_NAME_SIZE); 2626 2627 /* detect & configure */ 2628 switch (dev->model) { 2629 case EM2800_BOARD_TERRATEC_CINERGY_200: 2630 case EM2820_BOARD_TERRATEC_CINERGY_250: 2631 dev->init_data.ir_codes = RC_MAP_EM_TERRATEC; 2632 dev->init_data.get_key = em28xx_get_key_terratec; 2633 dev->init_data.name = "i2c IR (EM28XX Terratec)"; 2634 break; 2635 case EM2820_BOARD_PINNACLE_USB_2: 2636 dev->init_data.ir_codes = RC_MAP_PINNACLE_GREY; 2637 dev->init_data.get_key = em28xx_get_key_pinnacle_usb_grey; 2638 dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)"; 2639 break; 2640 case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: 2641 dev->init_data.ir_codes = RC_MAP_HAUPPAUGE; 2642 dev->init_data.get_key = em28xx_get_key_em_haup; 2643 dev->init_data.name = "i2c IR (EM2840 Hauppauge)"; 2644 break; 2645 case EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE: 2646 dev->init_data.ir_codes = RC_MAP_WINFAST_USBII_DELUXE; 2647 dev->init_data.get_key = em28xx_get_key_winfast_usbii_deluxe; 2648 dev->init_data.name = "i2c IR (EM2820 Winfast TV USBII Deluxe)"; 2649 break; 2650 } 2651 2652 if (dev->init_data.name) 2653 info.platform_data = &dev->init_data; 2654 i2c_new_probed_device(&dev->i2c_adap, &info, addr_list, NULL); 2655} 2656 2657void em28xx_card_setup(struct em28xx *dev) 2658{ 2659 /* 2660 * If the device can be a webcam, seek for a sensor. 2661 * If sensor is not found, then it isn't a webcam. 2662 */ 2663 if (dev->board.is_webcam) { 2664 if (em28xx_hint_sensor(dev) < 0) 2665 dev->board.is_webcam = 0; 2666 else 2667 dev->progressive = 1; 2668 } 2669 2670 if (!dev->board.is_webcam) { 2671 switch (dev->model) { 2672 case EM2820_BOARD_UNKNOWN: 2673 case EM2800_BOARD_UNKNOWN: 2674 /* 2675 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD. 2676 * 2677 * This occurs because they share identical USB vendor and 2678 * product IDs. 2679 * 2680 * What we do here is look up the EEPROM hash of the K-WORLD 2681 * and if it is found then we decide that we do not have 2682 * a DIGIVOX and reset the device to the K-WORLD instead. 2683 * 2684 * This solution is only valid if they do not share eeprom 2685 * hash identities which has not been determined as yet. 2686 */ 2687 if (em28xx_hint_board(dev) < 0) 2688 em28xx_errdev("Board not discovered\n"); 2689 else { 2690 em28xx_set_model(dev); 2691 em28xx_pre_card_setup(dev); 2692 } 2693 break; 2694 default: 2695 em28xx_set_model(dev); 2696 } 2697 } 2698 2699 em28xx_info("Identified as %s (card=%d)\n", 2700 dev->board.name, dev->model); 2701 2702 dev->tuner_type = em28xx_boards[dev->model].tuner_type; 2703 if (em28xx_boards[dev->model].tuner_addr) 2704 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr; 2705 2706 if (em28xx_boards[dev->model].tda9887_conf) 2707 dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf; 2708 2709 /* request some modules */ 2710 switch (dev->model) { 2711 case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: 2712 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: 2713 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: 2714 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850: 2715 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: 2716 { 2717 struct tveeprom tv; 2718#if defined(CONFIG_MODULES) && defined(MODULE) 2719 request_module("tveeprom"); 2720#endif 2721 /* Call first TVeeprom */ 2722 2723 dev->i2c_client.addr = 0xa0 >> 1; 2724 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata); 2725 2726 dev->tuner_type = tv.tuner_type; 2727 2728 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) { 2729 dev->i2s_speed = 2048000; 2730 dev->board.has_msp34xx = 1; 2731 } 2732 break; 2733 } 2734 case EM2882_BOARD_KWORLD_ATSC_315U: 2735 em28xx_write_reg(dev, 0x0d, 0x42); 2736 msleep(10); 2737 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); 2738 msleep(10); 2739 break; 2740 case EM2820_BOARD_KWORLD_PVRTV2800RF: 2741 /* GPIO enables sound on KWORLD PVR TV 2800RF */ 2742 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9); 2743 break; 2744 case EM2820_BOARD_UNKNOWN: 2745 case EM2800_BOARD_UNKNOWN: 2746 /* 2747 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD. 2748 * 2749 * This occurs because they share identical USB vendor and 2750 * product IDs. 2751 * 2752 * What we do here is look up the EEPROM hash of the K-WORLD 2753 * and if it is found then we decide that we do not have 2754 * a DIGIVOX and reset the device to the K-WORLD instead. 2755 * 2756 * This solution is only valid if they do not share eeprom 2757 * hash identities which has not been determined as yet. 2758 */ 2759 case EM2880_BOARD_MSI_DIGIVOX_AD: 2760 if (!em28xx_hint_board(dev)) 2761 em28xx_set_model(dev); 2762 2763 /* In cases where we had to use a board hint, the call to 2764 em28xx_set_mode() in em28xx_pre_card_setup() was a no-op, 2765 so make the call now so the analog GPIOs are set properly 2766 before probing the i2c bus. */ 2767 em28xx_gpio_set(dev, dev->board.tuner_gpio); 2768 em28xx_set_mode(dev, EM28XX_ANALOG_MODE); 2769 break; 2770 2771/* 2772 * The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR. 2773 * 2774 * This occurs because they share identical USB vendor and 2775 * product IDs. 2776 * 2777 * What we do here is look up the EEPROM hash of the Dikom 2778 * and if it is found then we decide that we do not have 2779 * a Kworld and reset the device to the Dikom instead. 2780 * 2781 * This solution is only valid if they do not share eeprom 2782 * hash identities which has not been determined as yet. 2783 */ 2784 case EM2882_BOARD_KWORLD_VS_DVBT: 2785 if (!em28xx_hint_board(dev)) 2786 em28xx_set_model(dev); 2787 2788 /* In cases where we had to use a board hint, the call to 2789 em28xx_set_mode() in em28xx_pre_card_setup() was a no-op, 2790 so make the call now so the analog GPIOs are set properly 2791 before probing the i2c bus. */ 2792 em28xx_gpio_set(dev, dev->board.tuner_gpio); 2793 em28xx_set_mode(dev, EM28XX_ANALOG_MODE); 2794 break; 2795 } 2796 2797#if defined(CONFIG_MODULES) && defined(MODULE) 2798 if (dev->board.has_ir_i2c && !disable_ir) 2799 request_module("ir-kbd-i2c"); 2800#endif 2801 if (dev->board.has_snapshot_button) 2802 em28xx_register_snapshot_button(dev); 2803 2804 if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) { 2805 em28xx_errdev("\n\n"); 2806 em28xx_errdev("The support for this board weren't " 2807 "valid yet.\n"); 2808 em28xx_errdev("Please send a report of having this working\n"); 2809 em28xx_errdev("not to V4L mailing list (and/or to other " 2810 "addresses)\n\n"); 2811 } 2812 2813 /* Allow override tuner type by a module parameter */ 2814 if (tuner >= 0) 2815 dev->tuner_type = tuner; 2816 2817 /* request some modules */ 2818 if (dev->board.has_msp34xx) 2819 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, 2820 "msp3400", 0, msp3400_addrs); 2821 2822 if (dev->board.decoder == EM28XX_SAA711X) 2823 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, 2824 "saa7115_auto", 0, saa711x_addrs); 2825 2826 if (dev->board.decoder == EM28XX_TVP5150) 2827 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, 2828 "tvp5150", 0, tvp5150_addrs); 2829 2830 if (dev->em28xx_sensor == EM28XX_MT9V011) { 2831 struct mt9v011_platform_data pdata; 2832 struct i2c_board_info mt9v011_info = { 2833 .type = "mt9v011", 2834 .addr = 0xba >> 1, 2835 .platform_data = &pdata, 2836 }; 2837 2838 pdata.xtal = dev->sensor_xtal; 2839 v4l2_i2c_new_subdev_board(&dev->v4l2_dev, &dev->i2c_adap, 2840 &mt9v011_info, NULL); 2841 } 2842 2843 2844 if (dev->board.adecoder == EM28XX_TVAUDIO) 2845 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, 2846 "tvaudio", dev->board.tvaudio_addr, NULL); 2847 2848 if (dev->board.tuner_type != TUNER_ABSENT) { 2849 int has_demod = (dev->tda9887_conf & TDA9887_PRESENT); 2850 2851 if (dev->board.radio.type) 2852 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, 2853 "tuner", dev->board.radio_addr, NULL); 2854 2855 if (has_demod) 2856 v4l2_i2c_new_subdev(&dev->v4l2_dev, 2857 &dev->i2c_adap, "tuner", 2858 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD)); 2859 if (dev->tuner_addr == 0) { 2860 enum v4l2_i2c_tuner_type type = 2861 has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV; 2862 struct v4l2_subdev *sd; 2863 2864 sd = v4l2_i2c_new_subdev(&dev->v4l2_dev, 2865 &dev->i2c_adap, "tuner", 2866 0, v4l2_i2c_tuner_addrs(type)); 2867 2868 if (sd) 2869 dev->tuner_addr = v4l2_i2c_subdev_addr(sd); 2870 } else { 2871 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, 2872 "tuner", dev->tuner_addr, NULL); 2873 } 2874 } 2875 2876 em28xx_tuner_setup(dev); 2877 2878 if(!disable_ir) 2879 em28xx_ir_init(dev); 2880} 2881 2882 2883#if defined(CONFIG_MODULES) && defined(MODULE) 2884static void request_module_async(struct work_struct *work) 2885{ 2886 struct em28xx *dev = container_of(work, 2887 struct em28xx, request_module_wk); 2888 2889 if (dev->has_audio_class) 2890 request_module("snd-usb-audio"); 2891 else if (dev->has_alsa_audio) 2892 request_module("em28xx-alsa"); 2893 2894 if (dev->board.has_dvb) 2895 request_module("em28xx-dvb"); 2896} 2897 2898static void request_modules(struct em28xx *dev) 2899{ 2900 INIT_WORK(&dev->request_module_wk, request_module_async); 2901 schedule_work(&dev->request_module_wk); 2902} 2903 2904static void flush_request_modules(struct em28xx *dev) 2905{ 2906 flush_work_sync(&dev->request_module_wk); 2907} 2908#else 2909#define request_modules(dev) 2910#define flush_request_modules(dev) 2911#endif /* CONFIG_MODULES */ 2912 2913/* 2914 * em28xx_release_resources() 2915 * unregisters the v4l2,i2c and usb devices 2916 * called when the device gets disconnected or at module unload 2917*/ 2918void em28xx_release_resources(struct em28xx *dev) 2919{ 2920 if (dev->sbutton_input_dev) 2921 em28xx_deregister_snapshot_button(dev); 2922 2923 if (dev->ir) 2924 em28xx_ir_fini(dev); 2925 2926 /*FIXME: I2C IR should be disconnected */ 2927 2928 em28xx_release_analog_resources(dev); 2929 2930 em28xx_i2c_unregister(dev); 2931 2932 v4l2_device_unregister(&dev->v4l2_dev); 2933 2934 usb_put_dev(dev->udev); 2935 2936 /* Mark device as unused */ 2937 clear_bit(dev->devno, &em28xx_devused); 2938}; 2939 2940/* 2941 * em28xx_init_dev() 2942 * allocates and inits the device structs, registers i2c bus and v4l device 2943 */ 2944static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev, 2945 struct usb_interface *interface, 2946 int minor) 2947{ 2948 int retval; 2949 2950 dev->udev = udev; 2951 mutex_init(&dev->ctrl_urb_lock); 2952 spin_lock_init(&dev->slock); 2953 init_waitqueue_head(&dev->open); 2954 init_waitqueue_head(&dev->wait_frame); 2955 init_waitqueue_head(&dev->wait_stream); 2956 2957 dev->em28xx_write_regs = em28xx_write_regs; 2958 dev->em28xx_read_reg = em28xx_read_reg; 2959 dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len; 2960 dev->em28xx_write_regs_req = em28xx_write_regs_req; 2961 dev->em28xx_read_reg_req = em28xx_read_reg_req; 2962 dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800; 2963 2964 em28xx_set_model(dev); 2965 2966 /* Set the default GPO/GPIO for legacy devices */ 2967 dev->reg_gpo_num = EM2880_R04_GPO; 2968 dev->reg_gpio_num = EM28XX_R08_GPIO; 2969 2970 dev->wait_after_write = 5; 2971 2972 /* Based on the Chip ID, set the device configuration */ 2973 retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID); 2974 if (retval > 0) { 2975 dev->chip_id = retval; 2976 2977 switch (dev->chip_id) { 2978 case CHIP_ID_EM2800: 2979 em28xx_info("chip ID is em2800\n"); 2980 break; 2981 case CHIP_ID_EM2710: 2982 em28xx_info("chip ID is em2710\n"); 2983 break; 2984 case CHIP_ID_EM2750: 2985 em28xx_info("chip ID is em2750\n"); 2986 break; 2987 case CHIP_ID_EM2820: 2988 em28xx_info("chip ID is em2820 (or em2710)\n"); 2989 break; 2990 case CHIP_ID_EM2840: 2991 em28xx_info("chip ID is em2840\n"); 2992 break; 2993 case CHIP_ID_EM2860: 2994 em28xx_info("chip ID is em2860\n"); 2995 break; 2996 case CHIP_ID_EM2870: 2997 em28xx_info("chip ID is em2870\n"); 2998 dev->wait_after_write = 0; 2999 break; 3000 case CHIP_ID_EM2874: 3001 em28xx_info("chip ID is em2874\n"); 3002 dev->reg_gpio_num = EM2874_R80_GPIO; 3003 dev->wait_after_write = 0; 3004 break; 3005 case CHIP_ID_EM28174: 3006 em28xx_info("chip ID is em28174\n"); 3007 dev->reg_gpio_num = EM2874_R80_GPIO; 3008 dev->wait_after_write = 0; 3009 break; 3010 case CHIP_ID_EM2883: 3011 em28xx_info("chip ID is em2882/em2883\n"); 3012 dev->wait_after_write = 0; 3013 break; 3014 case CHIP_ID_EM2884: 3015 em28xx_info("chip ID is em2884\n"); 3016 dev->reg_gpio_num = EM2874_R80_GPIO; 3017 dev->wait_after_write = 0; 3018 break; 3019 default: 3020 em28xx_info("em28xx chip ID = %d\n", dev->chip_id); 3021 } 3022 } 3023 3024 if (dev->is_audio_only) { 3025 retval = em28xx_audio_setup(dev); 3026 if (retval) 3027 return -ENODEV; 3028 em28xx_init_extension(dev); 3029 3030 return 0; 3031 } 3032 3033 /* Prepopulate cached GPO register content */ 3034 retval = em28xx_read_reg(dev, dev->reg_gpo_num); 3035 if (retval >= 0) 3036 dev->reg_gpo = retval; 3037 3038 em28xx_pre_card_setup(dev); 3039 3040 if (!dev->board.is_em2800) { 3041 /* Resets I2C speed */ 3042 retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed); 3043 if (retval < 0) { 3044 em28xx_errdev("%s: em28xx_write_reg failed!" 3045 " retval [%d]\n", 3046 __func__, retval); 3047 return retval; 3048 } 3049 } 3050 3051 retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev); 3052 if (retval < 0) { 3053 em28xx_errdev("Call to v4l2_device_register() failed!\n"); 3054 return retval; 3055 } 3056 3057 /* register i2c bus */ 3058 retval = em28xx_i2c_register(dev); 3059 if (retval < 0) { 3060 em28xx_errdev("%s: em28xx_i2c_register - error [%d]!\n", 3061 __func__, retval); 3062 goto unregister_dev; 3063 } 3064 3065 /* 3066 * Default format, used for tvp5150 or saa711x output formats 3067 */ 3068 dev->vinmode = 0x10; 3069 dev->vinctl = EM28XX_VINCTRL_INTERLACED | 3070 EM28XX_VINCTRL_CCIR656_ENABLE; 3071 3072 /* Do board specific init and eeprom reading */ 3073 em28xx_card_setup(dev); 3074 3075 /* Configure audio */ 3076 retval = em28xx_audio_setup(dev); 3077 if (retval < 0) { 3078 em28xx_errdev("%s: Error while setting audio - error [%d]!\n", 3079 __func__, retval); 3080 goto fail; 3081 } 3082 3083 /* wake i2c devices */ 3084 em28xx_wake_i2c(dev); 3085 3086 /* init video dma queues */ 3087 INIT_LIST_HEAD(&dev->vidq.active); 3088 INIT_LIST_HEAD(&dev->vidq.queued); 3089 INIT_LIST_HEAD(&dev->vbiq.active); 3090 INIT_LIST_HEAD(&dev->vbiq.queued); 3091 3092 if (dev->board.has_msp34xx) { 3093 /* Send a reset to other chips via gpio */ 3094 retval = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7); 3095 if (retval < 0) { 3096 em28xx_errdev("%s: em28xx_write_reg - " 3097 "msp34xx(1) failed! error [%d]\n", 3098 __func__, retval); 3099 goto fail; 3100 } 3101 msleep(3); 3102 3103 retval = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff); 3104 if (retval < 0) { 3105 em28xx_errdev("%s: em28xx_write_reg - " 3106 "msp34xx(2) failed! error [%d]\n", 3107 __func__, retval); 3108 goto fail; 3109 } 3110 msleep(3); 3111 } 3112 3113 retval = em28xx_register_analog_devices(dev); 3114 if (retval < 0) { 3115 goto fail; 3116 } 3117 3118 /* Save some power by putting tuner to sleep */ 3119 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 0); 3120 3121 return 0; 3122 3123fail: 3124 em28xx_i2c_unregister(dev); 3125 3126unregister_dev: 3127 v4l2_device_unregister(&dev->v4l2_dev); 3128 3129 return retval; 3130} 3131 3132/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */ 3133#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03)) 3134 3135/* 3136 * em28xx_usb_probe() 3137 * checks for supported devices 3138 */ 3139static int em28xx_usb_probe(struct usb_interface *interface, 3140 const struct usb_device_id *id) 3141{ 3142 struct usb_device *udev; 3143 struct em28xx *dev = NULL; 3144 int retval; 3145 bool has_audio = false, has_video = false, has_dvb = false; 3146 int i, nr; 3147 const int ifnum = interface->altsetting[0].desc.bInterfaceNumber; 3148 char *speed; 3149 3150 udev = usb_get_dev(interface_to_usbdev(interface)); 3151 3152 /* Check to see next free device and mark as used */ 3153 do { 3154 nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS); 3155 if (nr >= EM28XX_MAXBOARDS) { 3156 /* No free device slots */ 3157 printk(DRIVER_NAME ": Supports only %i em28xx boards.\n", 3158 EM28XX_MAXBOARDS); 3159 retval = -ENOMEM; 3160 goto err_no_slot; 3161 } 3162 } while (test_and_set_bit(nr, &em28xx_devused)); 3163 3164 /* Don't register audio interfaces */ 3165 if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) { 3166 em28xx_err(DRIVER_NAME " audio device (%04x:%04x): " 3167 "interface %i, class %i\n", 3168 le16_to_cpu(udev->descriptor.idVendor), 3169 le16_to_cpu(udev->descriptor.idProduct), 3170 ifnum, 3171 interface->altsetting[0].desc.bInterfaceClass); 3172 3173 retval = -ENODEV; 3174 goto err; 3175 } 3176 3177 /* allocate memory for our device state and initialize it */ 3178 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 3179 if (dev == NULL) { 3180 em28xx_err(DRIVER_NAME ": out of memory!\n"); 3181 retval = -ENOMEM; 3182 goto err; 3183 } 3184 3185 /* compute alternate max packet sizes */ 3186 dev->alt_max_pkt_size = kmalloc(sizeof(dev->alt_max_pkt_size[0]) * 3187 interface->num_altsetting, GFP_KERNEL); 3188 if (dev->alt_max_pkt_size == NULL) { 3189 em28xx_errdev("out of memory!\n"); 3190 kfree(dev); 3191 retval = -ENOMEM; 3192 goto err; 3193 } 3194 3195 /* Get endpoints */ 3196 for (i = 0; i < interface->num_altsetting; i++) { 3197 int ep; 3198 3199 for (ep = 0; ep < interface->altsetting[i].desc.bNumEndpoints; ep++) { 3200 const struct usb_endpoint_descriptor *e; 3201 int sizedescr, size; 3202 3203 e = &interface->altsetting[i].endpoint[ep].desc; 3204 3205 sizedescr = le16_to_cpu(e->wMaxPacketSize); 3206 size = sizedescr & 0x7ff; 3207 3208 if (udev->speed == USB_SPEED_HIGH) 3209 size = size * hb_mult(sizedescr); 3210 3211 if (usb_endpoint_xfer_isoc(e) && 3212 usb_endpoint_dir_in(e)) { 3213 switch (e->bEndpointAddress) { 3214 case EM28XX_EP_AUDIO: 3215 has_audio = true; 3216 break; 3217 case EM28XX_EP_ANALOG: 3218 has_video = true; 3219 dev->alt_max_pkt_size[i] = size; 3220 break; 3221 case EM28XX_EP_DIGITAL: 3222 has_dvb = true; 3223 if (size > dev->dvb_max_pkt_size) { 3224 dev->dvb_max_pkt_size = size; 3225 dev->dvb_alt = i; 3226 } 3227 break; 3228 } 3229 } 3230 } 3231 } 3232 3233 if (!(has_audio || has_video || has_dvb)) { 3234 retval = -ENODEV; 3235 goto err_free; 3236 } 3237 3238 switch (udev->speed) { 3239 case USB_SPEED_LOW: 3240 speed = "1.5"; 3241 break; 3242 case USB_SPEED_UNKNOWN: 3243 case USB_SPEED_FULL: 3244 speed = "12"; 3245 break; 3246 case USB_SPEED_HIGH: 3247 speed = "480"; 3248 break; 3249 default: 3250 speed = "unknown"; 3251 } 3252 3253 printk(KERN_INFO DRIVER_NAME 3254 ": New device %s %s @ %s Mbps " 3255 "(%04x:%04x, interface %d, class %d)\n", 3256 udev->manufacturer ? udev->manufacturer : "", 3257 udev->product ? udev->product : "", 3258 speed, 3259 le16_to_cpu(udev->descriptor.idVendor), 3260 le16_to_cpu(udev->descriptor.idProduct), 3261 ifnum, 3262 interface->altsetting->desc.bInterfaceNumber); 3263 3264 if (has_audio) 3265 printk(KERN_INFO DRIVER_NAME 3266 ": Audio Vendor Class interface %i found\n", 3267 ifnum); 3268 if (has_video) 3269 printk(KERN_INFO DRIVER_NAME 3270 ": Video interface %i found\n", 3271 ifnum); 3272 if (has_dvb) 3273 printk(KERN_INFO DRIVER_NAME 3274 ": DVB interface %i found\n", 3275 ifnum); 3276 3277 /* 3278 * Make sure we have 480 Mbps of bandwidth, otherwise things like 3279 * video stream wouldn't likely work, since 12 Mbps is generally 3280 * not enough even for most Digital TV streams. 3281 */ 3282 if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) { 3283 printk(DRIVER_NAME ": Device initialization failed.\n"); 3284 printk(DRIVER_NAME ": Device must be connected to a high-speed" 3285 " USB 2.0 port.\n"); 3286 retval = -ENODEV; 3287 goto err_free; 3288 } 3289 3290 snprintf(dev->name, sizeof(dev->name), "em28xx #%d", nr); 3291 dev->devno = nr; 3292 dev->model = id->driver_info; 3293 dev->alt = -1; 3294 dev->is_audio_only = has_audio && !(has_video || has_dvb); 3295 dev->has_alsa_audio = has_audio; 3296 dev->audio_ifnum = ifnum; 3297 3298 /* Checks if audio is provided by some interface */ 3299 for (i = 0; i < udev->config->desc.bNumInterfaces; i++) { 3300 struct usb_interface *uif = udev->config->interface[i]; 3301 if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) { 3302 dev->has_audio_class = 1; 3303 break; 3304 } 3305 } 3306 3307 dev->num_alt = interface->num_altsetting; 3308 3309 if ((card[nr] >= 0) && (card[nr] < em28xx_bcount)) 3310 dev->model = card[nr]; 3311 3312 /* save our data pointer in this interface device */ 3313 usb_set_intfdata(interface, dev); 3314 3315 /* allocate device struct */ 3316 mutex_init(&dev->lock); 3317 mutex_lock(&dev->lock); 3318 retval = em28xx_init_dev(dev, udev, interface, nr); 3319 if (retval) { 3320 goto unlock_and_free; 3321 } 3322 3323 if (has_dvb) { 3324 /* pre-allocate DVB isoc transfer buffers */ 3325 retval = em28xx_alloc_isoc(dev, EM28XX_DIGITAL_MODE, 3326 EM28XX_DVB_MAX_PACKETS, 3327 EM28XX_DVB_NUM_BUFS, 3328 dev->dvb_max_pkt_size); 3329 if (retval) { 3330 goto unlock_and_free; 3331 } 3332 } 3333 3334 request_modules(dev); 3335 3336 /* Should be the last thing to do, to avoid newer udev's to 3337 open the device before fully initializing it 3338 */ 3339 mutex_unlock(&dev->lock); 3340 3341 /* 3342 * These extensions can be modules. If the modules are already 3343 * loaded then we can initialise the device now, otherwise we 3344 * will initialise it when the modules load instead. 3345 */ 3346 em28xx_init_extension(dev); 3347 3348 return 0; 3349 3350unlock_and_free: 3351 mutex_unlock(&dev->lock); 3352 3353err_free: 3354 kfree(dev->alt_max_pkt_size); 3355 kfree(dev); 3356 3357err: 3358 clear_bit(nr, &em28xx_devused); 3359 3360err_no_slot: 3361 usb_put_dev(udev); 3362 return retval; 3363} 3364 3365/* 3366 * em28xx_usb_disconnect() 3367 * called when the device gets disconnected 3368 * video device will be unregistered on v4l2_close in case it is still open 3369 */ 3370static void em28xx_usb_disconnect(struct usb_interface *interface) 3371{ 3372 struct em28xx *dev; 3373 3374 dev = usb_get_intfdata(interface); 3375 usb_set_intfdata(interface, NULL); 3376 3377 if (!dev) 3378 return; 3379 3380 if (dev->is_audio_only) { 3381 mutex_lock(&dev->lock); 3382 em28xx_close_extension(dev); 3383 mutex_unlock(&dev->lock); 3384 return; 3385 } 3386 3387 em28xx_info("disconnecting %s\n", dev->vdev->name); 3388 3389 flush_request_modules(dev); 3390 3391 /* wait until all current v4l2 io is finished then deallocate 3392 resources */ 3393 mutex_lock(&dev->lock); 3394 3395 wake_up_interruptible_all(&dev->open); 3396 3397 v4l2_device_disconnect(&dev->v4l2_dev); 3398 3399 if (dev->users) { 3400 em28xx_warn 3401 ("device %s is open! Deregistration and memory " 3402 "deallocation are deferred on close.\n", 3403 video_device_node_name(dev->vdev)); 3404 3405 dev->state |= DEV_MISCONFIGURED; 3406 em28xx_uninit_isoc(dev, dev->mode); 3407 dev->state |= DEV_DISCONNECTED; 3408 wake_up_interruptible(&dev->wait_frame); 3409 wake_up_interruptible(&dev->wait_stream); 3410 } else { 3411 dev->state |= DEV_DISCONNECTED; 3412 em28xx_release_resources(dev); 3413 } 3414 3415 /* free DVB isoc buffers */ 3416 em28xx_uninit_isoc(dev, EM28XX_DIGITAL_MODE); 3417 3418 mutex_unlock(&dev->lock); 3419 3420 em28xx_close_extension(dev); 3421 3422 if (!dev->users) { 3423 kfree(dev->alt_max_pkt_size); 3424 kfree(dev); 3425 } 3426} 3427 3428static struct usb_driver em28xx_usb_driver = { 3429 .name = "em28xx", 3430 .probe = em28xx_usb_probe, 3431 .disconnect = em28xx_usb_disconnect, 3432 .id_table = em28xx_id_table, 3433}; 3434 3435module_usb_driver(em28xx_usb_driver); 3436