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