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