Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  em28xx-cards.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0+
//
// em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
//     video capture devices
//
// Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
//       Markus Rechberger <mrechberger@gmail.com>
//       Mauro Carvalho Chehab <mchehab@kernel.org>
//       Sascha Sommer <saschasommer@freenet.de>
// Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>

#include "em28xx.h"

#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/usb.h>
#include <media/tuner.h>
#include <media/drv-intf/msp3400.h>
#include <media/i2c/saa7115.h>
#include <dt-bindings/media/tvp5150.h>
#include <media/i2c/tvaudio.h>
#include <media/tveeprom.h>
#include <media/v4l2-common.h>
#include <sound/ac97_codec.h>

#define DRIVER_NAME         "em28xx"

static int tuner = -1;
module_param(tuner, int, 0444);
MODULE_PARM_DESC(tuner, "tuner type");

static unsigned int disable_ir;
module_param(disable_ir, int, 0444);
MODULE_PARM_DESC(disable_ir, "disable infrared remote support");

static unsigned int disable_usb_speed_check;
module_param(disable_usb_speed_check, int, 0444);
MODULE_PARM_DESC(disable_usb_speed_check,
   "override min bandwidth requirement of 480M bps");

static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
module_param_array(card,  int, NULL, 0444);
MODULE_PARM_DESC(card,     "card type");

static int usb_xfer_mode = -1;
module_param(usb_xfer_mode, int, 0444);
MODULE_PARM_DESC(usb_xfer_mode,
   "USB transfer mode for frame data (-1 = auto, 0 = prefer isoc, 1 = prefer bulk)");

/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */
static DECLARE_BITMAP(em28xx_devused, EM28XX_MAXBOARDS);

struct em28xx_hash_table {
 unsigned long hash;
 unsigned int  model;
 unsigned int  tuner;
};

static void em28xx_pre_card_setup(struct em28xx *dev);

/*
 *  Reset sequences for analog/digital modes
 */


/* Reset for the most [analog] boards */
static const struct em28xx_reg_seq default_analog[] = {
 {EM2820_R08_GPIO_CTRL, 0x6d,   ~EM_GPIO_4, 10},
 { -1,  -1, -1,  -1},
};

/* Reset for the most [digital] boards */
static const struct em28xx_reg_seq default_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
 { -1,  -1, -1,  -1},
};

/* Board :Zolid Hybrid Tv Stick */
static struct em28xx_reg_seq zolid_tuner[] = {
 {EM2820_R08_GPIO_CTRL,  0xfd,  0xff, 100},
 {EM2820_R08_GPIO_CTRL,  0xfe,  0xff, 100},
 {  -1,     -1,   -1,   -1},
};

static struct em28xx_reg_seq zolid_digital[] = {
 {EM2820_R08_GPIO_CTRL,  0x6a,  0xff, 100},
 {EM2820_R08_GPIO_CTRL,  0x7a,  0xff, 100},
 {EM2880_R04_GPO,   0x04,  0xff, 100},
 {EM2880_R04_GPO,   0x0c,  0xff, 100},
 { -1,      -1,   -1,   -1},
};

/* Board Hauppauge WinTV HVR 900 analog */
static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
 {EM2820_R08_GPIO_CTRL, 0x2d, ~EM_GPIO_4, 10},
 { 0x05,  0xff, 0x10,  10},
 { -1,  -1, -1,  -1},
};

/* Board Hauppauge WinTV HVR 900 digital */
static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0x2e, ~EM_GPIO_4, 10},
 {EM2880_R04_GPO, 0x04, 0x0f,  10},
 {EM2880_R04_GPO, 0x0c, 0x0f,  10},
 { -1,  -1, -1,  -1},
};

/* Board Hauppauge WinTV HVR 900 (R2) digital */
static const struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0x2e, ~EM_GPIO_4, 10},
 {EM2880_R04_GPO, 0x0c, 0x0f,  10},
 { -1,  -1, -1,  -1},
};

/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
static const struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
 {EM2820_R08_GPIO_CTRL, 0x69,   ~EM_GPIO_4, 10},
 { -1,  -1, -1,  -1},
};

