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