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