/* Board - EM2882 Kworld 315U digital */
static const struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0xff, 0xff,  10},
 {EM2820_R08_GPIO_CTRL, 0xfe, 0xff,  10},
 {EM2880_R04_GPO, 0x04, 0xff,  10},
 {EM2880_R04_GPO, 0x0c, 0xff,  10},
 {EM2820_R08_GPIO_CTRL, 0x7e, 0xff,  10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
 {EM2880_R04_GPO, 0x08, 0xff,  10},
 {EM2880_R04_GPO, 0x0c, 0xff,  10},
 {EM2880_R04_GPO, 0x08, 0xff,  10},
 {EM2880_R04_GPO, 0x0c, 0xff,  10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq kworld_330u_analog[] = {
 {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
 {EM2880_R04_GPO, 0x00, 0xff,  10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq kworld_330u_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
 {EM2880_R04_GPO, 0x08, 0xff,  10},
 { -1,  -1, -1,  -1},
};

/*
 * Evga inDtube
 * GPIO0 - Enable digital power (s5h1409) - low to enable
 * GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
 * GPIO4 - xc3028 reset
 * GOP3  - s5h1409 reset
 */

static const struct em28xx_reg_seq evga_indtube_analog[] = {
 {EM2820_R08_GPIO_CTRL, 0x79,   0xff,  60},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq evga_indtube_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0x7a, 0xff,   1},
 {EM2880_R04_GPO, 0x04, 0xff,  10},
 {EM2880_R04_GPO, 0x0c, 0xff,   1},
 { -1,  -1, -1,  -1},
};

/*
 * KWorld PlusTV 340U, UB435-Q and UB435-Q V2 (ATSC) GPIOs map:
 * EM_GPIO_0 - currently unknown
 * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
 * EM_GPIO_2 - currently unknown
 * EM_GPIO_3 - currently unknown
 * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
 * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
 * EM_GPIO_6 - currently unknown
 * EM_GPIO_7 - currently unknown
 */

static const struct em28xx_reg_seq kworld_a340_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq kworld_ub435q_v3_digital[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0xbe, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 100},
 { -1,   -1, -1, -1},
};

/* Pinnacle Hybrid Pro eb1a:2881 */
static const struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
 {EM2820_R08_GPIO_CTRL, 0xfd,   ~EM_GPIO_4, 10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
 {EM2880_R04_GPO, 0x04, 0xff,        100},/* zl10353 reset */
 {EM2880_R04_GPO, 0x0c, 0xff,   1},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
 {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
 {EM2880_R04_GPO, 0x00, 0xff,  10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
 {EM2880_R04_GPO, 0x08, 0xff,  10},
 { -1,  -1, -1,  -1},
};

/*
 * PCTV HD Mini (80e) GPIOs
 * 0-5: not used
 * 6:   demod reset, active low
 * 7:   LED on, active high
 */

static const struct em28xx_reg_seq em2874_pctv_80e_digital[] = {
 {EM28XX_R06_I2C_CLK,    0x45,   0xff,    10}, /*400 KHz*/
 {EM2874_R80_GPIO_P0_CTRL, 0x00,   0xff,    100},/*Demod reset*/
 {EM2874_R80_GPIO_P0_CTRL, 0x40,   0xff,    10},
 {  -1,   -1, -1,    -1},
};

/*
 * eb1a:2868 Reddo DVB-C USB TV Box
 * GPIO4 - CU1216L NIM
 * Other GPIOs seems to be don't care.
 */

static const struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
 {EM2820_R08_GPIO_CTRL, 0xfe, 0xff,  10},
 {EM2820_R08_GPIO_CTRL, 0xde, 0xff,  10},
 {EM2820_R08_GPIO_CTRL, 0xfe, 0xff,  10},
 {EM2820_R08_GPIO_CTRL, 0xff, 0xff,  10},
 {EM2820_R08_GPIO_CTRL, 0x7f, 0xff,  10},
 {EM2820_R08_GPIO_CTRL, 0x6f, 0xff,  10},
 {EM2820_R08_GPIO_CTRL, 0xff, 0xff,  10},
 { -1,  -1, -1,  -1},
};

/* Callback for the most boards */
static const struct em28xx_reg_seq default_tuner_gpio[] = {
 {EM2820_R08_GPIO_CTRL, EM_GPIO_4, EM_GPIO_4, 10},
 {EM2820_R08_GPIO_CTRL, 0,  EM_GPIO_4, 10},
 {EM2820_R08_GPIO_CTRL, EM_GPIO_4, EM_GPIO_4, 10},
 { -1,  -1,  -1,  -1},
};

/* Mute/unmute */
static const struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
 {EM2820_R08_GPIO_CTRL, 5, 7, 10},
 { -1,  -1, -1, -1},
};

static const struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
 {EM2820_R08_GPIO_CTRL, 4, 7, 10},
 { -1,  -1, -1, -1},
};

static const struct em28xx_reg_seq compro_mute_gpio[] = {
 {EM2820_R08_GPIO_CTRL, 6, 7, 10},
 { -1,  -1, -1, -1},
};

/* Terratec AV350 */
static const struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
 {EM2820_R08_GPIO_CTRL, 0xff, 0x7f,  10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
 {EM2820_R08_GPIO_CTRL, 0xff, 0xff,  10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq silvercrest_reg_seq[] = {
 {EM2820_R08_GPIO_CTRL, 0xff, 0xff,  10},
 {EM2820_R08_GPIO_CTRL, 0x01, 0xf7,  10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq vc211a_enable[] = {
 {EM2820_R08_GPIO_CTRL, 0xff, 0x07,  10},
 {EM2820_R08_GPIO_CTRL, 0xff, 0x0f,  10},
 {EM2820_R08_GPIO_CTRL, 0xff, 0x0b,  10},
 { -1,  -1, -1,  -1},
};

static const struct em28xx_reg_seq dikom_dk300_digital[] = {
 {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
 {EM2880_R04_GPO, 0x08, 0xff,  10},
 { -1,  -1, -1,  -1},
};

/* Reset for the most [digital] boards */
static const struct em28xx_reg_seq leadership_digital[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0x70, 0xff, 10},
 { -1,   -1, -1, -1},
};

static const struct em28xx_reg_seq leadership_reset[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0xf0, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xb0, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xf0, 0xff, 10},
 { -1,   -1, -1, -1},
};

/*
 * 2013:024f PCTV nanoStick T2 290e
 * GPIO_6 - demod reset
 * GPIO_7 - LED
 */

static const struct em28xx_reg_seq pctv_290e[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 80},
 {EM2874_R80_GPIO_P0_CTRL, 0x40, 0xff, 80}, /* GPIO_6 = 1 */
 {EM2874_R80_GPIO_P0_CTRL, 0xc0, 0xff, 80}, /* GPIO_7 = 1 */
 { -1,   -1, -1, -1},
};

#if 0
static const struct em28xx_reg_seq terratec_h5_gpio[] = {
 {EM2820_R08_GPIO_CTRL,  0xff, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0xf2, 0xff, 50},
 {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 50},
 { -1,   -1, -1, -1},
};

static const struct em28xx_reg_seq terratec_h5_digital[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xe6, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0xa6, 0xff, 10},
 { -1,   -1, -1, -1},
};
#endif

/*
 * 2013:024f PCTV DVB-S2 Stick 460e
 * GPIO_0 - POWER_ON
 * GPIO_1 - BOOST
 * GPIO_2 - VUV_LNB (red LED)
 * GPIO_3 - EXT_12V
 * GPIO_4 - INT_DEM (DEMOD GPIO_0)
 * GPIO_5 - INT_LNB
 * GPIO_6 - RESET_DEM
 * GPIO_7 - LED (green LED)
 */

static const struct em28xx_reg_seq pctv_460e[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0x01, 0xff, 50},
 { 0x0d,   0xff, 0xff, 50},
 {EM2874_R80_GPIO_P0_CTRL, 0x41, 0xff, 50}, /* GPIO_6=1 */
 { 0x0d,   0x42, 0xff, 50},
 {EM2874_R80_GPIO_P0_CTRL, 0x61, 0xff, 50}, /* GPIO_5=1 */
 { -1,   -1, -1, -1},
};

static const struct em28xx_reg_seq c3tech_digital_duo_digital[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10}, /* xc5000 reset */
 {EM2874_R80_GPIO_P0_CTRL, 0xf9, 0xff, 35},
 {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xbe, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 20},
 { -1,   -1, -1, -1},
};

/*
 * 2013:0258 PCTV DVB-S2 Stick (461e)
 * GPIO 0 = POWER_ON
 * GPIO 1 = BOOST
 * GPIO 2 = VUV_LNB (red LED)
 * GPIO 3 = #EXT_12V
 * GPIO 4 = INT_DEM
 * GPIO 5 = INT_LNB
 * GPIO 6 = #RESET_DEM
 * GPIO 7 = P07_LED (green LED)
 */

