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


Quelle  cx88-cards.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * device driver for Conexant 2388x based TV cards
 * card-specific stuff.
 *
 * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
 */


#include "cx88.h"
#include "tea5767.h"
#include "xc4000.h"

#include <linux/init.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/slab.h>

static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
static unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
static unsigned int card[]  = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };

module_param_array(tuner, int, NULL, 0444);
module_param_array(radio, int, NULL, 0444);
module_param_array(card,  int, NULL, 0444);

MODULE_PARM_DESC(tuner, "tuner type");
MODULE_PARM_DESC(radio, "radio tuner type");
MODULE_PARM_DESC(card, "card type");

static unsigned int latency = UNSET;
module_param(latency, int, 0444);
MODULE_PARM_DESC(latency, "pci latency timer");

static int disable_ir;
module_param(disable_ir, int, 0444);
MODULE_PARM_DESC(disable_ir, "Disable IR support");

#define dprintk(level, fmt, arg...) do {    \
 if (cx88_core_debug >= level)     \
  printk(KERN_DEBUG pr_fmt("%s: core:" fmt),  \
   __func__, ##arg);    \
while (0)

/* ------------------------------------------------------------------ */
/* board config info                                                  */

/* If radio_type !=UNSET, radio_addr should be specified
 */


static const struct cx88_board cx88_boards[] = {
 [CX88_BOARD_UNKNOWN] = {
  .name  = "UNKNOWN/GENERIC",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 0,
  }, {
   .type   = CX88_VMUX_COMPOSITE2,
   .vmux   = 1,
  }, {
   .type   = CX88_VMUX_COMPOSITE3,
   .vmux   = 2,
  }, {
   .type   = CX88_VMUX_COMPOSITE4,
   .vmux   = 3,
  } },
 },
 [CX88_BOARD_HAUPPAUGE] = {
  .name  = "Hauppauge WinTV 34xxx models",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0xff00,  // internal decoder
  }, {
   .type   = CX88_VMUX_DEBUG,
   .vmux   = 0,
   .gpio0  = 0xff01,  // mono from tuner chip
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0xff02,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0xff02,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0xff01,
  },
 },
 [CX88_BOARD_GDI] = {
  .name  = "GDI Black Gold",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
  } },
 },
 [CX88_BOARD_PIXELVIEW] = {
  .name           = "PixelView",
  .tuner_type     = TUNER_PHILIPS_PAL,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0xff00,  // internal decoder
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
  } },
  .radio = {
    .type  = CX88_RADIO,
    .gpio0 = 0xff10,
  },
 },
 [CX88_BOARD_ATI_WONDER_PRO] = {
  .name           = "ATI TV Wonder Pro",
  .tuner_type     = TUNER_PHILIPS_4IN1,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x03ff,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x03fe,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x03fe,
  } },
 },
 [CX88_BOARD_WINFAST2000XP_EXPERT] = {
  .name           = "Leadtek Winfast 2000XP Expert",
  .tuner_type     = TUNER_PHILIPS_4IN1,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0 = 0x00F5e700,
   .gpio1  = 0x00003004,
   .gpio2  = 0x00F5e700,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0 = 0x00F5c700,
   .gpio1  = 0x00003004,
   .gpio2  = 0x00F5c700,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0 = 0x00F5c700,
   .gpio1  = 0x00003004,
   .gpio2  = 0x00F5c700,
   .gpio3  = 0x02000000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0 = 0x00F5d700,
   .gpio1  = 0x00003004,
   .gpio2  = 0x00F5d700,
   .gpio3  = 0x02000000,
  },
 },
 [CX88_BOARD_AVERTV_STUDIO_303] = {
  .name           = "AverTV Studio 303 (M126)",
  .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio1  = 0xe09f,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio1  = 0xe05f,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio1  = 0xe05f,
  } },
  .radio = {
   .gpio1  = 0xe0df,
   .type   = CX88_RADIO,
  },
 },
 [CX88_BOARD_MSI_TVANYWHERE_MASTER] = {
  // added gpio values thanks to Michal
  // values for PAL from DScaler
  .name           = "MSI TV-@nywhere Master",
  .tuner_type     = TUNER_MT2032,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x000040bf,
   .gpio1  = 0x000080c0,
   .gpio2  = 0x0000ff40,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x000040bf,
   .gpio1  = 0x000080c0,
   .gpio2  = 0x0000ff40,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x000040bf,
   .gpio1  = 0x000080c0,
   .gpio2  = 0x0000ff40,
  } },
  .radio = {
    .type   = CX88_RADIO,
    .vmux   = 3,
    .gpio0  = 0x000040bf,
    .gpio1  = 0x000080c0,
    .gpio2  = 0x0000ff20,
  },
 },
 [CX88_BOARD_WINFAST_DV2000] = {
  .name           = "Leadtek Winfast DV2000",
  .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0035e700,
   .gpio1  = 0x00003004,
   .gpio2  = 0x0035e700,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0035c700,
   .gpio1  = 0x00003004,
   .gpio2  = 0x0035c700,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0035c700,
   .gpio1  = 0x0035c700,
   .gpio2  = 0x02000000,
   .gpio3  = 0x02000000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x0035d700,
   .gpio1  = 0x00007004,
   .gpio2  = 0x0035d700,
   .gpio3  = 0x02000000,
  },
 },
 [CX88_BOARD_LEADTEK_PVR2000] = {
  // gpio values for PAL version from regspy by DScaler
  .name           = "Leadtek PVR 2000",
  .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0000bde2,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0000bde6,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0000bde6,
   .audioroute = 1,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x0000bd62,
   .audioroute = 1,
  },
  .mpeg           = CX88_MPEG_BLACKBIRD,
 },
 [CX88_BOARD_IODATA_GVVCP3PCI] = {
  .name  = "IODATA GV-VCP3/PCI",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 0,
  }, {
   .type   = CX88_VMUX_COMPOSITE2,
   .vmux   = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
  } },
 },
 [CX88_BOARD_PROLINK_PLAYTVPVR] = {
  .name           = "Prolink PlayTV PVR",
  .tuner_type     = TUNER_PHILIPS_FM1236_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0xbff0,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0xbff3,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0xbff3,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0xbff0,
  },
 },
 [CX88_BOARD_ASUS_PVR_416] = {
  .name  = "ASUS PVR-416",
  .tuner_type     = TUNER_PHILIPS_FM1236_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0000fde6,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0000fde6, // 0x0000fda6 L,R RCA audio in?
   .audioroute = 1,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x0000fde2,
  },
  .mpeg           = CX88_MPEG_BLACKBIRD,
 },
 [CX88_BOARD_MSI_TVANYWHERE] = {
  .name           = "MSI TV-@nywhere",
  .tuner_type     = TUNER_MT2032,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x00000fbf,
   .gpio2  = 0x0000fc08,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x00000fbf,
   .gpio2  = 0x0000fc68,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x00000fbf,
   .gpio2  = 0x0000fc68,
  } },
 },
 [CX88_BOARD_KWORLD_DVB_T] = {
  .name           = "KWorld/VStream XPert DVB-T",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0700,
   .gpio2  = 0x0101,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0700,
   .gpio2  = 0x0101,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {
  .name           = "DViCO FusionHDTV DVB-T1",
  .tuner_type     = UNSET, /* No analog tuner */
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x000027df,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x000027df,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_KWORLD_LTV883] = {
  .name           = "KWorld LTV883RF",
  .tuner_type     = TUNER_TNF_8831BGFF,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x07f8,
  }, {
   .type   = CX88_VMUX_DEBUG,
   .vmux   = 0,
   .gpio0  = 0x07f9,  // mono from tuner chip
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x000007fa,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x000007fa,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x000007f8,
  },
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = {
  .name  = "DViCO FusionHDTV 3 Gold-Q",
  .tuner_type     = TUNER_MICROTUNE_4042FI5,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  /*
 * GPIO[0] resets DT3302 DTV receiver
 *     0 - reset asserted
 *     1 - normal operation
 * GPIO[1] mutes analog audio output connector
 *     0 - enable selected source
 *     1 - mute
 * GPIO[2] selects source for analog audio output connector
 *     0 - analog audio input connector on tab
 *     1 - analog DAC output from CX23881 chip
 * GPIO[3] selects RF input connector on tuner module
 *     0 - RF connector labeled CABLE
 *     1 - RF connector labeled ANT
 * GPIO[4] selects high RF for QAM256 mode
 *     0 - normal RF
 *     1 - high RF
 */

  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0 = 0x0f0d,
  }, {
   .type   = CX88_VMUX_CABLE,
   .vmux   = 0,
   .gpio0 = 0x0f05,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0 = 0x0f00,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0 = 0x0f00,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_HAUPPAUGE_DVB_T1] = {
  .name           = "Hauppauge Nova-T DVB-T",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_CONEXANT_DVB_T1] = {
  .name           = "Conexant DVB-T reference design",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_PROVIDEO_PV259] = {
  .name  = "Provideo PV259",
  .tuner_type     = TUNER_PHILIPS_FQ1216ME,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .audioroute = 1,
  } },
  .mpeg           = CX88_MPEG_BLACKBIRD,
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
  .name           = "DViCO FusionHDTV DVB-T Plus",
  .tuner_type     = UNSET, /* No analog tuner */
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x000027df,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x000027df,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_DNTV_LIVE_DVB_T] = {
  .name  = "digitalnow DNTV Live! DVB-T",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input  = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x00000700,
   .gpio2  = 0x00000101,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x00000700,
   .gpio2  = 0x00000101,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_PCHDTV_HD3000] = {
  .name           = "pcHDTV HD3000 HDTV",
  .tuner_type     = TUNER_THOMSON_DTT761X,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  /* GPIO[2] = audio source for analog audio out connector
 *  0 = analog audio input connector
 *  1 = CX88 audio DACs
 *
 * GPIO[7] = input to CX88's audio/chroma ADC
 *  0 = FM 10.7 MHz IF
 *  1 = Sound 4.5 MHz IF
 *
 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively
 *
 * GPIO[16] = Remote control input
 */

  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x00008484,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x00008400,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x00008400,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x00008404,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_HAUPPAUGE_ROSLYN] = {
  // entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>
  // GPIO values obtained from regspy, courtesy Sean Covel
  .name           = "Hauppauge WinTV 28xxx (Roslyn) models",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0xed1a,
   .gpio2  = 0x00ff,
  }, {
   .type   = CX88_VMUX_DEBUG,
   .vmux   = 0,
   .gpio0  = 0xff01,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0xff02,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0xed92,
   .gpio2  = 0x00ff,
  } },
  .radio = {
    .type   = CX88_RADIO,
    .gpio0  = 0xed96,
    .gpio2  = 0x00ff,
   },
  .mpeg           = CX88_MPEG_BLACKBIRD,
 },
 [CX88_BOARD_DIGITALLOGIC_MEC] = {
  .name           = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
  .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x00009d80,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x00009d76,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x00009d76,
   .audioroute = 1,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x00009d00,
   .audioroute = 1,
  },
  .mpeg           = CX88_MPEG_BLACKBIRD,
 },
 [CX88_BOARD_IODATA_GVBCTV7E] = {
  .name           = "IODATA GV/BCTV7E",
  .tuner_type     = TUNER_PHILIPS_FQ1286,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 1,
   .gpio1  = 0x0000e03f,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 2,
   .gpio1  = 0x0000e07f,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 3,
   .gpio1  = 0x0000e07f,
  } }
 },
 [CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = {
  .name           = "PixelView PlayTV Ultra Pro (Stereo)",
  /* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */
  .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  /*
 * Some variants use a tda9874 and so need the
 * tvaudio module.
 */

  .audio_chip     = CX88_AUDIO_TVAUDIO,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0xbf61,  /* internal decoder */
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0 = 0xbf63,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0 = 0xbf63,
  } },
  .radio = {
    .type  = CX88_RADIO,
    .gpio0 = 0xbf60,
   },
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = {
  .name           = "DViCO FusionHDTV 3 Gold-T",
  .tuner_type     = TUNER_THOMSON_DTT761X,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x97ed,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x97e9,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x97e9,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_ADSTECH_DVB_T_PCI] = {
  .name           = "ADS Tech Instant TV DVB-T PCI",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0700,
   .gpio2  = 0x0101,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0700,
   .gpio2  = 0x0101,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {
  .name           = "TerraTec Cinergy 1400 DVB-T",
  .tuner_type     = UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 2,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {
  .name           = "DViCO FusionHDTV 5 Gold",
  .tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x87fd,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x87f9,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x87f9,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {
  .name           = "AverMedia UltraTV Media Center PCI 550",
  .tuner_type     = TUNER_PHILIPS_FM1236_MK3,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 0,
   .gpio0  = 0x0000cd73,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 1,
   .gpio0  = 0x0000cd73,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 3,
   .gpio0  = 0x0000cdb3,
   .audioroute = 1,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .vmux   = 2,
   .gpio0  = 0x0000cdf3,
   .audioroute = 1,
  },
  .mpeg           = CX88_MPEG_BLACKBIRD,
 },
 [CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = {
   /* Alexander Wold <awold@bigfoot.com> */
   .name           = "Kworld V-Stream Xpert DVD",
   .tuner_type     = UNSET,
   .input          = { {
    .type   = CX88_VMUX_COMPOSITE1,
    .vmux   = 1,
    .gpio0  = 0x03000000,
    .gpio1  = 0x01000000,
    .gpio2  = 0x02000000,
    .gpio3  = 0x00100000,
   }, {
    .type   = CX88_VMUX_SVIDEO,
    .vmux   = 2,
    .gpio0  = 0x03000000,
    .gpio1  = 0x01000000,
    .gpio2  = 0x02000000,
    .gpio3  = 0x00100000,
   } },
 },
 [CX88_BOARD_ATI_HDTVWONDER] = {
  .name           = "ATI HDTV Wonder",
  .tuner_type     = TUNER_PHILIPS_TUV1236D,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x00000ff7,
   .gpio1  = 0x000000ff,
   .gpio2  = 0x00000001,
   .gpio3  = 0x00000000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x00000ffe,
   .gpio1  = 0x000000ff,
   .gpio2  = 0x00000001,
   .gpio3  = 0x00000000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x00000ffe,
   .gpio1  = 0x000000ff,
   .gpio2  = 0x00000001,
   .gpio3  = 0x00000000,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_WINFAST_DTV1000] = {
  .name           = "WinFast DTV1000-T",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_AVERTV_303] = {
  .name           = "AVerTV 303 (M126)",
  .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x00ff,
   .gpio1  = 0xe09f,
   .gpio2  = 0x0010,
   .gpio3  = 0x0000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x00ff,
   .gpio1  = 0xe05f,
   .gpio2  = 0x0010,
   .gpio3  = 0x0000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x00ff,
   .gpio1  = 0xe05f,
   .gpio2  = 0x0010,
   .gpio3  = 0x0000,
  } },
 },
 [CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = {
  .name  = "Hauppauge Nova-S-Plus DVB-S",
  .tuner_type = UNSET,
  .radio_type = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .audio_chip = CX88_AUDIO_WM8775,
  .i2sinputcntl   = 2,
  .input  = { {
   .type = CX88_VMUX_DVB,
   .vmux = 0,
   /* 2: Line-In */
   .audioroute = 2,
  }, {
   .type = CX88_VMUX_COMPOSITE1,
   .vmux = 1,
   /* 2: Line-In */
   .audioroute = 2,
  }, {
   .type = CX88_VMUX_SVIDEO,
   .vmux = 2,
   /* 2: Line-In */
   .audioroute = 2,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {
  .name  = "Hauppauge Nova-SE2 DVB-S",
  .tuner_type = UNSET,
  .radio_type = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input  = { {
   .type = CX88_VMUX_DVB,
   .vmux = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_KWORLD_DVBS_100] = {
  .name  = "KWorld DVB-S 100",
  .tuner_type = UNSET,
  .radio_type = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .audio_chip = CX88_AUDIO_WM8775,
  .input  = { {
   .type = CX88_VMUX_DVB,
   .vmux = 0,
   /* 2: Line-In */
   .audioroute = 2,
  }, {
   .type = CX88_VMUX_COMPOSITE1,
   .vmux = 1,
   /* 2: Line-In */
   .audioroute = 2,
  }, {
   .type = CX88_VMUX_SVIDEO,
   .vmux = 2,
   /* 2: Line-In */
   .audioroute = 2,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_HAUPPAUGE_HVR1100] = {
  .name  = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
  .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  .radio_type = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input  = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
  }, {
   .type = CX88_VMUX_COMPOSITE1,
   .vmux = 1,
  }, {
   .type = CX88_VMUX_SVIDEO,
   .vmux = 2,
  } },
  /* fixme: Add radio support */
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_HAUPPAUGE_HVR1100LP] = {
  .name  = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
  .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  .radio_type = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input  = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
  }, {
   .type = CX88_VMUX_COMPOSITE1,
   .vmux = 1,
  } },
  /* fixme: Add radio support */
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {
  .name           = "digitalnow DNTV Live! DVB-T Pro",
  .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
      TDA9887_PORT2_ACTIVE,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0xf80808,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0 = 0xf80808,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0 = 0xf80808,
  } },
  .radio = {
    .type  = CX88_RADIO,
    .gpio0 = 0xf80808,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_KWORLD_DVB_T_CX22702] = {
  /* Kworld V-stream Xpert DVB-T with Thomson tuner */
  /* DTT 7579 Conexant CX22702-19 Conexant CX2388x  */
  /* Manenti Marco <marco_manenti@colman.it> */
  .name           = "KWorld/VStream XPert DVB-T with cx22702",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0700,
   .gpio2  = 0x0101,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0700,
   .gpio2  = 0x0101,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {
  .name           = "DViCO FusionHDTV DVB-T Dual Digital",
  .tuner_type     = UNSET, /* No analog tuner */
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x000067df,
   }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x000067df,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {
  .name           = "KWorld HardwareMpegTV XPert",
  .tuner_type     = TUNER_PHILIPS_TDA8290,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x3de2,
   .gpio2  = 0x00ff,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x3de6,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x3de6,
   .audioroute = 1,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x3de6,
   .gpio2  = 0x00ff,
  },
  .mpeg           = CX88_MPEG_BLACKBIRD,
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {
  .name           = "DViCO FusionHDTV DVB-T Hybrid",
  .tuner_type     = TUNER_THOMSON_FE6600,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0000a75f,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0000a75b,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0000a75b,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_PCHDTV_HD5500] = {
  .name           = "pcHDTV HD5500 HDTV",
  .tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x87fd,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x87f9,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x87f9,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_KWORLD_MCE200_DELUXE] = {
  /*
 * FIXME: tested TV input only, disabled composite,
 * svideo and radio until they can be tested also.
 */

  .name           = "Kworld MCE 200 Deluxe",
  .tuner_type     = TUNER_TENA_9533_DI,
  .radio_type     = UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0000BDE6
  } },
  .mpeg           = CX88_MPEG_BLACKBIRD,
 },
 [CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {
  /* FIXME: SVideo, Composite and FM inputs are untested */
  .name           = "PixelView PlayTV P7000",
  .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
      TDA9887_PORT2_ACTIVE,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x5da6,
  } },
  .mpeg           = CX88_MPEG_BLACKBIRD,
 },
 [CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {
  .name           = "NPG Tech Real TV FM Top 10",
  .tuner_type     = TUNER_TNF_5335MF, /* Actually a TNF9535 */
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0 = 0x0788,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0 = 0x078b,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0 = 0x078b,
  } },
  .radio = {
    .type  = CX88_RADIO,
    .gpio0 = 0x074a,
  },
 },
 [CX88_BOARD_WINFAST_DTV2000H] = {
  .name           = "WinFast DTV2000 H",
  .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x00017304,
   .gpio1  = 0x00008203,
   .gpio2  = 0x00017304,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0001d701,
   .gpio1  = 0x0000b207,
   .gpio2  = 0x0001d701,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_COMPOSITE2,
   .vmux   = 2,
   .gpio0  = 0x0001d503,
   .gpio1  = 0x0000b207,
   .gpio2  = 0x0001d503,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 3,
   .gpio0  = 0x0001d701,
   .gpio1  = 0x0000b207,
   .gpio2  = 0x0001d701,
   .gpio3  = 0x02000000,
  } },
  .radio = {
    .type  = CX88_RADIO,
    .gpio0 = 0x00015702,
    .gpio1 = 0x0000f207,
    .gpio2 = 0x00015702,
    .gpio3 = 0x02000000,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_WINFAST_DTV2000H_J] = {
  .name           = "WinFast DTV2000 H rev. J",
  .tuner_type     = TUNER_PHILIPS_FMD1216MEX_MK3,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x00017300,
   .gpio1  = 0x00008207,
   .gpio2 = 0x00000000,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x00018300,
   .gpio1  = 0x0000f207,
   .gpio2 = 0x00017304,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x00018301,
   .gpio1  = 0x0000f207,
   .gpio2 = 0x00017304,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x00018301,
   .gpio1  = 0x0000f207,
   .gpio2 = 0x00017304,
   .gpio3  = 0x02000000,
  } },
  .radio = {
    .type  = CX88_RADIO,
    .gpio0 = 0x00015702,
    .gpio1 = 0x0000f207,
    .gpio2 = 0x00015702,
    .gpio3 = 0x02000000,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_GENIATECH_DVBS] = {
  .name          = "Geniatech DVB-S",
  .tuner_type    = UNSET,
  .radio_type    = UNSET,
  .tuner_addr    = ADDR_UNSET,
  .radio_addr    = ADDR_UNSET,
  .input  = { {
   .type  = CX88_VMUX_DVB,
   .vmux  = 0,
  }, {
   .type  = CX88_VMUX_COMPOSITE1,
   .vmux  = 1,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_HAUPPAUGE_HVR3000] = {
  .name           = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",
  .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .audio_chip     = CX88_AUDIO_WM8775,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x84bf,
   /* 1: TV Audio / FM Mono */
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x84bf,
   /* 2: Line-In */
   .audioroute = 2,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x84bf,
   /* 2: Line-In */
   .audioroute = 2,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0 = 0x84bf,
   /* 4: FM Stereo (untested) */
   .audioroute = 8,
  },
  .mpeg           = CX88_MPEG_DVB,
  .num_frontends = 2,
 },
 [CX88_BOARD_NORWOOD_MICRO] = {
  .name           = "Norwood Micro TV Tuner",
  .tuner_type     = TUNER_TNF_5335MF,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0709,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x070b,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x070b,
  } },
 },
 [CX88_BOARD_TE_DTV_250_OEM_SWANN] = {
  .name           = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",
  .tuner_type     = TUNER_LG_PAL_NEW_TAPC,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x003fffff,
   .gpio1  = 0x00e00000,
   .gpio2  = 0x003fffff,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x003fffff,
   .gpio1  = 0x00e00000,
   .gpio2  = 0x003fffff,
   .gpio3  = 0x02000000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x003fffff,
   .gpio1  = 0x00e00000,
   .gpio2  = 0x003fffff,
   .gpio3  = 0x02000000,
  } },
 },
 [CX88_BOARD_HAUPPAUGE_HVR1300] = {
  .name  = "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",
  .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  .radio_type = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .audio_chip     = CX88_AUDIO_WM8775,
  /*
 * gpio0 as reported by Mike Crash <mike AT mikecrash.com>
 */

  .input  = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0 = 0xef88,
   /* 1: TV Audio / FM Mono */
   .audioroute = 1,
  }, {
   .type = CX88_VMUX_COMPOSITE1,
   .vmux = 1,
   .gpio0 = 0xef88,
   /* 2: Line-In */
   .audioroute = 2,
  }, {
   .type = CX88_VMUX_SVIDEO,
   .vmux = 2,
   .gpio0 = 0xef88,
   /* 2: Line-In */
   .audioroute = 2,
  } },
  .mpeg           = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD,
  .radio = {
   .type   = CX88_RADIO,
   .gpio0 = 0xef88,
   /* 4: FM Stereo (untested) */
   .audioroute = 8,
  },
 },
 [CX88_BOARD_SAMSUNG_SMT_7020] = {
  .name  = "Samsung SMT 7020 DVB-S",
  .tuner_type = UNSET,
  .radio_type = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input  = { {
   .type = CX88_VMUX_DVB,
   .vmux = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_ADSTECH_PTV_390] = {
  .name           = "ADS Tech Instant Video PCI",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DEBUG,
   .vmux   = 3,
   .gpio0  = 0x04ff,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x07fa,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x07fa,
  } },
 },
 [CX88_BOARD_PINNACLE_PCTV_HD_800i] = {
  .name           = "Pinnacle PCTV HD 800i",
  .tuner_type     = TUNER_XC5000,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x04fb,
   .gpio1  = 0x10ff,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x04fb,
   .gpio1  = 0x10ef,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x04fb,
   .gpio1  = 0x10ef,
   .audioroute = 1,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = {
  .name           = "DViCO FusionHDTV 5 PCI nano",
  /* xc3008 tuner, digital only for now */
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x000027df, /* Unconfirmed */
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x000027df, /* Unconfirmed */
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x000027df, /* Unconfirmed */
   .audioroute = 1,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_PINNACLE_HYBRID_PCTV] = {
  .name           = "Pinnacle Hybrid PCTV",
  .tuner_type     = TUNER_XC2028,
  .tuner_addr     = 0x61,
  .radio_type     = UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x004ff,
   .gpio1  = 0x010ff,
   .gpio2  = 0x00001,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x004fb,
   .gpio1  = 0x010ef,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x004fb,
   .gpio1  = 0x010ef,
   .audioroute = 1,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x004ff,
   .gpio1  = 0x010ff,
   .gpio2  = 0x0ff,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 /* Terry Wu <terrywu2009@gmail.com> */
 /* TV Audio :      set GPIO 2, 18, 19 value to 0, 1, 0 */
 /* FM Audio :      set GPIO 2, 18, 19 value to 0, 0, 0 */
 /* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */
 /* Mute Audio :    set GPIO 2 value to 1               */
 [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = {
  .name           = "Leadtek TV2000 XP Global",
  .tuner_type     = TUNER_XC2028,
  .tuner_addr     = 0x61,
  .radio_type     = UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x0000,
   .gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
   .gpio3  = 0x0000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x0000,
   .gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
   .gpio3  = 0x0000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x0000,
   .gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
   .gpio3  = 0x0000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x0400,        /* pin 2 = 0 */
   .gpio1  = 0x0000,
   .gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
   .gpio3  = 0x0000,
  },
 },
 [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36] = {
  .name           = "Leadtek TV2000 XP Global (SC4100)",
  .tuner_type     = TUNER_XC4000,
  .tuner_addr     = 0x61,
  .radio_type     = UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x0000,
   .gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
   .gpio3  = 0x0000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x0000,
   .gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
   .gpio3  = 0x0000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x0000,
   .gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
   .gpio3  = 0x0000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x0400,        /* pin 2 = 0 */
   .gpio1  = 0x0000,
   .gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
   .gpio3  = 0x0000,
  },
 },
 [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43] = {
  .name           = "Leadtek TV2000 XP Global (XC4100)",
  .tuner_type     = TUNER_XC4000,
  .tuner_addr     = 0x61,
  .radio_type     = UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x6040,       /* pin 14 = 1, pin 13 = 0 */
   .gpio2  = 0x0000,
   .gpio3  = 0x0000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
   .gpio2  = 0x0000,
   .gpio3  = 0x0000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
   .gpio2  = 0x0000,
   .gpio3  = 0x0000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x0400,        /* pin 2 = 0 */
   .gpio1  = 0x6000,        /* pin 14 = 1, pin 13 = 0 */
   .gpio2  = 0x0000,
   .gpio3  = 0x0000,
  },
 },
 [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
  /* Long names may confuse LIRC. */
  .name           = "PowerColor RA330",
  .tuner_type     = TUNER_XC2028,
  .tuner_addr     = 0x61,
  .input          = { {
   /*
 * Due to the way the cx88 driver is written,
 * there is no way to deactivate audio pass-
 * through without this entry. Furthermore, if
 * the TV mux entry is first, you get audio
 * from the tuner on boot for a little while.
 */

   .type   = CX88_VMUX_DEBUG,
   .vmux   = 3,
   .gpio0 = 0x00ff,
   .gpio1 = 0xf39d,
   .gpio3 = 0x0000,
  }, {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0 = 0x00ff,
   .gpio1 = 0xf35d,
   .gpio3 = 0x0000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0 = 0x00ff,
   .gpio1 = 0xf37d,
   .gpio3 = 0x0000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x000ff,
   .gpio1  = 0x0f37d,
   .gpio3  = 0x00000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x000ff,
   .gpio1  = 0x0f35d,
   .gpio3  = 0x00000,
  },
 },
 [CX88_BOARD_GENIATECH_X8000_MT] = {
  /* Also PowerColor Real Angel 330 and Geniatech X800 OEM */
  .name           = "Geniatech X8000-MT DVBT",
  .tuner_type     = TUNER_XC2028,
  .tuner_addr     = 0x61,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x00000000,
   .gpio1  = 0x00e3e341,
   .gpio2  = 0x00000000,
   .gpio3  = 0x00000000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x00000000,
   .gpio1  = 0x00e3e361,
   .gpio2  = 0x00000000,
   .gpio3  = 0x00000000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x00000000,
   .gpio1  = 0x00e3e361,
   .gpio2  = 0x00000000,
   .gpio3  = 0x00000000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x00000000,
   .gpio1  = 0x00e3e341,
   .gpio2  = 0x00000000,
   .gpio3  = 0x00000000,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_NOTONLYTV_LV3H] = {
  .name           = "NotOnlyTV LV3H",
  .tuner_type     = TUNER_XC2028,
  .radio_type     = UNSET,
  .tuner_addr     = 0x61,
  .radio_addr     = ADDR_UNSET,
  /* if gpio1:bit9 is enabled, DVB-T won't work */

  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0000,
   .gpio1  = 0xa141,
   .gpio2  = 0x0000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0000,
   .gpio1  = 0xa161,
   .gpio2  = 0x0000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0000,
   .gpio1  = 0xa161,
   .gpio2  = 0x0000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x0000,
   .gpio1  = 0xa141,
   .gpio2  = 0x0000,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = {
  .name           = "DViCO FusionHDTV DVB-T PRO",
  .tuner_type     = TUNER_XC2028,
  .tuner_addr     = 0x61,
  .radio_type     = UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x000067df,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x000067df,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = {
  .name           = "DViCO FusionHDTV 7 Gold",
  .tuner_type     = TUNER_XC5000,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x10df,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x16d9,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x16d9,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_PROLINK_PV_8000GT] = {
  .name           = "Prolink Pixelview MPEG 8000GT",
  .tuner_type     = TUNER_XC2028,
  .tuner_addr     = 0x61,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0 = 0x0ff,
   .gpio2 = 0x0cfb,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio2 = 0x0cfb,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio2 = 0x0cfb,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio2 = 0x0cfb,
  },
 },
 [CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = {
  .name           = "Prolink Pixelview Global Extreme",
  .tuner_type     = TUNER_XC2028,
  .tuner_addr     = 0x61,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0 = 0x04fb,
   .gpio1 = 0x04080,
   .gpio2 = 0x0cf7,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0 = 0x04fb,
   .gpio1 = 0x04080,
   .gpio2 = 0x0cfb,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0 = 0x04fb,
   .gpio1 = 0x04080,
   .gpio2 = 0x0cfb,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0 = 0x04ff,
   .gpio1 = 0x04080,
   .gpio2 = 0x0cf7,
  },
 },
 /*
 * Both radio, analog and ATSC work with this board.
 * However, for analog to work, s5h1409 gate should be open,
 * otherwise, tuner-xc3028 won't be detected.
 * A proper fix require using the newer i2c methods to add
 * tuner-xc3028 without doing an i2c probe.
 */

 [CX88_BOARD_KWORLD_ATSC_120] = {
  .name           = "Kworld PlusTV HD PCI 120 (ATSC 120)",
  .tuner_type     = TUNER_XC2028,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x000000ff,
   .gpio1  = 0x0000f35d,
   .gpio2  = 0x00000000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x000000ff,
   .gpio1  = 0x0000f37e,
   .gpio2  = 0x00000000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x000000ff,
   .gpio1  = 0x0000f37e,
   .gpio2  = 0x00000000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x000000ff,
   .gpio1  = 0x0000f35d,
   .gpio2  = 0x00000000,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_HAUPPAUGE_HVR4000] = {
  .name           = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",
  .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .tda9887_conf   = TDA9887_PRESENT,
  .audio_chip     = CX88_AUDIO_WM8775,
  /*
 * GPIO0 (WINTV2000)
 *
 * Analogue     SAT     DVB-T
 * Antenna      0xc4bf  0xc4bb
 * Composite    0xc4bf  0xc4bb
 * S-Video      0xc4bf  0xc4bb
 * Composite1   0xc4ff  0xc4fb
 * S-Video1     0xc4ff  0xc4fb
 *
 * BIT  VALUE   FUNCTION GP{x}_IO
 * 0    1       I:?
 * 1    1       I:?
 * 2    1       O:MPEG PORT 0=DVB-T 1=DVB-S
 * 3    1       I:?
 * 4    1       I:?
 * 5    1       I:?
 * 6    0       O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION
 * 7    1       O:DVB-T DEMOD RESET LOW
 *
 * BIT  VALUE   FUNCTION GP{x}_OE
 * 8    0       I
 * 9    0       I
 * a    1       O
 * b    0       I
 * c    0       I
 * d    0       I
 * e    1       O
 * f    1       O
 *
 * WM8775 ADC
 *
 * 1: TV Audio / FM Mono
 * 2: Line-In
 * 3: Line-In Expansion
 * 4: FM Stereo
 */

  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0xc4bf,
   /* 1: TV Audio / FM Mono */
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0xc4bf,
   /* 2: Line-In */
   .audioroute = 2,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0xc4bf,
   /* 2: Line-In */
   .audioroute = 2,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0 = 0xc4bf,
   /* 4: FM Stereo */
   .audioroute = 8,
  },
  .mpeg           = CX88_MPEG_DVB,
  .num_frontends = 2,
 },
 [CX88_BOARD_HAUPPAUGE_HVR4000LITE] = {
  .name           = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_TEVII_S420] = {
  .name           = "TeVii S420 DVB-S",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_TEVII_S460] = {
  .name           = "TeVii S460 DVB-S/S2",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_TEVII_S464] = {
  .name           = "TeVii S464 DVB-S/S2",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_OMICOM_SS4_PCI] = {
  .name           = "Omicom SS4 DVB-S/S2 PCI",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_TBS_8910] = {
  .name           = "TBS 8910 DVB-S",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_TBS_8920] = {
  .name           = "TBS 8920 DVB-S/S2",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
   .gpio0  = 0x8080,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_PROF_6200] = {
  .name           = "Prof 6200 DVB-S",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_PROF_7300] = {
  .name           = "PROF 7300 DVB-S/S2",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_SATTRADE_ST4200] = {
  .name           = "SATTRADE ST4200 DVB-S/S2",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = {
  .name           = "Terratec Cinergy HT PCI MKII",
  .tuner_type     = TUNER_XC2028,
  .tuner_addr     = 0x61,
  .radio_type     = UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x004ff,
   .gpio1  = 0x010ff,
   .gpio2  = 0x00001,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x004fb,
   .gpio1  = 0x010ef,
   .audioroute = 1,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x004fb,
   .gpio1  = 0x010ef,
   .audioroute = 1,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x004ff,
   .gpio1  = 0x010ff,
   .gpio2  = 0x0ff,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_HAUPPAUGE_IRONLY] = {
  .name           = "Hauppauge WinTV-IR Only",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr = ADDR_UNSET,
  .radio_addr = ADDR_UNSET,
 },
 [CX88_BOARD_WINFAST_DTV1800H] = {
  .name           = "Leadtek WinFast DTV1800 Hybrid",
  .tuner_type     = TUNER_XC2028,
  .radio_type     = UNSET,
  .tuner_addr     = 0x61,
  .radio_addr     = ADDR_UNSET,
  /*
 * GPIO setting
 *
 *  2: mute (0=off,1=on)
 * 12: tuner reset pin
 * 13: audio source (0=tuner audio,1=line in)
 * 14: FM (0=on,1=off ???)
 */

  .input          = { {
   .type   = CX88_VMUX_TELEVISION,
   .vmux   = 0,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x6040,       /* pin 13 = 0, pin 14 = 1 */
   .gpio2  = 0x0000,
  }, {
   .type   = CX88_VMUX_COMPOSITE1,
   .vmux   = 1,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
   .gpio2  = 0x0000,
  }, {
   .type   = CX88_VMUX_SVIDEO,
   .vmux   = 2,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
   .gpio2  = 0x0000,
  } },
  .radio = {
   .type   = CX88_RADIO,
   .gpio0  = 0x0400,       /* pin 2 = 0 */
   .gpio1  = 0x6000,       /* pin 13 = 0, pin 14 = 0 */
   .gpio2  = 0x0000,
  },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_WINFAST_DTV1800H_XC4000] = {
  .name  = "Leadtek WinFast DTV1800 H (XC4000)",
  .tuner_type = TUNER_XC4000,
  .radio_type = UNSET,
  .tuner_addr = 0x61,
  .radio_addr = ADDR_UNSET,
  /*
 * GPIO setting
 *
 *  2: mute (0=off,1=on)
 * 12: tuner reset pin
 * 13: audio source (0=tuner audio,1=line in)
 * 14: FM (0=on,1=off ???)
 */

  .input  = { {
   .type = CX88_VMUX_TELEVISION,
   .vmux = 0,
   .gpio0 = 0x0400, /* pin 2 = 0 */
   .gpio1 = 0x6040, /* pin 13 = 0, pin 14 = 1 */
   .gpio2 = 0x0000,
  }, {
   .type = CX88_VMUX_COMPOSITE1,
   .vmux = 1,
   .gpio0 = 0x0400, /* pin 2 = 0 */
   .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */
   .gpio2 = 0x0000,
  }, {
   .type = CX88_VMUX_SVIDEO,
   .vmux = 2,
   .gpio0 = 0x0400, /* pin 2 = 0 */
   .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */
   .gpio2 = 0x0000,
  } },
  .radio = {
   .type = CX88_RADIO,
   .gpio0 = 0x0400, /* pin 2 = 0 */
   .gpio1 = 0x6000, /* pin 13 = 0, pin 14 = 0 */
   .gpio2 = 0x0000,
  },
  .mpeg  = CX88_MPEG_DVB,
 },
 [CX88_BOARD_WINFAST_DTV2000H_PLUS] = {
  .name  = "Leadtek WinFast DTV2000 H PLUS",
  .tuner_type = TUNER_XC4000,
  .radio_type = UNSET,
  .tuner_addr = 0x61,
  .radio_addr = ADDR_UNSET,
  /*
 * GPIO
 *   2: 1: mute audio
 *  12: 0: reset XC4000
 *  13: 1: audio input is line in (0: tuner)
 *  14: 0: FM radio
 *  16: 0: RF input is cable
 */

  .input  = { {
   .type = CX88_VMUX_TELEVISION,
   .vmux = 0,
   .gpio0 = 0x0403,
   .gpio1 = 0xF0D7,
   .gpio2 = 0x0101,
   .gpio3 = 0x0000,
  }, {
   .type = CX88_VMUX_CABLE,
   .vmux = 0,
   .gpio0 = 0x0403,
   .gpio1 = 0xF0D7,
   .gpio2 = 0x0100,
   .gpio3 = 0x0000,
  }, {
   .type = CX88_VMUX_COMPOSITE1,
   .vmux = 1,
   .gpio0 = 0x0403, /* was 0x0407 */
   .gpio1 = 0xF0F7,
   .gpio2 = 0x0101,
   .gpio3 = 0x0000,
  }, {
   .type = CX88_VMUX_SVIDEO,
   .vmux = 2,
   .gpio0 = 0x0403, /* was 0x0407 */
   .gpio1 = 0xF0F7,
   .gpio2 = 0x0101,
   .gpio3 = 0x0000,
  } },
  .radio = {
   .type = CX88_RADIO,
   .gpio0 = 0x0403,
   .gpio1 = 0xF097,
   .gpio2 = 0x0100,
   .gpio3 = 0x0000,
  },
  .mpeg  = CX88_MPEG_DVB,
 },
 [CX88_BOARD_PROF_7301] = {
  .name           = "Prof 7301 DVB-S/S2",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
   .type   = CX88_VMUX_DVB,
   .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
 [CX88_BOARD_TWINHAN_VP1027_DVBS] = {
  .name  = "Twinhan VP-1027 DVB-S",
  .tuner_type     = UNSET,
  .radio_type     = UNSET,
  .tuner_addr     = ADDR_UNSET,
  .radio_addr     = ADDR_UNSET,
  .input          = { {
         .type   = CX88_VMUX_DVB,
         .vmux   = 0,
  } },
  .mpeg           = CX88_MPEG_DVB,
 },
};

/* ------------------------------------------------------------------ */
/* PCI subsystem IDs                                                  */

static const struct cx88_subid cx88_subids[] = {
 {
  .subvendor = 0x0070,
  .subdevice = 0x3400,
  .card      = CX88_BOARD_HAUPPAUGE,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x3401,
  .card      = CX88_BOARD_HAUPPAUGE,
 }, {
  .subvendor = 0x14c7,
  .subdevice = 0x0106,
  .card      = CX88_BOARD_GDI,
 }, {
  .subvendor = 0x14c7,
  .subdevice = 0x0107, /* with mpeg encoder */
  .card      = CX88_BOARD_GDI,
 }, {
  .subvendor = PCI_VENDOR_ID_ATI,
  .subdevice = 0x00f8,
  .card      = CX88_BOARD_ATI_WONDER_PRO,
 }, {
  .subvendor = PCI_VENDOR_ID_ATI,
  .subdevice = 0x00f9,
  .card      = CX88_BOARD_ATI_WONDER_PRO,
 }, {
  .subvendor = 0x107d,
  .subdevice = 0x6611,
  .card      = CX88_BOARD_WINFAST2000XP_EXPERT,
 }, {
  .subvendor = 0x107d,
  .subdevice = 0x6613, /* NTSC */
  .card      = CX88_BOARD_WINFAST2000XP_EXPERT,
 }, {
  .subvendor = 0x107d,
  .subdevice = 0x6620,
  .card      = CX88_BOARD_WINFAST_DV2000,
 }, {
  .subvendor = 0x107d,
  .subdevice = 0x663b,
  .card      = CX88_BOARD_LEADTEK_PVR2000,
 }, {
  .subvendor = 0x107d,
  .subdevice = 0x663c,
  .card      = CX88_BOARD_LEADTEK_PVR2000,
 }, {
  .subvendor = 0x1461,
  .subdevice = 0x000b,
  .card      = CX88_BOARD_AVERTV_STUDIO_303,
 }, {
  .subvendor = 0x1462,
  .subdevice = 0x8606,
  .card      = CX88_BOARD_MSI_TVANYWHERE_MASTER,
 }, {
  .subvendor = 0x10fc,
  .subdevice = 0xd003,
  .card      = CX88_BOARD_IODATA_GVVCP3PCI,
 }, {
  .subvendor = 0x1043,
  .subdevice = 0x4823,  /* with mpeg encoder */
  .card      = CX88_BOARD_ASUS_PVR_416,
 }, {
  .subvendor = 0x17de,
  .subdevice = 0x08a6,
  .card      = CX88_BOARD_KWORLD_DVB_T,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xd810,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xd820,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdb00,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9002,
  .card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
 }, {
  .subvendor = 0x14f1,
  .subdevice = 0x0187,
  .card      = CX88_BOARD_CONEXANT_DVB_T1,
 }, {
  .subvendor = 0x1540,
  .subdevice = 0x2580,
  .card      = CX88_BOARD_PROVIDEO_PV259,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdb10,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
 }, {
  .subvendor = 0x1554,
  .subdevice = 0x4811,
  .card      = CX88_BOARD_PIXELVIEW,
 }, {
  .subvendor = 0x7063,
  .subdevice = 0x3000, /* HD-3000 card */
  .card      = CX88_BOARD_PCHDTV_HD3000,
 }, {
  .subvendor = 0x17de,
  .subdevice = 0xa8a6,
  .card      = CX88_BOARD_DNTV_LIVE_DVB_T,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x2801,
  .card      = CX88_BOARD_HAUPPAUGE_ROSLYN,
 }, {
  .subvendor = 0x14f1,
  .subdevice = 0x0342,
  .card      = CX88_BOARD_DIGITALLOGIC_MEC,
 }, {
  .subvendor = 0x10fc,
  .subdevice = 0xd035,
  .card      = CX88_BOARD_IODATA_GVBCTV7E,
 }, {
  .subvendor = 0x1421,
  .subdevice = 0x0334,
  .card      = CX88_BOARD_ADSTECH_DVB_T_PCI,
 }, {
  .subvendor = 0x153b,
  .subdevice = 0x1166,
  .card      = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xd500,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD,
 }, {
  .subvendor = 0x1461,
  .subdevice = 0x8011,
  .card      = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550,
 }, {
  .subvendor = PCI_VENDOR_ID_ATI,
  .subdevice = 0xa101,
  .card      = CX88_BOARD_ATI_HDTVWONDER,
 }, {
  .subvendor = 0x107d,
  .subdevice = 0x665f,
  .card      = CX88_BOARD_WINFAST_DTV1000,
 }, {
  .subvendor = 0x1461,
  .subdevice = 0x000a,
  .card      = CX88_BOARD_AVERTV_303,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9200,
  .card      = CX88_BOARD_HAUPPAUGE_NOVASE2_S1,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9201,
  .card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9202,
  .card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
 }, {
  .subvendor = 0x17de,
  .subdevice = 0x08b2,
  .card      = CX88_BOARD_KWORLD_DVBS_100,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9400,
  .card      = CX88_BOARD_HAUPPAUGE_HVR1100,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9402,
  .card      = CX88_BOARD_HAUPPAUGE_HVR1100,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9800,
  .card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9802,
  .card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9001,
  .card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
 }, {
  .subvendor = 0x1822,
  .subdevice = 0x0025,
  .card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
 }, {
  .subvendor = 0x17de,
  .subdevice = 0x08a1,
  .card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdb50,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdb54,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
  /* Re-branded DViCO: DigitalNow DVB-T Dual */
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdb11,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
  /* Re-branded DViCO: UltraView DVB-T Plus */
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdb30,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO,
 }, {
  .subvendor = 0x17de,
  .subdevice = 0x0840,
  .card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
 }, {
  .subvendor = 0x1421,
  .subdevice = 0x0305,
  .card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdb40,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdb44,
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
 }, {
  .subvendor = 0x7063,
  .subdevice = 0x5500,
  .card      = CX88_BOARD_PCHDTV_HD5500,
 }, {
  .subvendor = 0x17de,
  .subdevice = 0x0841,
  .card      = CX88_BOARD_KWORLD_MCE200_DELUXE,
 }, {
  .subvendor = 0x1822,
  .subdevice = 0x0019,
  .card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
 }, {
  .subvendor = 0x1554,
  .subdevice = 0x4813,
  .card      = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,
 }, {
  .subvendor = 0x14f1,
  .subdevice = 0x0842,
  .card      = CX88_BOARD_NPGTECH_REALTV_TOP10FM,
 }, {
  .subvendor = 0x107d,
  .subdevice = 0x665e,
  .card      = CX88_BOARD_WINFAST_DTV2000H,
 }, {
  .subvendor = 0x107d,
  .subdevice = 0x6f2b,
  .card      = CX88_BOARD_WINFAST_DTV2000H_J,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
  .card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
 }, {
  .subvendor = 0x14f1,
  .subdevice = 0x0084,
  .card      = CX88_BOARD_GENIATECH_DVBS,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x1404,
  .card      = CX88_BOARD_HAUPPAUGE_HVR3000,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdc00,
  .card      = CX88_BOARD_SAMSUNG_SMT_7020,
 }, {
  .subvendor = 0x18ac,
  .subdevice = 0xdccd,
  .card      = CX88_BOARD_SAMSUNG_SMT_7020,
 }, {
  .subvendor = 0x1461,
  .subdevice = 0xc111, /* AverMedia M150-D */
  /* This board is known to work with the ASUS PVR416 config */
  .card      = CX88_BOARD_ASUS_PVR_416,
 }, {
  .subvendor = 0xc180,
  .subdevice = 0xc980,
  .card      = CX88_BOARD_TE_DTV_250_OEM_SWANN,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9600,
  .card      = CX88_BOARD_HAUPPAUGE_HVR1300,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9601,
  .card      = CX88_BOARD_HAUPPAUGE_HVR1300,
 }, {
  .subvendor = 0x0070,
  .subdevice = 0x9602,
  .card      = CX88_BOARD_HAUPPAUGE_HVR1300,
--> --------------------

--> maximum size reached

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

Messung V0.5
C=96 H=86 G=90

¤ Dauer der Verarbeitung: 0.16 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