static const struct em28xx_reg_seq pctv_461e[] = {
 {EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,    0},
 {0x0d,                 0xff, 0xff,    0},
 {EM2874_R80_GPIO_P0_CTRL,      0x3f, 0xff,  100}, /* reset demod */
 {EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,  200}, /* reset demod */
 {0x0d,                 0x42, 0xff,    0},
 {EM2874_R80_GPIO_P0_CTRL,      0xeb, 0xff,    0},
 {EM2874_R5F_TS_ENABLE, 0x84, 0x84,    0}, /* parallel? | null discard */
 {                  -1,   -1,   -1,   -1},
};

#if 0
static const struct em28xx_reg_seq hauppauge_930c_gpio[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0x6f, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0x4f, 0xff, 10}, /* xc5000 reset */
 {EM2874_R80_GPIO_P0_CTRL, 0x6f, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0x4f, 0xff, 10},
 { -1,   -1, -1, -1},
};

static const struct em28xx_reg_seq hauppauge_930c_digital[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xe6, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0xa6, 0xff, 10},
 { -1,   -1, -1, -1},
};
#endif

/*
 * 1b80:e425 MaxMedia UB425-TC
 * 1b80:e1cc Delock 61959
 * GPIO_6 - demod reset, 0=active
 * GPIO_7 - LED, 0=active
 */

static const struct em28xx_reg_seq maxmedia_ub425_tc[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0x83, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0xc3, 0xff, 100}, /* GPIO_6 = 1 */
 {EM2874_R80_GPIO_P0_CTRL, 0x43, 0xff, 000}, /* GPIO_7 = 0 */
 { -1,   -1, -1, -1},
};

/*
 * 2304:0242 PCTV QuatroStick (510e)
 * GPIO_2: decoder reset, 0=active
 * GPIO_4: decoder suspend, 0=active
 * GPIO_6: demod reset, 0=active
 * GPIO_7: LED, 1=active
 */

static const struct em28xx_reg_seq pctv_510e[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0x10, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
 {EM2874_R80_GPIO_P0_CTRL, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
 { -1,   -1, -1, -1},
};

/*
 * 2013:0251 PCTV QuatroStick nano (520e)
 * GPIO_2: decoder reset, 0=active
 * GPIO_4: decoder suspend, 0=active
 * GPIO_6: demod reset, 0=active
 * GPIO_7: LED, 1=active
 */

static const struct em28xx_reg_seq pctv_520e[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0x10, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
 {EM2874_R80_GPIO_P0_CTRL, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
 {EM2874_R80_GPIO_P0_CTRL, 0xd4, 0xff, 000}, /* GPIO_7 = 1 */
 { -1,   -1, -1, -1},
};

/*
 * 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
 * reg 0x80/0x84:
 * GPIO_0: capturing LED, 0=on, 1=off
 * GPIO_2: AV mute button, 0=pressed, 1=unpressed
 * GPIO 3: illumination button, 0=pressed, 1=unpressed
 * GPIO_6: illumination/flash LED, 0=on, 1=off
 * reg 0x81/0x85:
 * GPIO_7: snapshot button, 0=pressed, 1=unpressed
 */

static const struct em28xx_reg_seq speedlink_vad_laplace_reg_seq[] = {
 {EM2820_R08_GPIO_CTRL,  0xf7, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xb2, 10},
 { -1,   -1, -1, -1},
};

static const struct em28xx_reg_seq pctv_292e[] = {
 {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
 {0x0d,                         0xff, 0xff,    950},
 {EM2874_R80_GPIO_P0_CTRL,      0xbd, 0xff,    100},
 {EM2874_R80_GPIO_P0_CTRL,      0xfd, 0xff,    410},
 {EM2874_R80_GPIO_P0_CTRL,      0x7d, 0xff,    300},
 {EM2874_R80_GPIO_P0_CTRL,      0x7c, 0xff,     60},
 {0x0d,                         0x42, 0xff,     50},
 {EM2874_R5F_TS_ENABLE,         0x85, 0xff,      0},
 {-1,                             -1,   -1,     -1},
};

static const struct em28xx_reg_seq terratec_t2_stick_hd[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
 {0x0d,    0xff, 0xff, 600},
 {EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xbc, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 300},
 {EM2874_R80_GPIO_P0_CTRL, 0xf8, 0xff, 100},
 {EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 300},
 {0x0d,    0x42, 0xff, 1000},
 {EM2874_R5F_TS_ENABLE,  0x85, 0xff, 0},
 {-1,                             -1,   -1,     -1},
};

static const struct em28xx_reg_seq plex_px_bcud[] = {
 {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
 {0x0d,    0xff, 0xff, 0},
 {EM2874_R50_IR_CONFIG,  0x01, 0xff, 0},
 {EM28XX_R06_I2C_CLK,  0x40, 0xff, 0},
 {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 100},
 {EM28XX_R12_VINENABLE,  0x20, 0x20, 0},
 {0x0d,    0x42, 0xff, 1000},
 {EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 10},
 {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10},
 {0x73,    0xfd, 0xff, 100},
 {-1,    -1, -1, -1},
};

/*
 * 2040:0265 Hauppauge WinTV-dualHD DVB Isoc
 * 2040:8265 Hauppauge WinTV-dualHD DVB Bulk
 * 2040:026d Hauppauge WinTV-dualHD ATSC/QAM Isoc
 * 2040:826d Hauppauge WinTV-dualHD ATSC/QAM Bulk
 * reg 0x80/0x84:
 * GPIO_0: Yellow LED tuner 1, 0=on, 1=off
 * GPIO_1: Green LED tuner 1, 0=on, 1=off
 * GPIO_2: Yellow LED tuner 2, 0=on, 1=off
 * GPIO_3: Green LED tuner 2, 0=on, 1=off
 * GPIO_5: Reset #2, 0=active
 * GPIO_6: Reset #1, 0=active
 */

static const struct em28xx_reg_seq hauppauge_dualhd_dvb[] = {
 {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
 {0x0d,                         0xff, 0xff,    200},
 {0x50,                         0x04, 0xff,    300},
 {EM2874_R80_GPIO_P0_CTRL,      0xbf, 0xff,    100}, /* demod 1 reset */
 {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},
 {EM2874_R80_GPIO_P0_CTRL,      0xdf, 0xff,    100}, /* demod 2 reset */
 {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},
 {EM2874_R5F_TS_ENABLE,         0x00, 0xff,     50}, /* disable TS filters */
 {EM2874_R5D_TS1_PKT_SIZE,      0x05, 0xff,     50},
 {EM2874_R5E_TS2_PKT_SIZE,      0x05, 0xff,     50},
 {-1,                             -1,   -1,     -1},
};

/* Hauppauge USB QuadHD */
static struct em28xx_reg_seq hauppauge_usb_quadhd_atsc_reg_seq[] = {
 {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
 {0x0d,                         0xff, 0xff,    200},
 {0x50,                         0x04, 0xff,    300},
 {EM2874_R80_GPIO_P0_CTRL,      0xb0, 0xf0,    100}, /* demod 1 reset */
 {EM2874_R80_GPIO_P0_CTRL,      0xf0, 0xf0,    100},
 {EM2874_R80_GPIO_P0_CTRL,      0xd0, 0xf0,    100}, /* demod 2 reset */
 {EM2874_R80_GPIO_P0_CTRL,      0xf0, 0xf0,    100},
 {EM2874_R5F_TS_ENABLE,         0x44, 0xff,     50},
 {EM2874_R5D_TS1_PKT_SIZE,      0x05, 0xff,     50},
 {EM2874_R5E_TS2_PKT_SIZE,      0x05, 0xff,     50},
 {-1,                           -1,   -1,       -1},
};

/*
 * MyGica USB TV Box
 * GPIO_1,0: 00=Composite audio
 *           01=Tuner audio
 *           10=Mute audio
 *           11=FM radio? (if equipped)
 * GPIO_2-6: Unused
 * GPIO_7:   ??
 */

static const struct em28xx_reg_seq mygica_utv3_composite_audio_gpio[] = {
 {EM2820_R08_GPIO_CTRL, 0xfc, 0xff, 0},
 { -1, -1, -1, -1},
};

static const struct em28xx_reg_seq mygica_utv3_tuner_audio_gpio[] = {
 {EM2820_R08_GPIO_CTRL, 0xfd, 0xff, 0},
 { -1, -1, -1, -1},
};

static const struct em28xx_reg_seq mygica_utv3_suspend_gpio[] = {
 {EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 0},
 { -1, -1, -1, -1},
};

/*
 *  Button definitions
 */

static const struct em28xx_button std_snapshot_button[] = {
 {
  .role         = EM28XX_BUTTON_SNAPSHOT,
  .reg_r        = EM28XX_R0C_USBSUSP,
  .reg_clearing = EM28XX_R0C_USBSUSP,
  .mask         = EM28XX_R0C_USBSUSP_SNAPSHOT,
  .inverted     = 0,
 },
 {-1, 0, 0, 0, 0},
};

static const struct em28xx_button speedlink_vad_laplace_buttons[] = {
 {
  .role     = EM28XX_BUTTON_SNAPSHOT,
  .reg_r    = EM2874_R85_GPIO_P1_STATE,
  .mask     = 0x80,
  .inverted = 1,
 },
 {
  .role     = EM28XX_BUTTON_ILLUMINATION,
  .reg_r    = EM2874_R84_GPIO_P0_STATE,
  .mask     = 0x08,
  .inverted = 1,
 },
 {-1, 0, 0, 0, 0},
};

/*
 *  LED definitions
 */

static struct em28xx_led speedlink_vad_laplace_leds[] = {
 {
  .role      = EM28XX_LED_ANALOG_CAPTURING,
  .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
  .gpio_mask = 0x01,
  .inverted  = 1,
 },
 {
  .role      = EM28XX_LED_ILLUMINATION,
  .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
  .gpio_mask = 0x40,
  .inverted  = 1,
 },
 {-1, 0, 0, 0},
};

static struct em28xx_led kworld_ub435q_v3_leds[] = {
 {
  .role      = EM28XX_LED_DIGITAL_CAPTURING,
  .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
  .gpio_mask = 0x80,
  .inverted  = 1,
 },
 {-1, 0, 0, 0},
};

static struct em28xx_led pctv_80e_leds[] = {
 {
  .role      = EM28XX_LED_DIGITAL_CAPTURING,
  .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
  .gpio_mask = 0x80,
  .inverted  = 0,
 },
 {-1, 0, 0, 0},
};

static struct em28xx_led terratec_grabby_leds[] = {
 {
  .role      = EM28XX_LED_ANALOG_CAPTURING,
  .gpio_reg  = EM2820_R08_GPIO_CTRL,
  .gpio_mask = EM_GPIO_3,
  .inverted  = 1,
 },
 {-1, 0, 0, 0},
};

static struct em28xx_led hauppauge_dualhd_leds[] = {
 {
  .role      = EM28XX_LED_DIGITAL_CAPTURING,
  .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
  .gpio_mask = EM_GPIO_1,
  .inverted  = 1,
 },
 {
  .role      = EM28XX_LED_DIGITAL_CAPTURING_TS2,
  .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
  .gpio_mask = EM_GPIO_3,
  .inverted  = 1,
 },
 {-1, 0, 0, 0},
};

static struct em28xx_led hauppauge_usb_quadhd_leds[] = {
 {
  .role      = EM28XX_LED_DIGITAL_CAPTURING,
  .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
  .gpio_mask = EM_GPIO_2,
  .inverted  = 1,
 },
 {
  .role      = EM28XX_LED_DIGITAL_CAPTURING_TS2,
  .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
  .gpio_mask = EM_GPIO_0,
  .inverted  = 1,
 },
 {-1, 0, 0, 0},
};

/*
 *  Board definitions
 */

const struct em28xx_board em28xx_boards[] = {
 [EM2750_BOARD_UNKNOWN] = {
  .name          = "EM2710/EM2750/EM2751 webcam grabber",
  .xclk          = EM28XX_XCLK_FREQUENCY_20MHZ,
  .tuner_type    = TUNER_ABSENT,
  .is_webcam     = 1,
  .input         = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = 0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = silvercrest_reg_seq,
  } },
 },
 [EM2800_BOARD_UNKNOWN] = {
  .name         = "Unknown EM2800 video grabber",
  .is_em2800    = 1,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .tuner_type   = TUNER_ABSENT,
  .input        = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_UNKNOWN] = {
  .name          = "Unknown EM2750/28xx video grabber",
  .tuner_type    = TUNER_ABSENT,
  .is_webcam     = 1, /* To enable sensor probe */
 },
 [EM2882_BOARD_ZOLID_HYBRID_TV_STICK] = {
  .name   = ":ZOLID HYBRID TV STICK",
  .tuner_type  = TUNER_XC2028,
  .tuner_gpio  = zolid_tuner,
  .decoder  = EM28XX_TVP5150,
  .xclk   = EM28XX_XCLK_FREQUENCY_12MHZ,
  .mts_firmware = 1,
  .has_dvb  = 1,
  .dvb_gpio  = zolid_digital,
 },
 [EM2750_BOARD_DLCW_130] = {
  /* Beijing Huaqi Information Digital Technology Co., Ltd */
  .name          = "Huaqi DLCW-130",
  .valid         = EM28XX_BOARD_NOT_VALIDATED,
  .xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
  .tuner_type    = TUNER_ABSENT,
  .is_webcam     = 1,
  .input         = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = 0,
   .amux     = EM28XX_AMUX_VIDEO,
  } },
 },
 [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
  .name         = "Kworld PVR TV 2800 RF",
  .tuner_type   = TUNER_TEMIC_PAL,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_GADMEI_TVR200] = {
  .name         = "Gadmei TVR200",
  .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_TERRATEC_CINERGY_250] = {
  .name         = "Terratec Cinergy 250 USB",
  .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
  .has_ir_i2c   = 1,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_PINNACLE_USB_2] = {
  .name         = "Pinnacle PCTV USB 2",
  .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
  .has_ir_i2c   = 1,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
  .name         = "Hauppauge WinTV USB 2",
  .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
  .tda9887_conf = TDA9887_PRESENT |
    TDA9887_PORT1_ACTIVE |
    TDA9887_PORT2_ACTIVE,
  .decoder      = EM28XX_TVP5150,
  .has_msp34xx  = 1,
  .has_ir_i2c   = 1,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = MSP_INPUT_DEFAULT,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
     MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
  } },
 },
 [EM2820_BOARD_DLINK_USB_TV] = {
  .name         = "D-Link DUB-T210 TV Tuner",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
  .name         = "Hercules Smart TV USB 2.0",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
  .name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_GADMEI_UTV310] = {
  .name         = "Gadmei UTV310",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_TNF_5335MF,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
  .name         = "Leadtek Winfast USB II Deluxe",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
  .has_ir_i2c   = 1,
  .tvaudio_addr = 0x58,
  .tda9887_conf = TDA9887_PRESENT |
    TDA9887_PORT2_ACTIVE |
    TDA9887_QSS,
  .decoder      = EM28XX_SAA711X,
  .adecoder     = EM28XX_TVAUDIO,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE4,
   .amux     = EM28XX_AMUX_AUX,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE5,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
   .radio   = {
   .type     = EM28XX_RADIO,
   .amux     = EM28XX_AMUX_AUX,
   }
 },
 [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
  .name         = "Videology 20K14XUSB USB2.0",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_ABSENT,
  .is_webcam    = 1,
  .input        = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = 0,
   .amux     = EM28XX_AMUX_VIDEO,
  } },
 },
 [EM2820_BOARD_SILVERCREST_WEBCAM] = {
  .name         = "Silvercrest Webcam 1.3mpix",
  .tuner_type   = TUNER_ABSENT,
  .is_webcam    = 1,
  .input        = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = 0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = silvercrest_reg_seq,
  } },
 },
 [EM2821_BOARD_SUPERCOMP_USB_2] = {
  .name         = "Supercomp USB 2.0 TV",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
  .tda9887_conf = TDA9887_PRESENT |
    TDA9887_PORT1_ACTIVE |
    TDA9887_PORT2_ACTIVE,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2821_BOARD_USBGEAR_VD204] = {
  .name         = "Usbgear VD204v9",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_ABSENT, /* Capture only device */
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type  = EM28XX_VMUX_COMPOSITE,
   .vmux  = SAA7115_COMPOSITE0,
   .amux  = EM28XX_AMUX_LINE_IN,
  }, {
   .type  = EM28XX_VMUX_SVIDEO,
   .vmux  = SAA7115_SVIDEO3,
   .amux  = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2860_BOARD_NETGMBH_CAM] = {
  /* Beijing Huaqi Information Digital Technology Co., Ltd */
  .name         = "NetGMBH Cam",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_ABSENT,
  .is_webcam    = 1,
  .input        = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = 0,
   .amux     = EM28XX_AMUX_VIDEO,
  } },
 },
 [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
  .name         = "Typhoon DVD Maker",
  .decoder      = EM28XX_SAA711X,
  .tuner_type   = TUNER_ABSENT, /* Capture only device */
  .input        = { {
   .type  = EM28XX_VMUX_COMPOSITE,
   .vmux  = SAA7115_COMPOSITE0,
   .amux  = EM28XX_AMUX_LINE_IN,
  }, {
   .type  = EM28XX_VMUX_SVIDEO,
   .vmux  = SAA7115_SVIDEO3,
   .amux  = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2860_BOARD_GADMEI_UTV330] = {
  .name         = "Gadmei UTV330",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_TNF_5335MF,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2861_BOARD_GADMEI_UTV330PLUS] = {
  .name         = "Gadmei UTV330+",
  .tuner_type   = TUNER_TNF_5335MF,
  .tda9887_conf = TDA9887_PRESENT,
  .ir_codes     = RC_MAP_GADMEI_RM008Z,
  .decoder      = EM28XX_SAA711X,
  .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
  .name         = "Terratec Cinergy A Hybrid XS",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,

  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2861_BOARD_KWORLD_PVRTV_300U] = {
  .name       = "KWorld PVRTV 300U",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
  .name          = "Yakumo MovieMixer",
  .tuner_type    = TUNER_ABSENT, /* Capture only device */
  .decoder       = EM28XX_TVP5150,
  .input         = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = {
  .name          = "EM2860/TVP5150 Reference Design",
  .tuner_type    = TUNER_ABSENT, /* Capture only device */
  .decoder       = EM28XX_TVP5150,
  .input         = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2861_BOARD_PLEXTOR_PX_TV100U] = {
  .name         = "Plextor ConvertX PX-TV100U",
  .tuner_type   = TUNER_TNF_5335MF,
  .xclk         = EM28XX_XCLK_I2S_MSB_TIMING |
    EM28XX_XCLK_FREQUENCY_12MHZ,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_TVP5150,
  .has_msp34xx  = 1,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = pinnacle_hybrid_pro_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = pinnacle_hybrid_pro_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = pinnacle_hybrid_pro_analog,
  } },
 },

 /* Those boards with em2870 are DVB Only*/

 [EM2870_BOARD_TERRATEC_XS] = {
  .name         = "Terratec Cinergy T XS",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
 },
 [EM2870_BOARD_TERRATEC_XS_MT2060] = {
  .name         = "Terratec Cinergy T XS (MT2060)",
  .xclk         = EM28XX_XCLK_IR_RC5_MODE |
    EM28XX_XCLK_FREQUENCY_12MHZ,
  .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,
  .tuner_type   = TUNER_ABSENT, /* MT2060 */
  .has_dvb      = 1,
  .tuner_gpio   = default_tuner_gpio,
 },
 [EM2870_BOARD_KWORLD_350U] = {
  .name         = "Kworld 350 U DVB-T",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
 },
 [EM2870_BOARD_KWORLD_355U] = {
  .name         = "Kworld 355 U DVB-T",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_ABSENT,
  .tuner_gpio   = default_tuner_gpio,
  .has_dvb      = 1,
  .dvb_gpio     = default_digital,
 },
 [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
  .name         = "Pinnacle PCTV DVB-T",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_ABSENT, /* MT2060 */
  /* djh - I have serious doubts this is right... */
  .xclk         = EM28XX_XCLK_IR_RC5_MODE |
    EM28XX_XCLK_FREQUENCY_10MHZ,
 },
 [EM2870_BOARD_COMPRO_VIDEOMATE] = {
  .name         = "Compro, VideoMate U3",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_ABSENT, /* MT2060 */
 },

 [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
  .name         = "Terratec Hybrid XS Secam",
  .has_msp34xx  = 1,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .has_dvb      = 1,
  .dvb_gpio     = terratec_cinergy_USB_XS_FR_digital,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = terratec_cinergy_USB_XS_FR_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = terratec_cinergy_USB_XS_FR_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = terratec_cinergy_USB_XS_FR_analog,
  } },
 },
 [EM2884_BOARD_TERRATEC_H5] = {
  .name         = "Terratec Cinergy H5",
  .has_dvb      = 1,
#if 0
  .tuner_type   = TUNER_PHILIPS_TDA8290,
  .tuner_addr   = 0x41,
  .dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */
  .tuner_gpio   = terratec_h5_gpio,
#else
  .tuner_type   = TUNER_ABSENT,
#endif
  .def_i2c_bus  = 1,
  .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
    EM28XX_I2C_FREQ_400_KHZ,
 },
 [EM2884_BOARD_TERRATEC_H6] = {
  .name         = "Terratec Cinergy H6 rev. 2",
  .has_dvb      = 1,
  .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
#if 0
  .tuner_type   = TUNER_PHILIPS_TDA8290,
  .tuner_addr   = 0x41,
  .dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */
  .tuner_gpio   = terratec_h5_gpio,
#else
  .tuner_type   = TUNER_ABSENT,
#endif
  .def_i2c_bus  = 1,
  .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
    EM28XX_I2C_FREQ_400_KHZ,
 },
 [EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
  .name         = "Hauppauge WinTV HVR 930C",
  .has_dvb      = 1,
#if 0 /* FIXME: Add analog support */
  .tuner_type   = TUNER_XC5000,
  .tuner_addr   = 0x41,
  .dvb_gpio     = hauppauge_930c_digital,
  .tuner_gpio   = hauppauge_930c_gpio,
#else
  .tuner_type   = TUNER_ABSENT,
#endif
  .ir_codes     = RC_MAP_HAUPPAUGE,
  .def_i2c_bus  = 1,
  .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
    EM28XX_I2C_FREQ_400_KHZ,
 },
 [EM2884_BOARD_C3TECH_DIGITAL_DUO] = {
  .name         = "C3 Tech Digital Duo HDTV/SDTV USB",
  .has_dvb      = 1,
  /* FIXME: Add analog support - need a saa7136 driver */
  .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
  .ir_codes     = RC_MAP_EMPTY,
  .def_i2c_bus  = 1,
  .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,
  .dvb_gpio     = c3tech_digital_duo_digital,
 },
 [EM2884_BOARD_CINERGY_HTC_STICK] = {
  .name         = "Terratec Cinergy HTC Stick",
  .has_dvb      = 1,
  .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
  .tuner_type   = TUNER_ABSENT,
  .def_i2c_bus  = 1,
  .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
    EM28XX_I2C_FREQ_400_KHZ,
 },
 [EM2884_BOARD_ELGATO_EYETV_HYBRID_2008] = {
  .name         = "Elgato EyeTV Hybrid 2008 INT",
  .has_dvb      = 1,
  .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
  .tuner_type   = TUNER_ABSENT,
  .def_i2c_bus  = 1,
  .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
    EM28XX_I2C_FREQ_400_KHZ,
 },
 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
  .name         = "Hauppauge WinTV HVR 900",
  .tda9887_conf = TDA9887_PRESENT,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .mts_firmware = 1,
  .has_dvb      = 1,
  .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
  .ir_codes     = RC_MAP_HAUPPAUGE,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
  .name         = "Hauppauge WinTV HVR 900 (R2)",
  .tda9887_conf = TDA9887_PRESENT,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .mts_firmware = 1,
  .has_dvb      = 1,
  .dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
  .ir_codes     = RC_MAP_HAUPPAUGE,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
  .name           = "Hauppauge WinTV HVR 850",
  .tuner_type     = TUNER_XC2028,
  .tuner_gpio     = default_tuner_gpio,
  .mts_firmware   = 1,
  .has_dvb        = 1,
  .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
  .ir_codes       = RC_MAP_HAUPPAUGE,
  .decoder        = EM28XX_TVP5150,
  .input          = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
  .name           = "Hauppauge WinTV HVR 950",
  .tuner_type     = TUNER_XC2028,
  .tuner_gpio     = default_tuner_gpio,
  .mts_firmware   = 1,
  .has_dvb        = 1,
  .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
  .ir_codes       = RC_MAP_HAUPPAUGE,
  .decoder        = EM28XX_TVP5150,
  .input          = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
  .name           = "Pinnacle PCTV HD Pro Stick",
  .tuner_type     = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .mts_firmware   = 1,
  .has_dvb        = 1,
  .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
  .ir_codes       = RC_MAP_PINNACLE_PCTV_HD,
  .decoder        = EM28XX_TVP5150,
  .input          = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
  .name           = "AMD ATI TV Wonder HD 600",
  .tuner_type     = TUNER_XC2028,
  .tuner_gpio     = default_tuner_gpio,
  .mts_firmware   = 1,
  .has_dvb        = 1,
  .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
  .ir_codes       = RC_MAP_ATI_TV_WONDER_HD_600,
  .decoder        = EM28XX_TVP5150,
  .input          = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
  .name           = "Terratec Hybrid XS",
  .tuner_type     = TUNER_XC2028,
  .tuner_gpio     = default_tuner_gpio,
  .decoder        = EM28XX_TVP5150,
  .has_dvb        = 1,
  .dvb_gpio       = default_digital,
  .ir_codes       = RC_MAP_TERRATEC_CINERGY_XS,
  .xclk           = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
  .input          = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = default_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = default_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = default_analog,
  } },
 },
 /*
 * maybe there's a reason behind it why Terratec sells the Hybrid XS
 * as Prodigy XS with a different PID, let's keep it separated for now
 * maybe we'll need it later on
 */

 [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
  .name         = "Terratec Prodigy XS",
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2820_BOARD_MSI_VOX_USB_2] = {
  .name     = "MSI VOX USB 2.0",
  .tuner_type    = TUNER_LG_PAL_NEW_TAPC,
  .tda9887_conf    = TDA9887_PRESENT      |
         TDA9887_PORT1_ACTIVE |
         TDA9887_PORT2_ACTIVE,
  .max_range_640_480 = 1,
  .decoder           = EM28XX_SAA711X,
  .input             = { {
   .type      = EM28XX_VMUX_TELEVISION,
   .vmux      = SAA7115_COMPOSITE4,
   .amux      = EM28XX_AMUX_VIDEO,
  }, {
   .type      = EM28XX_VMUX_COMPOSITE,
   .vmux      = SAA7115_COMPOSITE0,
   .amux      = EM28XX_AMUX_LINE_IN,
  }, {
   .type      = EM28XX_VMUX_SVIDEO,
   .vmux      = SAA7115_SVIDEO3,
   .amux      = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2800_BOARD_TERRATEC_CINERGY_200] = {
  .name         = "Terratec Cinergy 200 USB",
  .is_em2800    = 1,
  .has_ir_i2c   = 1,
  .tuner_type   = TUNER_LG_TALN,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2800_BOARD_GRABBEEX_USB2800] = {
  .name       = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
  .is_em2800  = 1,
  .decoder    = EM28XX_SAA711X,
  .tuner_type = TUNER_ABSENT, /* capture only board */
  .input      = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2800_BOARD_VC211A] = {
  .name         = "Actionmaster/LinXcel/Digitus VC211A",
  .is_em2800    = 1,
  .tuner_type   = TUNER_ABSENT, /* Capture-only board */
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = vc211a_enable,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = vc211a_enable,
  } },
 },
 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
  .name         = "Leadtek Winfast USB II",
  .is_em2800    = 1,
  .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2800_BOARD_KWORLD_USB2800] = {
  .name         = "Kworld USB2800",
  .is_em2800    = 1,
  .tuner_type   = TUNER_PHILIPS_FCV1236D,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_PINNACLE_DVC_90] = {
  .name       = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker / Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",
  .tuner_type   = TUNER_ABSENT, /* capture only board */
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2800_BOARD_VGEAR_POCKETTV] = {
  .name         = "V-Gear PocketTV",
  .is_em2800    = 1,
  .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
  .name         = "Pixelview PlayTV Box 4 USB 2.0",
  .tda9887_conf = TDA9887_PRESENT,
  .tuner_type   = TUNER_YMEC_TVF_5533MF,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
   .aout     = EM28XX_AOUT_MONO | /* I2S */
        EM28XX_AOUT_MASTER, /* Line out pin */
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
  .name         = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
  .buttons = std_snapshot_button,
  .tda9887_conf = TDA9887_PRESENT,
  .tuner_type   = TUNER_YMEC_TVF_5533MF,
  .tuner_addr   = 0x60,
  .decoder      = EM28XX_SAA711X,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = SAA7115_COMPOSITE2,
   .amux     = EM28XX_AMUX_VIDEO,
   .aout     = EM28XX_AOUT_MONO | /* I2S */
        EM28XX_AOUT_MASTER, /* Line out pin */
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
  .name                = "EM2860/SAA711X Reference Design",
  .buttons = std_snapshot_button,
  .tuner_type          = TUNER_ABSENT,
  .decoder             = EM28XX_SAA711X,
  .input               = { {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
  } },
 },

 [EM2874_BOARD_LEADERSHIP_ISDBT] = {
  .def_i2c_bus = 1,
  .i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |
      EM28XX_I2C_FREQ_100_KHZ,
  .xclk  = EM28XX_XCLK_FREQUENCY_10MHZ,
  .name  = "EM2874 Leadership ISDBT",
  .tuner_type = TUNER_ABSENT,
  .tuner_gpio     = leadership_reset,
  .dvb_gpio       = leadership_digital,
  .has_dvb = 1,
 },

 [EM2880_BOARD_MSI_DIGIVOX_AD] = {
  .name         = "MSI DigiVox A/D",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = em2880_msi_digivox_ad_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = em2880_msi_digivox_ad_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = em2880_msi_digivox_ad_analog,
  } },
 },
 [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
  .name         = "MSI DigiVox A/D II",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = em2880_msi_digivox_ad_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = em2880_msi_digivox_ad_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = em2880_msi_digivox_ad_analog,
  } },
 },
 [EM2880_BOARD_KWORLD_DVB_305U] = {
  .name       = "KWorld DVB-T 305U",
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2880_BOARD_KWORLD_DVB_310U] = {
  .name       = "KWorld DVB-T 310U",
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .has_dvb      = 1,
  .dvb_gpio     = default_digital,
  .mts_firmware = 1,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = default_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = default_analog,
  }, { /* S-video has not been tested yet */
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = default_analog,
  } },
 },
 [EM2882_BOARD_KWORLD_ATSC_315U] = {
  .name  = "KWorld ATSC 315U HDTV TV Box",
  .valid  = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type = TUNER_THOMSON_DTT761X,
  .tuner_gpio = em2882_kworld_315u_tuner_gpio,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder = EM28XX_SAA711X,
  .has_dvb = 1,
  .dvb_gpio = em2882_kworld_315u_digital,
  .ir_codes = RC_MAP_KWORLD_315U,
  .xclk  = EM28XX_XCLK_FREQUENCY_12MHZ,
  .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
#if 0
  /* FIXME: Analog mode - still not ready */
  .input        = { {
   .type = EM28XX_VMUX_TELEVISION,
   .vmux = SAA7115_COMPOSITE2,
   .amux = EM28XX_AMUX_VIDEO,
   .gpio = em2882_kworld_315u_analog,
   .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
  }, {
   .type = EM28XX_VMUX_COMPOSITE,
   .vmux = SAA7115_COMPOSITE0,
   .amux = EM28XX_AMUX_LINE_IN,
   .gpio = em2882_kworld_315u_analog1,
   .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
  }, {
   .type = EM28XX_VMUX_SVIDEO,
   .vmux = SAA7115_SVIDEO3,
   .amux = EM28XX_AMUX_LINE_IN,
   .gpio = em2882_kworld_315u_analog1,
   .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
  } },
#endif
 },
 [EM2880_BOARD_EMPIRE_DUAL_TV] = {
  .name = "Empire dual TV",
  .tuner_type = TUNER_XC2028,
  .tuner_gpio = default_tuner_gpio,
  .has_dvb = 1,
  .dvb_gpio = default_digital,
  .mts_firmware = 1,
  .decoder = EM28XX_TVP5150,
  .input = { {
   .type = EM28XX_VMUX_TELEVISION,
   .vmux = TVP5150_COMPOSITE0,
   .amux = EM28XX_AMUX_VIDEO,
   .gpio = default_analog,
  }, {
   .type = EM28XX_VMUX_COMPOSITE,
   .vmux = TVP5150_COMPOSITE1,
   .amux = EM28XX_AMUX_LINE_IN,
   .gpio = default_analog,
  }, {
   .type = EM28XX_VMUX_SVIDEO,
   .vmux = TVP5150_SVIDEO,
   .amux = EM28XX_AMUX_LINE_IN,
   .gpio = default_analog,
  } },
 },
 [EM2881_BOARD_DNT_DA2_HYBRID] = {
  .name         = "DNT DA2 Hybrid",
  .valid        = EM28XX_BOARD_NOT_VALIDATED,
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = default_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = default_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = default_analog,
  } },
 },
 [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
  .name         = "Pinnacle Hybrid Pro",
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .has_dvb      = 1,
  .dvb_gpio     = pinnacle_hybrid_pro_digital,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = pinnacle_hybrid_pro_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = pinnacle_hybrid_pro_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = pinnacle_hybrid_pro_analog,
  } },
 },
 [EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {
  .name         = "Pinnacle Hybrid Pro (330e)",
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .mts_firmware = 1,
  .has_dvb      = 1,
  .dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
  .ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2882_BOARD_KWORLD_VS_DVBT] = {
  .name         = "Kworld VS-DVB-T 323UR",
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .mts_firmware = 1,
  .has_dvb      = 1,
  .dvb_gpio     = kworld_330u_digital,
  .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
  .ir_codes     = RC_MAP_KWORLD_315U,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
  .name         = "Terratec Cinergy Hybrid T USB XS (em2882)",
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .mts_firmware = 1,
  .decoder      = EM28XX_TVP5150,
  .has_dvb      = 1,
  .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
  .ir_codes     = RC_MAP_TERRATEC_CINERGY_XS,
  .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = hauppauge_wintv_hvr_900_analog,
  } },
 },
 [EM2882_BOARD_DIKOM_DK300] = {
  .name         = "Dikom DK300",
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .mts_firmware = 1,
  .has_dvb      = 1,
  .dvb_gpio     = dikom_dk300_digital,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = default_analog,
  } },
 },
 [EM2883_BOARD_KWORLD_HYBRID_330U] = {
  .name         = "Kworld PlusTV HD Hybrid 330",
  .tuner_type   = TUNER_XC2028,
  .tuner_gpio   = default_tuner_gpio,
  .decoder      = EM28XX_TVP5150,
  .mts_firmware = 1,
  .has_dvb      = 1,
  .dvb_gpio     = kworld_330u_digital,
  .xclk             = EM28XX_XCLK_FREQUENCY_12MHZ,
  .i2c_speed        = EM28XX_I2C_CLK_WAIT_ENABLE |
        EM28XX_I2C_EEPROM_ON_BOARD |
        EM28XX_I2C_EEPROM_KEY_VALID,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = kworld_330u_analog,
   .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = kworld_330u_analog,
   .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = kworld_330u_analog,
  } },
 },
 [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
  .name         = "Compro VideoMate ForYou/Stereo",
  .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
  .tvaudio_addr = 0xb0,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_TVP5150,
  .adecoder     = EM28XX_TVAUDIO,
  .mute_gpio    = compro_mute_gpio,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
   .gpio     = compro_unmute_tv_gpio,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
   .gpio     = compro_unmute_svid_gpio,
  } },
 },
 [EM2860_BOARD_KAIOMY_TVNPC_U2] = {
  .name       = "Kaiomy TVnPC U2",
  .vchannels    = 3,
  .tuner_type   = TUNER_XC2028,
  .tuner_addr   = 0x61,
  .mts_firmware = 1,
  .decoder      = EM28XX_TVP5150,
  .tuner_gpio   = default_tuner_gpio,
  .ir_codes     = RC_MAP_KAIOMY,
  .input          = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,

  }, {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = TVP5150_SVIDEO,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
  .radio  = {
   .type     = EM28XX_RADIO,
   .amux     = EM28XX_AMUX_LINE_IN,
  }
 },
 [EM2860_BOARD_EASYCAP] = {
  .name         = "Easy Cap Capture DC-60",
  .vchannels    = 2,
  .tuner_type   = TUNER_ABSENT,
  .decoder      = EM28XX_SAA711X,
  .input           = { {
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = SAA7115_COMPOSITE0,
   .amux     = EM28XX_AMUX_LINE_IN,
  }, {
   .type     = EM28XX_VMUX_SVIDEO,
   .vmux     = SAA7115_SVIDEO3,
   .amux     = EM28XX_AMUX_LINE_IN,
  } },
 },
 [EM2820_BOARD_IODATA_GVMVP_SZ] = {
  .name       = "IO-DATA GV-MVP/SZ",
  .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
  .tuner_gpio   = default_tuner_gpio,
  .tda9887_conf = TDA9887_PRESENT,
  .decoder      = EM28XX_TVP5150,
  .input        = { {
   .type     = EM28XX_VMUX_TELEVISION,
   .vmux     = TVP5150_COMPOSITE0,
   .amux     = EM28XX_AMUX_VIDEO,
  }, { /* Composite has not been tested yet */
   .type     = EM28XX_VMUX_COMPOSITE,
   .vmux     = TVP5150_COMPOSITE1,
   .amux     = EM28XX_AMUX_VIDEO,
  }, { /* S-video has not been tested yet */
   .type     = EM28XX_VMUX_SVIDEO,
--> --------------------

--> maximum size reached

--> --------------------

Messung V0.5
C=96 H=100 G=97

¤ Dauer der Verarbeitung: 0.28 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge