Part of Slepp's ProjectsPastebinTURLImagebinFilebin
Feedback -- English French German Japanese
Create Upload Newest Tools Donate
Sign In | Create Account

Agiofws
Monday, January 22nd, 2007 at 10:35:56pm UTC 

  1. /*
  2.  *
  3.  * device driver for Conexant 2388x based TV cards
  4.  * card-specific stuff.
  5.  *
  6.  * (c) 2003 Gerd Knorr <[email protected]> [SuSE Labs]
  7.  *
  8.  *  This program is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation; either version 2 of the License, or
  11.  *  (at your option) any later version.
  12.  *
  13.  *  This program is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with this program; if not, write to the Free Software
  20.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  */
  22.  
  23. #include <linux/init.h>
  24. #include <linux/module.h>
  25. #include <linux/pci.h>
  26. #include <linux/delay.h>
  27.  
  28. #include "compat.h"
  29. #include "cx88.h"
  30.  
  31. /* ------------------------------------------------------------------ */
  32. /* board config info                                                  */
  33.  
  34. struct cx88_board cx88_boards[] = {
  35.         [CX88_BOARD_UNKNOWN] = {
  36.                 .name      = "UNKNOWN/GENERIC",
  37.                 .tuner_type     = UNSET,
  38.                 .radio_type     = UNSET,
  39.                 .tuner_addr     = ADDR_UNSET,
  40.                 .radio_addr     = ADDR_UNSET,
  41.                 .input          = {{
  42.                         .type   = CX88_VMUX_COMPOSITE1,
  43.                         .vmux   = 0,
  44.                 },{
  45.                         .type   = CX88_VMUX_COMPOSITE2,
  46.                         .vmux   = 1,
  47.                 },{
  48.                         .type   = CX88_VMUX_COMPOSITE3,
  49.                         .vmux   = 2,
  50.                 },{
  51.                         .type   = CX88_VMUX_COMPOSITE4,
  52.                         .vmux   = 3,
  53.                 }},
  54.         },
  55.         [CX88_BOARD_HAUPPAUGE] = {
  56.                 .name      = "Hauppauge WinTV 34xxx models",
  57.                 .tuner_type     = UNSET,
  58.                 .radio_type     = UNSET,
  59.                 .tuner_addr     = ADDR_UNSET,
  60.                 .radio_addr     = ADDR_UNSET,
  61.                 .tda9887_conf   = TDA9887_PRESENT,
  62.                 .input          = {{
  63.                         .type   = CX88_VMUX_TELEVISION,
  64.                         .vmux   = 0,
  65.                         .gpio0  = 0xff00,  // internal decoder
  66.                 },{
  67.                         .type   = CX88_VMUX_DEBUG,
  68.                         .vmux   = 0,
  69.                         .gpio0  = 0xff01,  // mono from tuner chip
  70.                 },{
  71.                         .type   = CX88_VMUX_COMPOSITE1,
  72.                         .vmux   = 1,
  73.                         .gpio0  = 0xff02,
  74.                 },{
  75.                         .type   = CX88_VMUX_SVIDEO,
  76.                         .vmux   = 2,
  77.                         .gpio0  = 0xff02,
  78.                 }},
  79.                 .radio = {
  80.                         .type   = CX88_RADIO,
  81.                         .gpio0  = 0xff01,
  82.                 },
  83.         },
  84.         [CX88_BOARD_GDI] = {
  85.                 .name      = "GDI Black Gold",
  86.                 .tuner_type     = UNSET,
  87.                 .radio_type     = UNSET,
  88.                 .tuner_addr     = ADDR_UNSET,
  89.                 .radio_addr     = ADDR_UNSET,
  90.                 .input          = {{
  91.                         .type   = CX88_VMUX_TELEVISION,
  92.                         .vmux   = 0,
  93.                 },{
  94.                         .type   = CX88_VMUX_SVIDEO,
  95.                         .vmux   = 2,
  96.                 }},
  97.         },
  98.         [CX88_BOARD_PIXELVIEW] = {
  99.                 .name           = "PixelView",
  100.                 .tuner_type     = TUNER_PHILIPS_PAL,
  101.                 .radio_type     = UNSET,
  102.                 .tuner_addr     = ADDR_UNSET,
  103.                 .radio_addr     = ADDR_UNSET,
  104.                 .input          = {{
  105.                         .type   = CX88_VMUX_TELEVISION,
  106.                         .vmux   = 0,
  107.                         .gpio0  = 0xff00,  // internal decoder
  108.                 },{
  109.                         .type   = CX88_VMUX_COMPOSITE1,
  110.                         .vmux   = 1,
  111.                 },{
  112.                         .type   = CX88_VMUX_SVIDEO,
  113.                         .vmux   = 2,
  114.                 }},
  115.                 .radio = {
  116.                          .type  = CX88_RADIO,
  117.                          .gpio0 = 0xff10,
  118.                 },
  119.         },
  120.         [CX88_BOARD_ATI_WONDER_PRO] = {
  121.                 .name           = "ATI TV Wonder Pro",
  122.                 .tuner_type     = TUNER_PHILIPS_4IN1,
  123.                 .radio_type     = UNSET,
  124.                 .tuner_addr     = ADDR_UNSET,
  125.                 .radio_addr     = ADDR_UNSET,
  126.                 .tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER,
  127.                 .input          = {{
  128.                         .type   = CX88_VMUX_TELEVISION,
  129.                         .vmux   = 0,
  130.                         .gpio0  = 0x03ff,
  131.                 },{
  132.                         .type   = CX88_VMUX_COMPOSITE1,
  133.                         .vmux   = 1,
  134.                         .gpio0  = 0x03fe,
  135.                 },{
  136.                         .type   = CX88_VMUX_SVIDEO,
  137.                         .vmux   = 2,
  138.                         .gpio0  = 0x03fe,
  139.                 }},
  140.         },
  141.         [CX88_BOARD_WINFAST2000XP_EXPERT] = {
  142.                 .name           = "Leadtek Winfast 2000XP Expert",
  143.                 .tuner_type     = TUNER_PHILIPS_4IN1,
  144.                 .radio_type     = UNSET,
  145.                 .tuner_addr     = ADDR_UNSET,
  146.                 .radio_addr     = ADDR_UNSET,
  147.                 .tda9887_conf   = TDA9887_PRESENT,
  148.                 .input          = {{
  149.                         .type   = CX88_VMUX_TELEVISION,
  150.                         .vmux   = 0,
  151.                         .gpio0  = 0x00F5e700,
  152.                         .gpio1  = 0x00003004,
  153.                         .gpio2  = 0x00F5e700,
  154.                         .gpio3  = 0x02000000,
  155.                 },{
  156.                         .type   = CX88_VMUX_COMPOSITE1,
  157.                         .vmux   = 1,
  158.                         .gpio0  = 0x00F5c700,
  159.                         .gpio1  = 0x00003004,
  160.                         .gpio2  = 0x00F5c700,
  161.                         .gpio3  = 0x02000000,
  162.                 },{
  163.                         .type   = CX88_VMUX_SVIDEO,
  164.                         .vmux   = 2,
  165.                         .gpio0  = 0x00F5c700,
  166.                         .gpio1  = 0x00003004,
  167.                         .gpio2  = 0x00F5c700,
  168.                         .gpio3  = 0x02000000,
  169.                 }},
  170.                 .radio = {
  171.                         .type   = CX88_RADIO,
  172.                         .gpio0  = 0x00F5d700,
  173.                         .gpio1  = 0x00003004,
  174.                         .gpio2  = 0x00F5d700,
  175.                         .gpio3  = 0x02000000,
  176.                 },
  177.         },
  178.         [CX88_BOARD_AVERTV_STUDIO_303] = {
  179.                 .name           = "AverTV Studio 303 (M126)",
  180.                 .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  181.                 .radio_type     = UNSET,
  182.                 .tuner_addr     = ADDR_UNSET,
  183.                 .radio_addr     = ADDR_UNSET,
  184.                 .tda9887_conf   = TDA9887_PRESENT,
  185.                 .input          = {{
  186.                         .type   = CX88_VMUX_TELEVISION,
  187.                         .vmux   = 0,
  188.                         .gpio1  = 0xe09f,
  189.                 },{
  190.                         .type   = CX88_VMUX_COMPOSITE1,
  191.                         .vmux   = 1,
  192.                         .gpio1  = 0xe05f,
  193.                 },{
  194.                         .type   = CX88_VMUX_SVIDEO,
  195.                         .vmux   = 2,
  196.                         .gpio1  = 0xe05f,
  197.                 }},
  198.                 .radio = {
  199.                         .gpio1  = 0xe0df,
  200.                         .type   = CX88_RADIO,
  201.                 },
  202.         },
  203.         [CX88_BOARD_MSI_TVANYWHERE_MASTER] = {
  204.                 // added gpio values thanks to Michal
  205.                 // values for PAL from DScaler
  206.                 .name           = "MSI TV-@nywhere Master",
  207.                 .tuner_type     = TUNER_MT2032,
  208.                 .radio_type     = UNSET,
  209.                 .tuner_addr     = ADDR_UNSET,
  210.                 .radio_addr     = ADDR_UNSET,
  211.                 .tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC,
  212.                 .input          = {{
  213.                         .type   = CX88_VMUX_TELEVISION,
  214.                         .vmux   = 0,
  215.                         .gpio0  = 0x000040bf,
  216.                         .gpio1  = 0x000080c0,
  217.                         .gpio2  = 0x0000ff40,
  218.                 },{
  219.                         .type   = CX88_VMUX_COMPOSITE1,
  220.                         .vmux   = 1,
  221.                         .gpio0  = 0x000040bf,
  222.                         .gpio1  = 0x000080c0,
  223.                         .gpio2  = 0x0000ff40,
  224.                 },{
  225.                         .type   = CX88_VMUX_SVIDEO,
  226.                         .vmux   = 2,
  227.                         .gpio0  = 0x000040bf,
  228.                         .gpio1  = 0x000080c0,
  229.                         .gpio2  = 0x0000ff40,
  230.                 }},
  231.                 .radio = {
  232.                          .type   = CX88_RADIO,
  233.                 },
  234.         },
  235.         [CX88_BOARD_WINFAST_DV2000] = {
  236.                 .name           = "Leadtek Winfast DV2000",
  237.                 .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  238.                 .radio_type     = UNSET,
  239.                 .tuner_addr     = ADDR_UNSET,
  240.                 .radio_addr     = ADDR_UNSET,
  241.                 .tda9887_conf   = TDA9887_PRESENT,
  242.                 .input          = {{
  243.                         .type   = CX88_VMUX_TELEVISION,
  244.                         .vmux   = 0,
  245.                         .gpio0  = 0x0035e700,
  246.                         .gpio1  = 0x00003004,
  247.                         .gpio2  = 0x0035e700,
  248.                         .gpio3  = 0x02000000,
  249.                 },{
  250.  
  251.                         .type   = CX88_VMUX_COMPOSITE1,
  252.                         .vmux   = 1,
  253.                         .gpio0  = 0x0035c700,
  254.                         .gpio1  = 0x00003004,
  255.                         .gpio2  = 0x0035c700,
  256.                         .gpio3  = 0x02000000,
  257.                 },{
  258.                         .type   = CX88_VMUX_SVIDEO,
  259.                         .vmux   = 2,
  260.                         .gpio0  = 0x0035c700,
  261.                         .gpio1  = 0x0035c700,
  262.                         .gpio2  = 0x02000000,
  263.                         .gpio3  = 0x02000000,
  264.                 }},
  265.                 .radio = {
  266.                         .type   = CX88_RADIO,
  267.                         .gpio0  = 0x0035d700,
  268.                         .gpio1  = 0x00007004,
  269.                         .gpio2  = 0x0035d700,
  270.                         .gpio3  = 0x02000000,
  271.                 },
  272.         },
  273.         [CX88_BOARD_LEADTEK_PVR2000] = {
  274.                 // gpio values for PAL version from regspy by DScaler
  275.                 .name           = "Leadtek PVR 2000",
  276.                 .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  277.                 .radio_type     = UNSET,
  278.                 .tuner_addr     = ADDR_UNSET,
  279.                 .radio_addr     = ADDR_UNSET,
  280.                 .tda9887_conf   = TDA9887_PRESENT,
  281.                 .input          = {{
  282.                         .type   = CX88_VMUX_TELEVISION,
  283.                         .vmux   = 0,
  284.                         .gpio0  = 0x0000bde2,
  285.                         .extadc = 1,
  286.                 },{
  287.                         .type   = CX88_VMUX_COMPOSITE1,
  288.                         .vmux   = 1,
  289.                         .gpio0  = 0x0000bde6,
  290.                         .extadc = 1,
  291.                 },{
  292.                         .type   = CX88_VMUX_SVIDEO,
  293.                         .vmux   = 2,
  294.                         .gpio0  = 0x0000bde6,
  295.                         .extadc = 1,
  296.                 }},
  297.                 .radio = {
  298.                         .type   = CX88_RADIO,
  299.                         .gpio0  = 0x0000bd62,
  300.                         .extadc = 1,
  301.                 },
  302.                 .mpeg           = CX88_MPEG_BLACKBIRD,
  303.         },
  304.         [CX88_BOARD_IODATA_GVVCP3PCI] = {
  305.                 .name      = "IODATA GV-VCP3/PCI",
  306.                 .tuner_type     = TUNER_ABSENT,
  307.                 .radio_type     = UNSET,
  308.                 .tuner_addr     = ADDR_UNSET,
  309.                 .radio_addr     = ADDR_UNSET,
  310.                 .input          = {{
  311.                         .type   = CX88_VMUX_COMPOSITE1,
  312.                         .vmux   = 0,
  313.                 },{
  314.                         .type   = CX88_VMUX_COMPOSITE2,
  315.                         .vmux   = 1,
  316.                 },{
  317.                         .type   = CX88_VMUX_SVIDEO,
  318.                         .vmux   = 2,
  319.                 }},
  320.         },
  321.         [CX88_BOARD_PROLINK_PLAYTVPVR] = {
  322.                 .name           = "Prolink PlayTV PVR",
  323.                 .tuner_type     = TUNER_PHILIPS_FM1236_MK3,
  324.                 .radio_type     = UNSET,
  325.                 .tuner_addr     = ADDR_UNSET,
  326.                 .radio_addr     = ADDR_UNSET,
  327.                 .tda9887_conf   = TDA9887_PRESENT,
  328.                 .input          = {{
  329.                         .type   = CX88_VMUX_TELEVISION,
  330.                         .vmux   = 0,
  331.                         .gpio0  = 0xbff0,
  332.                 },{
  333.                         .type   = CX88_VMUX_COMPOSITE1,
  334.                         .vmux   = 1,
  335.                         .gpio0  = 0xbff3,
  336.                 },{
  337.                         .type   = CX88_VMUX_SVIDEO,
  338.                         .vmux   = 2,
  339.                         .gpio0  = 0xbff3,
  340.                 }},
  341.                 .radio = {
  342.                         .type   = CX88_RADIO,
  343.                         .gpio0  = 0xbff0,
  344.                 },
  345.         },
  346.         [CX88_BOARD_ASUS_PVR_416] = {
  347.                 .name      = "ASUS PVR-416",
  348.                 .tuner_type     = TUNER_PHILIPS_FM1236_MK3,
  349.                 .radio_type     = UNSET,
  350.                 .tuner_addr     = ADDR_UNSET,
  351.                 .radio_addr     = ADDR_UNSET,
  352.                 .tda9887_conf   = TDA9887_PRESENT,
  353.                 .input          = {{
  354.                         .type   = CX88_VMUX_TELEVISION,
  355.                         .vmux   = 0,
  356.                         .gpio0  = 0x0000fde6,
  357.                 },{
  358.                         .type   = CX88_VMUX_SVIDEO,
  359.                         .vmux   = 2,
  360.                         .gpio0  = 0x0000fde6, // 0x0000fda6 L,R RCA audio in?
  361.                         .extadc = 1,
  362.                 }},
  363.                 .radio = {
  364.                         .type   = CX88_RADIO,
  365.                         .gpio0  = 0x0000fde2,
  366.                 },
  367.                 .mpeg           = CX88_MPEG_BLACKBIRD,
  368.         },
  369.         [CX88_BOARD_MSI_TVANYWHERE] = {
  370.                 .name           = "MSI TV-@nywhere",
  371.                 .tuner_type     = TUNER_MT2032,
  372.                 .radio_type     = UNSET,
  373.                 .tuner_addr     = ADDR_UNSET,
  374.                 .radio_addr     = ADDR_UNSET,
  375.                 .tda9887_conf   = TDA9887_PRESENT,
  376.                 .input          = {{
  377.                         .type   = CX88_VMUX_TELEVISION,
  378.                         .vmux   = 0,
  379.                         .gpio0  = 0x00000fbf,
  380.                         .gpio2  = 0x0000fc08,
  381.                 },{
  382.                         .type   = CX88_VMUX_COMPOSITE1,
  383.                         .vmux   = 1,
  384.                         .gpio0  = 0x00000fbf,
  385.                         .gpio2  = 0x0000fc68,
  386.                 },{
  387.                         .type   = CX88_VMUX_SVIDEO,
  388.                         .vmux   = 2,
  389.                         .gpio0  = 0x00000fbf,
  390.                         .gpio2  = 0x0000fc68,
  391.                 }},
  392.         },
  393.         [CX88_BOARD_KWORLD_DVB_T] = {
  394.                 .name           = "KWorld/VStream XPert DVB-T",
  395.                 .tuner_type     = TUNER_ABSENT,
  396.                 .radio_type     = UNSET,
  397.                 .tuner_addr     = ADDR_UNSET,
  398.                 .radio_addr     = ADDR_UNSET,
  399.                 .input          = {{
  400.                         .type   = CX88_VMUX_COMPOSITE1,
  401.                         .vmux   = 1,
  402.                         .gpio0  = 0x0700,
  403.                         .gpio2  = 0x0101,
  404.                 },{
  405.                         .type   = CX88_VMUX_SVIDEO,
  406.                         .vmux   = 2,
  407.                         .gpio0  = 0x0700,
  408.                         .gpio2  = 0x0101,
  409.                 }},
  410.                 .mpeg           = CX88_MPEG_DVB,
  411.         },
  412.         [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {
  413.                 .name           = "DViCO FusionHDTV DVB-T1",
  414.                 .tuner_type     = TUNER_ABSENT, /* No analog tuner */
  415.                 .radio_type     = UNSET,
  416.                 .tuner_addr     = ADDR_UNSET,
  417.                 .radio_addr     = ADDR_UNSET,
  418.                 .input          = {{
  419.                         .type   = CX88_VMUX_COMPOSITE1,
  420.                         .vmux   = 1,
  421.                         .gpio0  = 0x000027df,
  422.                 },{
  423.                         .type   = CX88_VMUX_SVIDEO,
  424.                         .vmux   = 2,
  425.                         .gpio0  = 0x000027df,
  426.                 }},
  427.                 .mpeg           = CX88_MPEG_DVB,
  428.         },
  429.         [CX88_BOARD_KWORLD_LTV883] = {
  430.                 .name           = "KWorld LTV883RF",
  431.                 .tuner_type     = TUNER_TNF_8831BGFF,
  432.                 .radio_type     = UNSET,
  433.                 .tuner_addr     = ADDR_UNSET,
  434.                 .radio_addr     = ADDR_UNSET,
  435.                 .input          = {{
  436.                         .type   = CX88_VMUX_TELEVISION,
  437.                         .vmux   = 0,
  438.                         .gpio0  = 0x07f8,
  439.                 },{
  440.                         .type   = CX88_VMUX_DEBUG,
  441.                         .vmux   = 0,
  442.                         .gpio0  = 0x07f9,  // mono from tuner chip
  443.                 },{
  444.                         .type   = CX88_VMUX_COMPOSITE1,
  445.                         .vmux   = 1,
  446.                         .gpio0  = 0x000007fa,
  447.                 },{
  448.                         .type   = CX88_VMUX_SVIDEO,
  449.                         .vmux   = 2,
  450.                         .gpio0  = 0x000007fa,
  451.                 }},
  452.                 .radio = {
  453.                         .type   = CX88_RADIO,
  454.                         .gpio0  = 0x000007f8,
  455.                 },
  456.         },
  457.         [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = {
  458.                 .name      = "DViCO FusionHDTV 3 Gold-Q",
  459.                 .tuner_type     = TUNER_MICROTUNE_4042FI5,
  460.                 .radio_type     = UNSET,
  461.                 .tuner_addr     = ADDR_UNSET,
  462.                 .radio_addr     = ADDR_UNSET,
  463.                 /*
  464.                    GPIO[0] resets DT3302 DTV receiver
  465.                     0 - reset asserted
  466.                     1 - normal operation
  467.                    GPIO[1] mutes analog audio output connector
  468.                     0 - enable selected source
  469.                     1 - mute
  470.                    GPIO[2] selects source for analog audio output connector
  471.                     0 - analog audio input connector on tab
  472.                     1 - analog DAC output from CX23881 chip
  473.                    GPIO[3] selects RF input connector on tuner module
  474.                     0 - RF connector labeled CABLE
  475.                     1 - RF connector labeled ANT
  476.                    GPIO[4] selects high RF for QAM256 mode
  477.                     0 - normal RF
  478.                     1 - high RF
  479.                 */
  480.                 .input          = {{
  481.                         .type   = CX88_VMUX_TELEVISION,
  482.                         .vmux   = 0,
  483.                         .gpio0  = 0x0f0d,
  484.                 },{
  485.                         .type   = CX88_VMUX_CABLE,
  486.                         .vmux   = 0,
  487.                         .gpio0  = 0x0f05,
  488.                 },{
  489.                         .type   = CX88_VMUX_COMPOSITE1,
  490.                         .vmux   = 1,
  491.                         .gpio0  = 0x0f00,
  492.                 },{
  493.                         .type   = CX88_VMUX_SVIDEO,
  494.                         .vmux   = 2,
  495.                         .gpio0  = 0x0f00,
  496.                 }},
  497.                 .mpeg           = CX88_MPEG_DVB,
  498.         },
  499.         [CX88_BOARD_HAUPPAUGE_DVB_T1] = {
  500.                 .name           = "Hauppauge Nova-T DVB-T",
  501.                 .tuner_type     = TUNER_ABSENT,
  502.                 .radio_type     = UNSET,
  503.                 .tuner_addr     = ADDR_UNSET,
  504.                 .radio_addr     = ADDR_UNSET,
  505.                 .input          = {{
  506.                         .type   = CX88_VMUX_DVB,
  507.                         .vmux   = 0,
  508.                 }},
  509.                 .mpeg           = CX88_MPEG_DVB,
  510.         },
  511.         [CX88_BOARD_CONEXANT_DVB_T1] = {
  512.                 .name           = "Conexant DVB-T reference design",
  513.                 .tuner_type     = TUNER_ABSENT,
  514.                 .radio_type     = UNSET,
  515.                 .tuner_addr     = ADDR_UNSET,
  516.                 .radio_addr     = ADDR_UNSET,
  517.                 .input          = {{
  518.                         .type   = CX88_VMUX_DVB,
  519.                         .vmux   = 0,
  520.                 }},
  521.                 .mpeg           = CX88_MPEG_DVB,
  522.         },
  523.         [CX88_BOARD_PROVIDEO_PV259] = {
  524.                 .name      = "Provideo PV259",
  525.                 .tuner_type     = TUNER_PHILIPS_FQ1216ME,
  526.                 .radio_type     = UNSET,
  527.                 .tuner_addr     = ADDR_UNSET,
  528.                 .radio_addr     = ADDR_UNSET,
  529.                 .input          = {{
  530.                         .type   = CX88_VMUX_TELEVISION,
  531.                         .vmux   = 0,
  532.                         .extadc = 1,
  533.                 }},
  534.                 .mpeg           = CX88_MPEG_BLACKBIRD,
  535.         },
  536.         [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
  537.                 .name           = "DViCO FusionHDTV DVB-T Plus",
  538.                 .tuner_type     = TUNER_ABSENT, /* No analog tuner */
  539.                 .radio_type     = UNSET,
  540.                 .tuner_addr     = ADDR_UNSET,
  541.                 .radio_addr     = ADDR_UNSET,
  542.                 .input          = {{
  543.                         .type   = CX88_VMUX_COMPOSITE1,
  544.                         .vmux   = 1,
  545.                         .gpio0  = 0x000027df,
  546.                 },{
  547.                         .type   = CX88_VMUX_SVIDEO,
  548.                         .vmux   = 2,
  549.                         .gpio0  = 0x000027df,
  550.                 }},
  551.                 .mpeg           = CX88_MPEG_DVB,
  552.         },
  553.         [CX88_BOARD_DNTV_LIVE_DVB_T] = {
  554.                 .name      = "digitalnow DNTV Live! DVB-T",
  555.                 .tuner_type     = TUNER_ABSENT,
  556.                 .radio_type     = UNSET,
  557.                 .tuner_addr     = ADDR_UNSET,
  558.                 .radio_addr     = ADDR_UNSET,
  559.                 .input    = {{
  560.                         .type   = CX88_VMUX_COMPOSITE1,
  561.                         .vmux   = 1,
  562.                         .gpio0  = 0x00000700,
  563.                         .gpio2  = 0x00000101,
  564.                 },{
  565.                         .type   = CX88_VMUX_SVIDEO,
  566.                         .vmux   = 2,
  567.                         .gpio0  = 0x00000700,
  568.                         .gpio2  = 0x00000101,
  569.                 }},
  570.                 .mpeg           = CX88_MPEG_DVB,
  571.         },
  572.         [CX88_BOARD_PCHDTV_HD3000] = {
  573.                 .name           = "pcHDTV HD3000 HDTV",
  574.                 .tuner_type     = TUNER_THOMSON_DTT761X,
  575.                 .radio_type     = UNSET,
  576.                 .tuner_addr     = ADDR_UNSET,
  577.                 .radio_addr     = ADDR_UNSET,
  578.                 .tda9887_conf   = TDA9887_PRESENT,
  579.                 .input          = {{
  580.                         .type   = CX88_VMUX_TELEVISION,
  581.                         .vmux   = 0,
  582.                         .gpio0  = 0x00008484,
  583.                         .gpio1  = 0x00000000,
  584.                         .gpio2  = 0x00000000,
  585.                         .gpio3  = 0x00000000,
  586.                 },{
  587.                         .type   = CX88_VMUX_COMPOSITE1,
  588.                         .vmux   = 1,
  589.                         .gpio0  = 0x00008400,
  590.                         .gpio1  = 0x00000000,
  591.                         .gpio2  = 0x00000000,
  592.                         .gpio3  = 0x00000000,
  593.                 },{
  594.                         .type   = CX88_VMUX_SVIDEO,
  595.                         .vmux   = 2,
  596.                         .gpio0  = 0x00008400,
  597.                         .gpio1  = 0x00000000,
  598.                         .gpio2  = 0x00000000,
  599.                         .gpio3  = 0x00000000,
  600.                 }},
  601.                 .radio = {
  602.                         .type   = CX88_RADIO,
  603.                         .vmux   = 2,
  604.                         .gpio0  = 0x00008400,
  605.                         .gpio1  = 0x00000000,
  606.                         .gpio2  = 0x00000000,
  607.                         .gpio3  = 0x00000000,
  608.                 },
  609.                 .mpeg           = CX88_MPEG_DVB,
  610.         },
  611.         [CX88_BOARD_HAUPPAUGE_ROSLYN] = {
  612.                 // entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>
  613.                 // GPIO values obtained from regspy, courtesy Sean Covel
  614.                 .name           = "Hauppauge WinTV 28xxx (Roslyn) models",
  615.                 .tuner_type     = UNSET,
  616.                 .radio_type     = UNSET,
  617.                 .tuner_addr     = ADDR_UNSET,
  618.                 .radio_addr     = ADDR_UNSET,
  619.                 .input          = {{
  620.                         .type   = CX88_VMUX_TELEVISION,
  621.                         .vmux   = 0,
  622.                         .gpio0  = 0xed1a,
  623.                         .gpio2  = 0x00ff,
  624.                 },{
  625.                         .type   = CX88_VMUX_DEBUG,
  626.                         .vmux   = 0,
  627.                         .gpio0  = 0xff01,
  628.                 },{
  629.                         .type   = CX88_VMUX_COMPOSITE1,
  630.                         .vmux   = 1,
  631.                         .gpio0  = 0xff02,
  632.                 },{
  633.                         .type   = CX88_VMUX_SVIDEO,
  634.                         .vmux   = 2,
  635.                         .gpio0  = 0xed92,
  636.                         .gpio2  = 0x00ff,
  637.                 }},
  638.                 .radio = {
  639.                          .type   = CX88_RADIO,
  640.                          .gpio0  = 0xed96,
  641.                          .gpio2  = 0x00ff,
  642.                  },
  643.                 .mpeg           = CX88_MPEG_BLACKBIRD,
  644.         },
  645.         [CX88_BOARD_DIGITALLOGIC_MEC] = {
  646.                 .name           = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
  647.                 .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  648.                 .radio_type     = UNSET,
  649.                 .tuner_addr     = ADDR_UNSET,
  650.                 .radio_addr     = ADDR_UNSET,
  651.                 .tda9887_conf   = TDA9887_PRESENT,
  652.                 .input          = {{
  653.                         .type   = CX88_VMUX_TELEVISION,
  654.                         .vmux   = 0,
  655.                         .gpio0  = 0x00009d80,
  656.                         .extadc = 1,
  657.                 },{
  658.                         .type   = CX88_VMUX_COMPOSITE1,
  659.                         .vmux   = 1,
  660.                         .gpio0  = 0x00009d76,
  661.                         .extadc = 1,
  662.                 },{
  663.                         .type   = CX88_VMUX_SVIDEO,
  664.                         .vmux   = 2,
  665.                         .gpio0  = 0x00009d76,
  666.                         .extadc = 1,
  667.                 }},
  668.                 .radio = {
  669.                         .type   = CX88_RADIO,
  670.                         .gpio0  = 0x00009d00,
  671.                         .extadc = 1,
  672.                 },
  673.                 .mpeg           = CX88_MPEG_BLACKBIRD,
  674.         },
  675.         [CX88_BOARD_IODATA_GVBCTV7E] = {
  676.                 .name           = "IODATA GV/BCTV7E",
  677.                 .tuner_type     = TUNER_PHILIPS_FQ1286,
  678.                 .radio_type     = UNSET,
  679.                 .tuner_addr     = ADDR_UNSET,
  680.                 .radio_addr     = ADDR_UNSET,
  681.                 .tda9887_conf   = TDA9887_PRESENT,
  682.                 .input          = {{
  683.                         .type   = CX88_VMUX_TELEVISION,
  684.                         .vmux   = 1,
  685.                         .gpio1  = 0x0000e03f,
  686.                 },{
  687.                         .type   = CX88_VMUX_COMPOSITE1,
  688.                         .vmux   = 2,
  689.                         .gpio1  = 0x0000e07f,
  690.                 },{
  691.                         .type   = CX88_VMUX_SVIDEO,
  692.                         .vmux   = 3,
  693.                         .gpio1  = 0x0000e07f,
  694.                 }}
  695.         },
  696.         [CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = {
  697.                 .name           = "PixelView PlayTV Ultra Pro (Stereo)",
  698.                 /* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */
  699.                 .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  700.                 .radio_type     = UNSET,
  701.                 .tuner_addr     = ADDR_UNSET,
  702.                 .radio_addr     = ADDR_UNSET,
  703.                 .input          = {{
  704.                         .type   = CX88_VMUX_TELEVISION,
  705.                         .vmux   = 0,
  706.                         .gpio0  = 0xbf61,  /* internal decoder */
  707.                 },{
  708.                         .type   = CX88_VMUX_COMPOSITE1,
  709.                         .vmux   = 1,
  710.                         .gpio0  = 0xbf63,
  711.                 },{
  712.                         .type   = CX88_VMUX_SVIDEO,
  713.                         .vmux   = 2,
  714.                         .gpio0  = 0xbf63,
  715.                 }},
  716.                 .radio = {
  717.                          .type  = CX88_RADIO,
  718.                          .gpio0 = 0xbf60,
  719.                  },
  720.         },
  721.         [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = {
  722.                 .name           = "DViCO FusionHDTV 3 Gold-T",
  723.                 .tuner_type     = TUNER_THOMSON_DTT761X,
  724.                 .radio_type     = UNSET,
  725.                 .tuner_addr     = ADDR_UNSET,
  726.                 .radio_addr     = ADDR_UNSET,
  727.                 .tda9887_conf   = TDA9887_PRESENT,
  728.                 .input          = {{
  729.                         .type   = CX88_VMUX_TELEVISION,
  730.                         .vmux   = 0,
  731.                         .gpio0  = 0x97ed,
  732.                 },{
  733.                         .type   = CX88_VMUX_COMPOSITE1,
  734.                         .vmux   = 1,
  735.                         .gpio0  = 0x97e9,
  736.                 },{
  737.                         .type   = CX88_VMUX_SVIDEO,
  738.                         .vmux   = 2,
  739.                         .gpio0  = 0x97e9,
  740.                 }},
  741.                 .mpeg           = CX88_MPEG_DVB,
  742.         },
  743.         [CX88_BOARD_ADSTECH_DVB_T_PCI] = {
  744.                 .name           = "ADS Tech Instant TV DVB-T PCI",
  745.                 .tuner_type     = TUNER_ABSENT,
  746.                 .radio_type     = UNSET,
  747.                 .tuner_addr     = ADDR_UNSET,
  748.                 .radio_addr     = ADDR_UNSET,
  749.                 .input          = {{
  750.                         .type   = CX88_VMUX_COMPOSITE1,
  751.                         .vmux   = 1,
  752.                         .gpio0  = 0x0700,
  753.                         .gpio2  = 0x0101,
  754.                 },{
  755.                         .type   = CX88_VMUX_SVIDEO,
  756.                         .vmux   = 2,
  757.                         .gpio0  = 0x0700,
  758.                         .gpio2  = 0x0101,
  759.                 }},
  760.                 .mpeg           = CX88_MPEG_DVB,
  761.         },
  762.         [CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {
  763.                 .name           = "TerraTec Cinergy 1400 DVB-T",
  764.                 .tuner_type     = TUNER_ABSENT,
  765.                 .input          = {{
  766.                         .type   = CX88_VMUX_DVB,
  767.                         .vmux   = 0,
  768.                 },{
  769.                         .type   = CX88_VMUX_COMPOSITE1,
  770.                         .vmux   = 2,
  771.                 },{
  772.                         .type   = CX88_VMUX_SVIDEO,
  773.                         .vmux   = 2,
  774.                 }},
  775.                 .mpeg           = CX88_MPEG_DVB,
  776.         },
  777.         [CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {
  778.                 .name           = "DViCO FusionHDTV 5 Gold",
  779.                 .tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */
  780.                 .radio_type     = UNSET,
  781.                 .tuner_addr     = ADDR_UNSET,
  782.                 .radio_addr     = ADDR_UNSET,
  783.                 .tda9887_conf   = TDA9887_PRESENT,
  784.                 .input          = {{
  785.                         .type   = CX88_VMUX_TELEVISION,
  786.                         .vmux   = 0,
  787.                         .gpio0  = 0x87fd,
  788.                 },{
  789.                         .type   = CX88_VMUX_COMPOSITE1,
  790.                         .vmux   = 1,
  791.                         .gpio0  = 0x87f9,
  792.                 },{
  793.                         .type   = CX88_VMUX_SVIDEO,
  794.                         .vmux   = 2,
  795.                         .gpio0  = 0x87f9,
  796.                 }},
  797.                 .mpeg           = CX88_MPEG_DVB,
  798.         },
  799.         [CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {
  800.                 .name           = "AverMedia UltraTV Media Center PCI 550",
  801.                 .tuner_type     = TUNER_PHILIPS_FM1236_MK3,
  802.                 .radio_type     = UNSET,
  803.                 .tuner_addr     = ADDR_UNSET,
  804.                 .radio_addr     = ADDR_UNSET,
  805.                 .tda9887_conf   = TDA9887_PRESENT,
  806.                 .input          = {{
  807.                         .type   = CX88_VMUX_COMPOSITE1,
  808.                         .vmux   = 0,
  809.                         .gpio0  = 0x0000cd73,
  810.                         .extadc = 1,
  811.                 },{
  812.                         .type   = CX88_VMUX_SVIDEO,
  813.                         .vmux   = 1,
  814.                         .gpio0  = 0x0000cd73,
  815.                         .extadc = 1,
  816.                 },{
  817.                         .type   = CX88_VMUX_TELEVISION,
  818.                         .vmux   = 3,
  819.                         .gpio0  = 0x0000cdb3,
  820.                         .extadc = 1,
  821.                 }},
  822.                 .radio = {
  823.                         .type   = CX88_RADIO,
  824.                         .vmux   = 2,
  825.                         .gpio0  = 0x0000cdf3,
  826.                         .extadc = 1,
  827.                 },
  828.                 .mpeg           = CX88_MPEG_BLACKBIRD,
  829.         },
  830.         [CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = {
  831.                  /* Alexander Wold <[email protected]> */
  832.                  .name           = "Kworld V-Stream Xpert DVD",
  833.                  .tuner_type     = UNSET,
  834.                  .input          = {{
  835.                          .type   = CX88_VMUX_COMPOSITE1,
  836.                          .vmux   = 1,
  837.                          .gpio0  = 0x03000000,
  838.                          .gpio1  = 0x01000000,
  839.                          .gpio2  = 0x02000000,
  840.                          .gpio3  = 0x00100000,
  841.                  },{
  842.                          .type   = CX88_VMUX_SVIDEO,
  843.                          .vmux   = 2,
  844.                          .gpio0  = 0x03000000,
  845.                          .gpio1  = 0x01000000,
  846.                          .gpio2  = 0x02000000,
  847.                          .gpio3  = 0x00100000,
  848.                  }},
  849.         },
  850.         [CX88_BOARD_ATI_HDTVWONDER] = {
  851.                 .name           = "ATI HDTV Wonder",
  852.                 .tuner_type     = TUNER_PHILIPS_TUV1236D,
  853.                 .radio_type     = UNSET,
  854.                 .tuner_addr     = ADDR_UNSET,
  855.                 .radio_addr     = ADDR_UNSET,
  856.                 .input          = {{
  857.                         .type   = CX88_VMUX_TELEVISION,
  858.                         .vmux   = 0,
  859.                         .gpio0  = 0x00000ff7,
  860.                         .gpio1  = 0x000000ff,
  861.                         .gpio2  = 0x00000001,
  862.                         .gpio3  = 0x00000000,
  863.                 },{
  864.                         .type   = CX88_VMUX_COMPOSITE1,
  865.                         .vmux   = 1,
  866.                         .gpio0  = 0x00000ffe,
  867.                         .gpio1  = 0x000000ff,
  868.                         .gpio2  = 0x00000001,
  869.                         .gpio3  = 0x00000000,
  870.                 },{
  871.                         .type   = CX88_VMUX_SVIDEO,
  872.                         .vmux   = 2,
  873.                         .gpio0  = 0x00000ffe,
  874.                         .gpio1  = 0x000000ff,
  875.                         .gpio2  = 0x00000001,
  876.                         .gpio3  = 0x00000000,
  877.                 }},
  878.                 .mpeg           = CX88_MPEG_DVB,
  879.         },
  880.         [CX88_BOARD_WINFAST_DTV1000] = {
  881.                 .name           = "WinFast DTV1000-T",
  882.                 .tuner_type     = TUNER_ABSENT,
  883.                 .radio_type     = UNSET,
  884.                 .tuner_addr     = ADDR_UNSET,
  885.                 .radio_addr     = ADDR_UNSET,
  886.                 .input          = {{
  887.                         .type   = CX88_VMUX_DVB,
  888.                         .vmux   = 0,
  889.                 }},
  890.                 .mpeg           = CX88_MPEG_DVB,
  891.         },
  892.         [CX88_BOARD_AVERTV_303] = {
  893.                 .name           = "AVerTV 303 (M126)",
  894.                 .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  895.                 .radio_type     = UNSET,
  896.                 .tuner_addr     = ADDR_UNSET,
  897.                 .radio_addr     = ADDR_UNSET,
  898.                 .tda9887_conf   = TDA9887_PRESENT,
  899.                 .input          = {{
  900.                         .type   = CX88_VMUX_TELEVISION,
  901.                         .vmux   = 0,
  902.                         .gpio0  = 0x00ff,
  903.                         .gpio1  = 0xe09f,
  904.                         .gpio2  = 0x0010,
  905.                         .gpio3  = 0x0000,
  906.                 },{
  907.                         .type   = CX88_VMUX_COMPOSITE1,
  908.                         .vmux   = 1,
  909.                         .gpio0  = 0x00ff,
  910.                         .gpio1  = 0xe05f,
  911.                         .gpio2  = 0x0010,
  912.                         .gpio3  = 0x0000,
  913.                 },{
  914.                         .type   = CX88_VMUX_SVIDEO,
  915.                         .vmux   = 2,
  916.                         .gpio0  = 0x00ff,
  917.                         .gpio1  = 0xe05f,
  918.                         .gpio2  = 0x0010,
  919.                         .gpio3  = 0x0000,
  920.                 }},
  921.         },
  922.         [CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = {
  923.                 .name      = "Hauppauge Nova-S-Plus DVB-S",
  924.                 .tuner_type     = TUNER_ABSENT,
  925.                 .radio_type     = UNSET,
  926.                 .tuner_addr     = ADDR_UNSET,
  927.                 .radio_addr     = ADDR_UNSET,
  928.                 .input    = {{
  929.                         .type   = CX88_VMUX_DVB,
  930.                         .vmux   = 0,
  931.                 },{
  932.                         .type   = CX88_VMUX_COMPOSITE1,
  933.                         .vmux   = 1,
  934.                 },{
  935.                         .type   = CX88_VMUX_SVIDEO,
  936.                         .vmux   = 2,
  937.                 }},
  938.                 .mpeg           = CX88_MPEG_DVB,
  939.         },
  940.         [CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {
  941.                 .name      = "Hauppauge Nova-SE2 DVB-S",
  942.                 .tuner_type     = TUNER_ABSENT,
  943.                 .radio_type     = UNSET,
  944.                 .tuner_addr     = ADDR_UNSET,
  945.                 .radio_addr     = ADDR_UNSET,
  946.                 .input    = {{
  947.                         .type   = CX88_VMUX_DVB,
  948.                         .vmux   = 0,
  949.                 }},
  950.                 .mpeg           = CX88_MPEG_DVB,
  951.         },
  952.         [CX88_BOARD_KWORLD_DVBS_100] = {
  953.                 .name      = "KWorld DVB-S 100",
  954.                 .tuner_type     = TUNER_ABSENT,
  955.                 .radio_type     = UNSET,
  956.                 .tuner_addr     = ADDR_UNSET,
  957.                 .radio_addr     = ADDR_UNSET,
  958.                 .input    = {{
  959.                         .type   = CX88_VMUX_DVB,
  960.                         .vmux   = 0,
  961.                 },{
  962.                         .type   = CX88_VMUX_COMPOSITE1,
  963.                         .vmux   = 1,
  964.                 },{
  965.                         .type   = CX88_VMUX_SVIDEO,
  966.                         .vmux   = 2,
  967.                 }},
  968.                 .mpeg           = CX88_MPEG_DVB,
  969.         },
  970.         [CX88_BOARD_HAUPPAUGE_HVR1100] = {
  971.                 .name      = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
  972.                 .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  973.                 .radio_type     = UNSET,
  974.                 .tuner_addr     = ADDR_UNSET,
  975.                 .radio_addr     = ADDR_UNSET,
  976.                 .tda9887_conf   = TDA9887_PRESENT,
  977.                 .input    = {{
  978.                         .type   = CX88_VMUX_TELEVISION,
  979.                         .vmux   = 0,
  980.                 },{
  981.                         .type   = CX88_VMUX_COMPOSITE1,
  982.                         .vmux   = 1,
  983.                 },{
  984.                         .type   = CX88_VMUX_SVIDEO,
  985.                         .vmux   = 2,
  986.                 }},
  987.                 /* fixme: Add radio support */
  988.                 .mpeg           = CX88_MPEG_DVB,
  989.         },
  990.         [CX88_BOARD_HAUPPAUGE_HVR1100LP] = {
  991.                 .name      = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
  992.                 .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  993.                 .radio_type     = UNSET,
  994.                 .tuner_addr     = ADDR_UNSET,
  995.                 .radio_addr     = ADDR_UNSET,
  996.                 .tda9887_conf   = TDA9887_PRESENT,
  997.                 .input    = {{
  998.                         .type   = CX88_VMUX_TELEVISION,
  999.                         .vmux   = 0,
  1000.                 },{
  1001.                         .type   = CX88_VMUX_COMPOSITE1,
  1002.                         .vmux   = 1,
  1003.                 }},
  1004.                 /* fixme: Add radio support */
  1005.                 .mpeg           = CX88_MPEG_DVB,
  1006.         },
  1007.         [CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {
  1008.                 .name           = "digitalnow DNTV Live! DVB-T Pro",
  1009.                 .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  1010.                 .radio_type     = UNSET,
  1011.                 .tuner_addr     = ADDR_UNSET,
  1012.                 .radio_addr     = ADDR_UNSET,
  1013.                 .tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
  1014.                                   TDA9887_PORT2_ACTIVE,
  1015.                 .input          = {{
  1016.                         .type   = CX88_VMUX_TELEVISION,
  1017.                         .vmux   = 0,
  1018.                         .gpio0  = 0xf80808,
  1019.                 },{
  1020.                         .type   = CX88_VMUX_COMPOSITE1,
  1021.                         .vmux   = 1,
  1022.                         .gpio0  = 0xf80808,
  1023.                 },{
  1024.                         .type   = CX88_VMUX_SVIDEO,
  1025.                         .vmux   = 2,
  1026.                         .gpio0  = 0xf80808,
  1027.                 }},
  1028.                 .radio = {
  1029.                          .type  = CX88_RADIO,
  1030.                          .gpio0 = 0xf80808,
  1031.                 },
  1032.                 .mpeg           = CX88_MPEG_DVB,
  1033.         },
  1034.         [CX88_BOARD_KWORLD_DVB_T_CX22702] = {
  1035.                 /* Kworld V-stream Xpert DVB-T with Thomson tuner */
  1036.                 /* DTT 7579 Conexant CX22702-19 Conexant CX2388x  */
  1037.                 /* Manenti Marco <[email protected]> */
  1038.                 .name           = "KWorld/VStream XPert DVB-T with cx22702",
  1039.                 .tuner_type     = TUNER_ABSENT,
  1040.                 .radio_type     = UNSET,
  1041.                 .tuner_addr     = ADDR_UNSET,
  1042.                 .radio_addr     = ADDR_UNSET,
  1043.                 .input          = {{
  1044.                         .type   = CX88_VMUX_COMPOSITE1,
  1045.                         .vmux   = 1,
  1046.                         .gpio0  = 0x0700,
  1047.                         .gpio2  = 0x0101,
  1048.                 },{
  1049.                         .type   = CX88_VMUX_SVIDEO,
  1050.                         .vmux   = 2,
  1051.                         .gpio0  = 0x0700,
  1052.                         .gpio2  = 0x0101,
  1053.                 }},
  1054.                 .mpeg           = CX88_MPEG_DVB,
  1055.         },
  1056.         [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {
  1057.                 .name           = "DViCO FusionHDTV DVB-T Dual Digital",
  1058.                 .tuner_type     = TUNER_ABSENT, /* No analog tuner */
  1059.                 .radio_type     = UNSET,
  1060.                 .tuner_addr     = ADDR_UNSET,
  1061.                 .radio_addr     = ADDR_UNSET,
  1062.                 .input          = {{
  1063.                         .type   = CX88_VMUX_COMPOSITE1,
  1064.                         .vmux   = 1,
  1065.                         .gpio0  = 0x000067df,
  1066.                  },{
  1067.                         .type   = CX88_VMUX_SVIDEO,
  1068.                         .vmux   = 2,
  1069.                         .gpio0  = 0x000067df,
  1070.                 }},
  1071.                 .mpeg           = CX88_MPEG_DVB,
  1072.         },
  1073.         [CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {
  1074.                 .name           = "KWorld HardwareMpegTV XPert",
  1075.                 .tuner_type     = TUNER_PHILIPS_TDA8290,
  1076.                 .radio_type     = UNSET,
  1077.                 .tuner_addr     = ADDR_UNSET,
  1078.                 .radio_addr     = ADDR_UNSET,
  1079.                 .input          = {{
  1080.                         .type   = CX88_VMUX_TELEVISION,
  1081.                         .vmux   = 0,
  1082.                         .gpio0  = 0x3de2,
  1083.                         .gpio2  = 0x00ff,
  1084.                 },{
  1085.                         .type   = CX88_VMUX_COMPOSITE1,
  1086.                         .vmux   = 1,
  1087.                         .gpio0  = 0x3de6,
  1088.                         .extadc = 1,
  1089.                 },{
  1090.                         .type   = CX88_VMUX_SVIDEO,
  1091.                         .vmux   = 2,
  1092.                         .gpio0  = 0x3de6,
  1093.                         .extadc = 1,
  1094.                 }},
  1095.                 .radio = {
  1096.                         .type   = CX88_RADIO,
  1097.                         .gpio0  = 0x3de6,
  1098.                         .gpio2  = 0x00ff,
  1099.                 },
  1100.                 .mpeg           = CX88_MPEG_BLACKBIRD,
  1101.         },
  1102.         [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {
  1103.                 .name           = "DViCO FusionHDTV DVB-T Hybrid",
  1104.                 .tuner_type     = TUNER_THOMSON_FE6600,
  1105.                 .radio_type     = UNSET,
  1106.                 .tuner_addr     = ADDR_UNSET,
  1107.                 .radio_addr     = ADDR_UNSET,
  1108.                 .input          = {{
  1109.                         .type   = CX88_VMUX_TELEVISION,
  1110.                         .vmux   = 0,
  1111.                         .gpio0  = 0x0000a75f,
  1112.                 },{
  1113.                         .type   = CX88_VMUX_COMPOSITE1,
  1114.                         .vmux   = 1,
  1115.                         .gpio0  = 0x0000a75b,
  1116.                 },{
  1117.                         .type   = CX88_VMUX_SVIDEO,
  1118.                         .vmux   = 2,
  1119.                         .gpio0  = 0x0000a75b,
  1120.                 }},
  1121.                 .mpeg           = CX88_MPEG_DVB,
  1122.         },
  1123.         [CX88_BOARD_PCHDTV_HD5500] = {
  1124.                 .name           = "pcHDTV HD5500 HDTV",
  1125.                 .tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
  1126.                 .radio_type     = UNSET,
  1127.                 .tuner_addr     = ADDR_UNSET,
  1128.                 .radio_addr     = ADDR_UNSET,
  1129.                 .tda9887_conf   = TDA9887_PRESENT,
  1130.                 .input          = {{
  1131.                         .type   = CX88_VMUX_TELEVISION,
  1132.                         .vmux   = 0,
  1133.                         .gpio0  = 0x87fd,
  1134.                 },{
  1135.                         .type   = CX88_VMUX_COMPOSITE1,
  1136.                         .vmux   = 1,
  1137.                         .gpio0  = 0x87f9,
  1138.                 },{
  1139.                         .type   = CX88_VMUX_SVIDEO,
  1140.                         .vmux   = 2,
  1141.                         .gpio0  = 0x87f9,
  1142.                 }},
  1143.                 .mpeg           = CX88_MPEG_DVB,
  1144.         },
  1145.         [CX88_BOARD_KWORLD_MCE200_DELUXE] = {
  1146.                 /* FIXME: tested TV input only, disabled composite,
  1147.                    svideo and radio until they can be tested also. */
  1148.                 .name           = "Kworld MCE 200 Deluxe",
  1149.                 .tuner_type     = TUNER_TENA_9533_DI,
  1150.                 .radio_type     = UNSET,
  1151.                 .tda9887_conf   = TDA9887_PRESENT,
  1152.                 .tuner_addr     = ADDR_UNSET,
  1153.                 .radio_addr     = ADDR_UNSET,
  1154.                 .input          = {{
  1155.                         .type   = CX88_VMUX_TELEVISION,
  1156.                         .vmux   = 0,
  1157.                         .gpio0  = 0x0000BDE6
  1158. #if 0
  1159.                 },{
  1160.                         .type   = CX88_VMUX_COMPOSITE1,
  1161.                         .vmux   = 1,
  1162.                         .gpio0  = 0x0000BDE6,
  1163.                 },{
  1164.                         .type   = CX88_VMUX_SVIDEO,
  1165.                         .vmux   = 2,
  1166.                         .gpio0  = 0x0000BDE6,
  1167. #endif
  1168.                 }},
  1169. #if 0
  1170.                 .radio = {
  1171.                         .gpio0  = 0x0000BDE6,
  1172.                         .type   = CX88_RADIO,
  1173.                 },
  1174. #endif
  1175.                 .mpeg           = CX88_MPEG_BLACKBIRD,
  1176.         },
  1177.         [CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {
  1178.                 /* FIXME: SVideo, Composite and FM inputs are untested */
  1179.                 .name           = "PixelView PlayTV P7000",
  1180.                 .tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
  1181.                 .radio_type     = UNSET,
  1182.                 .tuner_addr     = ADDR_UNSET,
  1183.                 .radio_addr     = ADDR_UNSET,
  1184.                 .tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
  1185.                                   TDA9887_PORT2_ACTIVE,
  1186.                 .input          = {{
  1187.                         .type   = CX88_VMUX_TELEVISION,
  1188.                         .vmux   = 0,
  1189.                         .gpio0  = 0x5da6,
  1190. #if 0
  1191.                 },{
  1192.                         .type   = CX88_VMUX_COMPOSITE1,
  1193.                         .vmux   = 1,
  1194.                         .gpio0  = 0x5da4,
  1195.                 },{
  1196.                         .type   = CX88_VMUX_SVIDEO,
  1197.                         .vmux   = 2,
  1198.                         .gpio0  = 0x5da5,
  1199. #endif
  1200.                 }},
  1201. #if 0
  1202.                 .radio = {
  1203.                          .type  = CX88_RADIO,
  1204.                          .gpio0 = 0x5da3,
  1205.                 },
  1206. #endif
  1207.                 .mpeg           = CX88_MPEG_BLACKBIRD,
  1208.         },
  1209.         [CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {
  1210.                 .name           = "NPG Tech Real TV FM Top 10",
  1211.                 .tuner_type     = TUNER_TNF_5335MF, /* Actually a TNF9535 */
  1212.                 .radio_type     = UNSET,
  1213.                 .tuner_addr     = ADDR_UNSET,
  1214.                 .radio_addr     = ADDR_UNSET,
  1215.                 .input          = {{
  1216.                         .type   = CX88_VMUX_TELEVISION,
  1217.                         .vmux   = 0,
  1218.                         .gpio0  = 0x0788,
  1219.                 },{
  1220.                         .type   = CX88_VMUX_COMPOSITE1,
  1221.                         .vmux   = 1,
  1222.                         .gpio0  = 0x078b,
  1223.                 },{
  1224.                         .type   = CX88_VMUX_SVIDEO,
  1225.                         .vmux   = 2,
  1226.                         .gpio0  = 0x078b,
  1227.                 }},
  1228.                 .radio = {
  1229.                          .type  = CX88_RADIO,
  1230.                          .gpio0 = 0x074a,
  1231.                 },
  1232.         },
  1233.         [CX88_BOARD_WINFAST_DTV2000H] = {
  1234.                 /* video inputs and radio still in testing */
  1235.                 .name           = "WinFast DTV2000 H",
  1236.                 .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  1237.                 .radio_type     = UNSET,
  1238.                 .tuner_addr     = ADDR_UNSET,
  1239.                 .radio_addr     = ADDR_UNSET,
  1240.                 .tda9887_conf   = TDA9887_PRESENT,
  1241.                 .input          = {{
  1242.                         .type   = CX88_VMUX_TELEVISION,
  1243.                         .vmux   = 0,
  1244.                         .gpio0  = 0x00017304,
  1245.                         .gpio1  = 0x00008203,
  1246.                         .gpio2  = 0x00017304,
  1247.                         .gpio3  = 0x02000000,
  1248.                 }},
  1249.                 .mpeg           = CX88_MPEG_DVB,
  1250.         },
  1251.         [CX88_BOARD_GENIATECH_DVBS] = {
  1252.                 .name          = "Geniatech DVB-S",
  1253.                 .tuner_type    = TUNER_ABSENT,
  1254.                 .radio_type    = UNSET,
  1255.                 .tuner_addr    = ADDR_UNSET,
  1256.                 .radio_addr    = ADDR_UNSET,
  1257.                 .input  = {{
  1258.                         .type  = CX88_VMUX_DVB,
  1259.                         .vmux  = 0,
  1260.                 },{
  1261.                         .type  = CX88_VMUX_COMPOSITE1,
  1262.                         .vmux  = 1,
  1263.                 }},
  1264.                 .mpeg           = CX88_MPEG_DVB,
  1265.         },
  1266.         [CX88_BOARD_HAUPPAUGE_HVR3000] = {
  1267.                 /* FIXME: Add dvb & radio support */
  1268.                 .name           = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",
  1269.                 .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  1270.                 .radio_type     = UNSET,
  1271.                 .tuner_addr     = ADDR_UNSET,
  1272.                 .radio_addr     = ADDR_UNSET,
  1273.                 .tda9887_conf   = TDA9887_PRESENT,
  1274.                 .input          = {{
  1275.                         .type   = CX88_VMUX_TELEVISION,
  1276.                         .vmux   = 0,
  1277.                         .gpio0  = 0x84bf,
  1278.                 },{
  1279.                         .type   = CX88_VMUX_COMPOSITE1,
  1280.                         .vmux   = 1,
  1281.                         .gpio0  = 0x84bf,
  1282.                 },{
  1283.                         .type   = CX88_VMUX_SVIDEO,
  1284.                         .vmux   = 2,
  1285.                         .gpio0  = 0x84bf,
  1286.                 }},
  1287.                 .mpeg           = CX88_MPEG_DVB,
  1288.         },
  1289.         [CX88_BOARD_NORWOOD_MICRO] = {
  1290.                 .name           = "Norwood Micro TV Tuner",
  1291.                 .tuner_type     = TUNER_TNF_5335MF,
  1292.                 .radio_type     = UNSET,
  1293.                 .tuner_addr     = ADDR_UNSET,
  1294.                 .radio_addr     = ADDR_UNSET,
  1295.                 .input          = {{
  1296.                         .type   = CX88_VMUX_TELEVISION,
  1297.                         .vmux   = 0,
  1298.                         .gpio0  = 0x0709,
  1299.                 },{
  1300.                         .type   = CX88_VMUX_COMPOSITE1,
  1301.                         .vmux   = 1,
  1302.                         .gpio0  = 0x070b,
  1303.                 },{
  1304.                         .type   = CX88_VMUX_SVIDEO,
  1305.                         .vmux   = 2,
  1306.                         .gpio0  = 0x070b,
  1307.                 }},
  1308.         },
  1309.         [CX88_BOARD_TE_DTV_250_OEM_SWANN] = {
  1310.                 .name           = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",
  1311.                 .tuner_type     = TUNER_LG_PAL_NEW_TAPC,
  1312.                 .radio_type     = UNSET,
  1313.                 .tuner_addr     = ADDR_UNSET,
  1314.                 .radio_addr     = ADDR_UNSET,
  1315.                 .input          = {{
  1316.                         .type   = CX88_VMUX_TELEVISION,
  1317.                         .vmux   = 0,
  1318.                         .gpio0  = 0x003fffff,
  1319.                         .gpio1  = 0x00e00000,
  1320.                         .gpio2  = 0x003fffff,
  1321.                         .gpio3  = 0x02000000,
  1322.                 },{
  1323.                         .type   = CX88_VMUX_COMPOSITE1,
  1324.                         .vmux   = 1,
  1325.                         .gpio0  = 0x003fffff,
  1326.                         .gpio1  = 0x00e00000,
  1327.                         .gpio2  = 0x003fffff,
  1328.                         .gpio3  = 0x02000000,
  1329.                 },{
  1330.                         .type   = CX88_VMUX_SVIDEO,
  1331.                         .vmux   = 2,
  1332.                         .gpio0  = 0x003fffff,
  1333.                         .gpio1  = 0x00e00000,
  1334.                         .gpio2  = 0x003fffff,
  1335.                         .gpio3  = 0x02000000,
  1336.                 }},
  1337.         },
  1338.         [CX88_BOARD_HAUPPAUGE_HVR1300] = {
  1339.                 .name      = "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",
  1340.                 .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
  1341.                 .radio_type     = UNSET,
  1342.                 .tuner_addr     = ADDR_UNSET,
  1343.                 .radio_addr     = ADDR_UNSET,
  1344.                 .tda9887_conf   = TDA9887_PRESENT,
  1345.                 .audio_chip     = AUDIO_CHIP_WM8775,
  1346.                 .input    = {{
  1347.                         .type   = CX88_VMUX_TELEVISION,
  1348.                         .vmux   = 0,
  1349.                         .gpio0  = 0xe780,
  1350.                         .extadc = 1,
  1351.                 },{
  1352.                         .type   = CX88_VMUX_COMPOSITE1,
  1353.                         .vmux   = 1,
  1354.                         .gpio0  = 0xe780,
  1355.                         .extadc = 1,
  1356.                 },{
  1357.                         .type   = CX88_VMUX_SVIDEO,
  1358.                         .vmux   = 2,
  1359.                         .gpio0  = 0xe780,
  1360.                         .extadc = 1,
  1361.                 }},
  1362.                 /* fixme: Add radio support */
  1363.                 .mpeg           = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD,
  1364.         },
  1365.         [CX88_BOARD_WINFAST2000XP_GLOBAL] = {
  1366.                 .name           = "Leadtek Winfast 2000XP Global",
  1367.                 .tuner_type     = UNSET,
  1368.                 .radio_type     = UNSET,
  1369.                 .tuner_addr     = ADDR_UNSET,
  1370.                 .radio_addr     = ADDR_UNSET,
  1371.                 .input          = {{
  1372.                         .type   = CX88_VMUX_TELEVISION,
  1373.                         .vmux   = 0,
  1374.                 },{
  1375.                         .type   = CX88_VMUX_COMPOSITE1,
  1376.                         .vmux   = 1,
  1377.                 },{     
  1378.                         .type   = CX88_VMUX_SVIDEO,
  1379.                         .vmux   = 2,
  1380.                 }},
  1381.             },
  1382.          
  1383. };
  1384. const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
  1385.  
  1386. /* ------------------------------------------------------------------ */
  1387. /* PCI subsystem IDs                                                  */
  1388.  
  1389. struct cx88_subid cx88_subids[] = {
  1390.         {
  1391.                 .subvendor = 0x0070,
  1392.                 .subdevice = 0x3400,
  1393.                 .card      = CX88_BOARD_HAUPPAUGE,
  1394.         },{
  1395.                 .subvendor = 0x0070,
  1396.                 .subdevice = 0x3401,
  1397.                 .card      = CX88_BOARD_HAUPPAUGE,
  1398.         },{
  1399.                 .subvendor = 0x14c7,
  1400.                 .subdevice = 0x0106,
  1401.                 .card      = CX88_BOARD_GDI,
  1402.         },{
  1403.                 .subvendor = 0x14c7,
  1404.                 .subdevice = 0x0107, /* with mpeg encoder */
  1405.                 .card      = CX88_BOARD_GDI,
  1406.         },{
  1407.                 .subvendor = PCI_VENDOR_ID_ATI,
  1408.                 .subdevice = 0x00f8,
  1409.                 .card      = CX88_BOARD_ATI_WONDER_PRO,
  1410.         },{
  1411.                 .subvendor = 0x107d,
  1412.                 .subdevice = 0x6611,
  1413.                 .card      = CX88_BOARD_WINFAST2000XP_EXPERT,
  1414.         },{
  1415.                 .subvendor = 0x107d,
  1416.                 .subdevice = 0x6613,    /* NTSC */
  1417.                 .card      = CX88_BOARD_WINFAST2000XP_EXPERT,
  1418.         },{
  1419.                 .subvendor = 0x107d,
  1420.                 .subdevice = 0x6620,
  1421.                 .card      = CX88_BOARD_WINFAST_DV2000,
  1422.         },{
  1423.                 .subvendor = 0x107d,
  1424.                 .subdevice = 0x663b,
  1425.                 .card      = CX88_BOARD_LEADTEK_PVR2000,
  1426.         },{
  1427.                 .subvendor = 0x107d,
  1428.                 .subdevice = 0x663c,
  1429.                 .card      = CX88_BOARD_LEADTEK_PVR2000,
  1430.         },{
  1431.                 .subvendor = 0x1461,
  1432.                 .subdevice = 0x000b,
  1433.                 .card      = CX88_BOARD_AVERTV_STUDIO_303,
  1434.         },{
  1435.                 .subvendor = 0x1462,
  1436.                 .subdevice = 0x8606,
  1437.                 .card      = CX88_BOARD_MSI_TVANYWHERE_MASTER,
  1438.         },{
  1439.                 .subvendor = 0x10fc,
  1440.                 .subdevice = 0xd003,
  1441.                 .card      = CX88_BOARD_IODATA_GVVCP3PCI,
  1442.         },{
  1443.                 .subvendor = 0x1043,
  1444.                 .subdevice = 0x4823,  /* with mpeg encoder */
  1445.                 .card      = CX88_BOARD_ASUS_PVR_416,
  1446.         },{
  1447.                 .subvendor = 0x17de,
  1448.                 .subdevice = 0x08a6,
  1449.                 .card      = CX88_BOARD_KWORLD_DVB_T,
  1450.         },{
  1451.                 .subvendor = 0x18ac,
  1452.                 .subdevice = 0xd810,
  1453.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
  1454.         },{
  1455.                 .subvendor = 0x18ac,
  1456.                 .subdevice = 0xd820,
  1457.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T,
  1458.         },{
  1459.                 .subvendor = 0x18ac,
  1460.                 .subdevice = 0xdb00,
  1461.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1,
  1462.         },{
  1463.                 .subvendor = 0x0070,
  1464.                 .subdevice = 0x9002,
  1465.                 .card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
  1466.         },{
  1467.                 .subvendor = 0x14f1,
  1468.                 .subdevice = 0x0187,
  1469.                 .card      = CX88_BOARD_CONEXANT_DVB_T1,
  1470.         },{
  1471.                 .subvendor = 0x1540,
  1472.                 .subdevice = 0x2580,
  1473.                 .card      = CX88_BOARD_PROVIDEO_PV259,
  1474.         },{
  1475.                 .subvendor = 0x18ac,
  1476.                 .subdevice = 0xdb10,
  1477.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
  1478.         },{
  1479.                 .subvendor = 0x1554,
  1480.                 .subdevice = 0x4811,
  1481.                 .card      = CX88_BOARD_PIXELVIEW,
  1482.         },{
  1483.                 .subvendor = 0x7063,
  1484.                 .subdevice = 0x3000, /* HD-3000 card */
  1485.                 .card      = CX88_BOARD_PCHDTV_HD3000,
  1486.         },{
  1487.                 .subvendor = 0x17de,
  1488.                 .subdevice = 0xa8a6,
  1489.                 .card      = CX88_BOARD_DNTV_LIVE_DVB_T,
  1490.         },{
  1491.                 .subvendor = 0x0070,
  1492.                 .subdevice = 0x2801,
  1493.                 .card      = CX88_BOARD_HAUPPAUGE_ROSLYN,
  1494.         },{
  1495.                 .subvendor = 0x14f1,
  1496.                 .subdevice = 0x0342,
  1497.                 .card      = CX88_BOARD_DIGITALLOGIC_MEC,
  1498.         },{
  1499.                 .subvendor = 0x10fc,
  1500.                 .subdevice = 0xd035,
  1501.                 .card      = CX88_BOARD_IODATA_GVBCTV7E,
  1502.         },{
  1503.                 .subvendor = 0x1421,
  1504.                 .subdevice = 0x0334,
  1505.                 .card      = CX88_BOARD_ADSTECH_DVB_T_PCI,
  1506.         },{
  1507.                 .subvendor = 0x153b,
  1508.                 .subdevice = 0x1166,
  1509.                 .card      = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1,
  1510.         },{
  1511.                 .subvendor = 0x18ac,
  1512.                 .subdevice = 0xd500,
  1513.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD,
  1514.         },{
  1515.                 .subvendor = 0x1461,
  1516.                 .subdevice = 0x8011,
  1517.                 .card      = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550,
  1518.         },{
  1519.                 .subvendor = PCI_VENDOR_ID_ATI,
  1520.                 .subdevice = 0xa101,
  1521.                 .card      = CX88_BOARD_ATI_HDTVWONDER,
  1522.         },{
  1523.                 .subvendor = 0x107d,
  1524.                 .subdevice = 0x665f,
  1525.                 .card      = CX88_BOARD_WINFAST_DTV1000,
  1526.         },{
  1527.                 .subvendor = 0x1461,
  1528.                 .subdevice = 0x000a,
  1529.                 .card      = CX88_BOARD_AVERTV_303,
  1530.         },{
  1531.                 .subvendor = 0x0070,
  1532.                 .subdevice = 0x9200,
  1533.                 .card      = CX88_BOARD_HAUPPAUGE_NOVASE2_S1,
  1534.         },{
  1535.                 .subvendor = 0x0070,
  1536.                 .subdevice = 0x9201,
  1537.                 .card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
  1538.         },{
  1539.                 .subvendor = 0x0070,
  1540.                 .subdevice = 0x9202,
  1541.                 .card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
  1542.         },{
  1543.                 .subvendor = 0x17de,
  1544.                 .subdevice = 0x08b2,
  1545.                 .card      = CX88_BOARD_KWORLD_DVBS_100,
  1546.         },{
  1547.                 .subvendor = 0x0070,
  1548.                 .subdevice = 0x9400,
  1549.                 .card      = CX88_BOARD_HAUPPAUGE_HVR1100,
  1550.         },{
  1551.                 .subvendor = 0x0070,
  1552.                 .subdevice = 0x9402,
  1553.                 .card      = CX88_BOARD_HAUPPAUGE_HVR1100,
  1554.         },{
  1555.                 .subvendor = 0x0070,
  1556.                 .subdevice = 0x9800,
  1557.                 .card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
  1558.         },{
  1559.                 .subvendor = 0x0070,
  1560.                 .subdevice = 0x9802,
  1561.                 .card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
  1562.         },{
  1563.                 .subvendor = 0x0070,
  1564.                 .subdevice = 0x9001,
  1565.                 .card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
  1566.         },{
  1567.                 .subvendor = 0x1822,
  1568.                 .subdevice = 0x0025,
  1569.                 .card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
  1570.         },{
  1571.                 .subvendor = 0x17de,
  1572.                 .subdevice = 0x08a1,
  1573.                 .card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
  1574.         },{
  1575.                 .subvendor = 0x18ac,
  1576.                 .subdevice = 0xdb50,
  1577.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
  1578.         },{
  1579.                 .subvendor = 0x18ac,
  1580.                 .subdevice = 0xdb54,
  1581.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
  1582.                 /* Re-branded DViCO: DigitalNow DVB-T Dual */
  1583.         },{
  1584.                 .subvendor = 0x18ac,
  1585.                 .subdevice = 0xdb11,
  1586.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
  1587.                 /* Re-branded DViCO: UltraView DVB-T Plus */
  1588.         },{
  1589.                 .subvendor = 0x17de,
  1590.                 .subdevice = 0x0840,
  1591.                .card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
  1592.        },{
  1593.                .subvendor = 0x1421,
  1594.                .subdevice = 0x0305,
  1595.                 .card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
  1596.         },{
  1597.                 .subvendor = 0x18ac,
  1598.                 .subdevice = 0xdb40,
  1599.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
  1600.         },{
  1601.                 .subvendor = 0x18ac,
  1602.                 .subdevice = 0xdb44,
  1603.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
  1604.         },{
  1605.                 .subvendor = 0x7063,
  1606.                 .subdevice = 0x5500,
  1607.                 .card      = CX88_BOARD_PCHDTV_HD5500,
  1608.         },{
  1609.                 .subvendor = 0x17de,
  1610.                 .subdevice = 0x0841,
  1611.                 .card      = CX88_BOARD_KWORLD_MCE200_DELUXE,
  1612.         },{
  1613.                 .subvendor = 0x1822,
  1614.                 .subdevice = 0x0019,
  1615.                 .card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
  1616.         },{
  1617.                 .subvendor = 0x1554,
  1618.                 .subdevice = 0x4813,
  1619.                 .card      = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,
  1620.         },{
  1621.                 .subvendor = 0x14f1,
  1622.                 .subdevice = 0x0842,
  1623.                 .card      = CX88_BOARD_NPGTECH_REALTV_TOP10FM,
  1624.         },{
  1625.                 .subvendor = 0x107d,
  1626.                 .subdevice = 0x665e,
  1627.                 .card      = CX88_BOARD_WINFAST_DTV2000H,
  1628.         },{
  1629.                 .subvendor = 0x18ac,
  1630.                 .subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
  1631.                 .card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
  1632.         },{
  1633.                 .subvendor = 0x14f1,
  1634.                 .subdevice = 0x0084,
  1635.                 .card      = CX88_BOARD_GENIATECH_DVBS,
  1636.         },{
  1637.                 .subvendor = 0x0070,
  1638.                 .subdevice = 0x1404,
  1639.                 .card      = CX88_BOARD_HAUPPAUGE_HVR3000,
  1640.         },{
  1641.                 .subvendor = 0x1461,
  1642.                 .subdevice = 0xc111, /* AverMedia M150-D */
  1643.                 /* This board is known to work with the ASUS PVR416 config */
  1644.                 .card      = CX88_BOARD_ASUS_PVR_416,
  1645.         },{
  1646.                 .subvendor = 0xc180,
  1647.                 .subdevice = 0xc980,
  1648.                 .card      = CX88_BOARD_TE_DTV_250_OEM_SWANN,
  1649.         },{
  1650.                 .subvendor = 0x0070,
  1651.                 .subdevice = 0x9600,
  1652.                 .card      = CX88_BOARD_HAUPPAUGE_HVR1300,
  1653.         },{
  1654.                 .subvendor = 0x0070,
  1655.                 .subdevice = 0x9601,
  1656.                 .card      = CX88_BOARD_HAUPPAUGE_HVR1300,
  1657.         },{
  1658.                 .subvendor = 0x0070,
  1659.                 .subdevice = 0x9602,
  1660.                 .card      = CX88_BOARD_HAUPPAUGE_HVR1300,
  1661.         },{
  1662.                 .subvendor = 0x107d,
  1663.                 .subdevice = 0x6632,
  1664.                 .card      = CX88_BOARD_LEADTEK_PVR2000,
  1665.         },{
  1666.                 .subvendor = 0x12ab,
  1667.                 .subdevice = 0x2300, /* Club3D Zap TV2100 */
  1668.                 .card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
  1669.         },{
  1670.                 .subvendor = 0x0070,
  1671.                 .subdevice = 0x9000,
  1672.                 .card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
  1673.         },{
  1674.                 .subvendor = 0x0070,
  1675.                 .subdevice = 0x1400,
  1676.                 .card      = CX88_BOARD_HAUPPAUGE_HVR3000,
  1677.         },{
  1678.                 .subvendor = 0x0070,
  1679.                 .subdevice = 0x1401,
  1680.                 .card      = CX88_BOARD_HAUPPAUGE_HVR3000,
  1681.         },{
  1682.                 .subvendor = 0x0070,
  1683.                 .subdevice = 0x1402,
  1684.                 .card      = CX88_BOARD_HAUPPAUGE_HVR3000,
  1685.         },{
  1686.                 .subvendor = 0x107d,
  1687.                 .subdevice = 0x6f18,
  1688.                 .card      = CX88_BOARD_WINFAST2000XP_GLOBAL,   
  1689.         },
  1690. };
  1691. const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids);
  1692.  
  1693. /* ----------------------------------------------------------------------- */
  1694. /* some leadtek specific stuff                                             */
  1695.  
  1696. static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
  1697. {
  1698.         /* This is just for the "Winfast 2000XP Expert" board ATM; I don't have data on
  1699.          * any others.
  1700.          *
  1701.          * Byte 0 is 1 on the NTSC board.
  1702.          */
  1703.  
  1704.         if (eeprom_data[4] != 0x7d ||
  1705.             eeprom_data[5] != 0x10 ||
  1706.             eeprom_data[7] != 0x66) {
  1707.                 printk(KERN_WARNING "%s: Leadtek eeprom invalid.\n",
  1708.                        core->name);
  1709.                 return;
  1710.         }
  1711.  
  1712.         core->has_radio  = 1;
  1713.         core->tuner_type = (eeprom_data[6] == 0x13) ? 43 : 38;
  1714.  
  1715.         printk(KERN_INFO "%s: Leadtek Winfast 2000XP Expert config: "
  1716.                "tuner=%d, eeprom[0]=0x%02x\n",
  1717.                core->name, core->tuner_type, eeprom_data[0]);
  1718. }
  1719.  
  1720. static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
  1721. {
  1722.         struct tveeprom tv;
  1723.  
  1724.         tveeprom_hauppauge_analog(&core->i2c_client, &tv, eeprom_data);
  1725.         core->tuner_type = tv.tuner_type;
  1726.         core->tuner_formats = tv.tuner_formats;
  1727.         core->has_radio  = tv.has_radio;
  1728.  
  1729.         /* Make sure we support the board model */
  1730.         switch (tv.model)
  1731.         {
  1732.         case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */
  1733.         case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */
  1734.         case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */
  1735.         case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */
  1736.         case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */
  1737.         case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */
  1738.         case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */
  1739.         case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */
  1740.         case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */
  1741.         case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
  1742.         case 34519: /* WinTV-PCI-FM */
  1743.         case 90002: /* Nova-T-PCI (9002) */
  1744.         case 92001: /* Nova-S-Plus (Video and IR) */
  1745.         case 92002: /* Nova-S-Plus (Video and IR) */
  1746.         case 90003: /* Nova-T-PCI (9002 No RF out) */
  1747.         case 90500: /* Nova-T-PCI (oem) */
  1748.         case 90501: /* Nova-T-PCI (oem/IR) */
  1749.         case 92000: /* Nova-SE2 (OEM, No Video or IR) */
  1750.         case 94009: /* WinTV-HVR1100 (Video and IR Retail) */
  1751.         case 94501: /* WinTV-HVR1100 (Video and IR OEM) */
  1752.         case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */
  1753.         case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */
  1754.         case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */
  1755.         case 96569: /* WinTV-HVR1300 () */
  1756.         case 96659: /* WinTV-HVR1300 () */
  1757.         case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */
  1758.                 /* known */
  1759.                 break;
  1760.         default:
  1761.                 printk("%s: warning: unknown hauppauge model #%d\n",
  1762.                        core->name, tv.model);
  1763.                 break;
  1764.         }
  1765.  
  1766.         printk(KERN_INFO "%s: hauppauge eeprom: model=%d\n",
  1767.                         core->name, tv.model);
  1768. }
  1769.  
  1770. /* ----------------------------------------------------------------------- */
  1771. /* some GDI (was: Modular Technology) specific stuff                       */
  1772.  
  1773. static struct {
  1774.         int  id;
  1775.         int  fm;
  1776.         char *name;
  1777. } gdi_tuner[] = {
  1778.         [ 0x01 ] = { .id   = TUNER_ABSENT,
  1779.                      .name = "NTSC_M" },
  1780.         [ 0x02 ] = { .id   = TUNER_ABSENT,
  1781.                      .name = "PAL_B" },
  1782.         [ 0x03 ] = { .id   = TUNER_ABSENT,
  1783.                      .name = "PAL_I" },
  1784.         [ 0x04 ] = { .id   = TUNER_ABSENT,
  1785.                      .name = "PAL_D" },
  1786.         [ 0x05 ] = { .id   = TUNER_ABSENT,
  1787.                      .name = "SECAM" },
  1788.  
  1789.         [ 0x10 ] = { .id   = TUNER_ABSENT,
  1790.                      .fm   = 1,
  1791.                      .name = "TEMIC_4049" },
  1792.         [ 0x11 ] = { .id   = TUNER_TEMIC_4136FY5,
  1793.                      .name = "TEMIC_4136" },
  1794.         [ 0x12 ] = { .id   = TUNER_ABSENT,
  1795.                      .name = "TEMIC_4146" },
  1796.  
  1797.         [ 0x20 ] = { .id   = TUNER_PHILIPS_FQ1216ME,
  1798.                      .fm   = 1,
  1799.                      .name = "PHILIPS_FQ1216_MK3" },
  1800.         [ 0x21 ] = { .id   = TUNER_ABSENT, .fm = 1,
  1801.                      .name = "PHILIPS_FQ1236_MK3" },
  1802.         [ 0x22 ] = { .id   = TUNER_ABSENT,
  1803.                      .name = "PHILIPS_FI1236_MK3" },
  1804.         [ 0x23 ] = { .id   = TUNER_ABSENT,
  1805.                      .name = "PHILIPS_FI1216_MK3" },
  1806. };
  1807.  
  1808. static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data)
  1809. {
  1810.         char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner))
  1811.                 ? gdi_tuner[eeprom_data[0x0d]].name : NULL;
  1812.  
  1813.         printk(KERN_INFO "%s: GDI: tuner=%s\n", core->name,
  1814.                name ? name : "unknown");
  1815.         if (NULL == name)
  1816.                 return;
  1817.         core->tuner_type = gdi_tuner[eeprom_data[0x0d]].id;
  1818.         core->has_radio  = gdi_tuner[eeprom_data[0x0d]].fm;
  1819. }
  1820.  
  1821. /* ----------------------------------------------------------------------- */
  1822. /* some DViCO specific stuff                                               */
  1823.  
  1824. static void dvico_fusionhdtv_hybrid_init(struct cx88_core *core)
  1825. {
  1826.         struct i2c_msg msg = { .addr = 0x45, .flags = 0 };
  1827.         int i, err;
  1828.         static u8 init_bufs[13][5] = {
  1829.                 { 0x10, 0x00, 0x20, 0x01, 0x03 },
  1830.                 { 0x10, 0x10, 0x01, 0x00, 0x21 },
  1831.                 { 0x10, 0x10, 0x10, 0x00, 0xCA },
  1832.                 { 0x10, 0x10, 0x12, 0x00, 0x08 },
  1833.                 { 0x10, 0x10, 0x13, 0x00, 0x0A },
  1834.                 { 0x10, 0x10, 0x16, 0x01, 0xC0 },
  1835.                 { 0x10, 0x10, 0x22, 0x01, 0x3D },
  1836.                 { 0x10, 0x10, 0x73, 0x01, 0x2E },
  1837.                 { 0x10, 0x10, 0x72, 0x00, 0xC5 },
  1838.                 { 0x10, 0x10, 0x71, 0x01, 0x97 },
  1839.                 { 0x10, 0x10, 0x70, 0x00, 0x0F },
  1840.                 { 0x10, 0x10, 0xB0, 0x00, 0x01 },
  1841.                 { 0x03, 0x0C },
  1842.         };
  1843.  
  1844.         for (i = 0; i < 13; i++) {
  1845.                 msg.buf = init_bufs[i];
  1846.                 msg.len = (i != 12 ? 5 : 2);
  1847.                 err = i2c_transfer(&core->i2c_adap, &msg, 1);
  1848.                 if (err != 1) {
  1849.                         printk("dvico_fusionhdtv_hybrid_init buf %d failed (err = %d)!\n", i, err);
  1850.                         return;
  1851.                 }
  1852.         }
  1853. }
  1854.  
  1855. /* ----------------------------------------------------------------------- */
  1856.  
  1857. void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)
  1858. {
  1859.         int i;
  1860.  
  1861.         if (0 == pci->subsystem_vendor &&
  1862.             0 == pci->subsystem_device) {
  1863.                 printk("%s: Your board has no valid PCI Subsystem ID and thus can't\n"
  1864.                        "%s: be autodetected.  Please pass card=<n> insmod option to\n"
  1865.                        "%s: workaround that.  Redirect complaints to the vendor of\n"
  1866.                        "%s: the TV card.  Best regards,\n"
  1867.                        "%s:         -- tux\n",
  1868.                        core->name,core->name,core->name,core->name,core->name);
  1869.         } else {
  1870.                 printk("%s: Your board isn't known (yet) to the driver.  You can\n"
  1871.                        "%s: try to pick one of the existing card configs via\n"
  1872.                        "%s: card=<n> insmod option.  Updating to the latest\n"
  1873.                        "%s: version might help as well.\n",
  1874.                        core->name,core->name,core->name,core->name);
  1875.         }
  1876.         printk("%s: Here is a list of valid choices for the card=<n> insmod option:\n",
  1877.                core->name);
  1878.         for (i = 0; i < cx88_bcount; i++)
  1879.                 printk("%s:    card=%d -> %s\n",
  1880.                        core->name, i, cx88_boards[i].name);
  1881. }
  1882.  
  1883. void cx88_card_setup_pre_i2c(struct cx88_core *core)
  1884. {
  1885.         switch (core->board) {
  1886.         case CX88_BOARD_HAUPPAUGE_HVR1300:
  1887.                 /* Bring the 702 demod up before i2c scanning/attach or devices are hidden */
  1888.                 /* We leave here with the 702 on the bus */
  1889.                 cx_write(MO_GP0_IO, 0x0000e780);
  1890.                 udelay(1000);
  1891.                 cx_clear(MO_GP0_IO, 0x00000080);
  1892.                 udelay(50);
  1893.                 cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
  1894.                 udelay(1000);
  1895.                 break;
  1896.         }
  1897. }
  1898.  
  1899. void cx88_card_setup(struct cx88_core *core)
  1900. {
  1901.         static u8 eeprom[256];
  1902.  
  1903.         if (0 == core->i2c_rc) {
  1904.                 core->i2c_client.addr = 0xa0 >> 1;
  1905.                 tveeprom_read(&core->i2c_client,eeprom,sizeof(eeprom));
  1906.         }
  1907.  
  1908.         switch (core->board) {
  1909.         case CX88_BOARD_HAUPPAUGE:
  1910.         case CX88_BOARD_HAUPPAUGE_ROSLYN:
  1911.                 if (0 == core->i2c_rc)
  1912.                         hauppauge_eeprom(core,eeprom+8);
  1913.                 break;
  1914.         case CX88_BOARD_GDI:
  1915.                 if (0 == core->i2c_rc)
  1916.                         gdi_eeprom(core,eeprom);
  1917.                 break;
  1918.         case CX88_BOARD_WINFAST2000XP_EXPERT:
  1919.                 if (0 == core->i2c_rc)
  1920.                         leadtek_eeprom(core,eeprom);
  1921.                 break;
  1922.         case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
  1923.         case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
  1924.         case CX88_BOARD_HAUPPAUGE_DVB_T1:
  1925.         case CX88_BOARD_HAUPPAUGE_HVR1100:
  1926.         case CX88_BOARD_HAUPPAUGE_HVR1100LP:
  1927.         case CX88_BOARD_HAUPPAUGE_HVR3000:
  1928.         case CX88_BOARD_HAUPPAUGE_HVR1300:
  1929.                 if (0 == core->i2c_rc)
  1930.                         hauppauge_eeprom(core,eeprom);
  1931.                 break;
  1932.         case CX88_BOARD_KWORLD_DVBS_100:
  1933.                 cx_write(MO_GP0_IO, 0x000007f8);
  1934.                 cx_write(MO_GP1_IO, 0x00000001);
  1935.                 break;
  1936.         case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
  1937.                 /* GPIO0:6 is hooked to FX2 reset pin */
  1938.                 cx_set(MO_GP0_IO, 0x00004040);
  1939.                 cx_clear(MO_GP0_IO, 0x00000040);
  1940.                 msleep(1000);
  1941.                 cx_set(MO_GP0_IO, 0x00004040);
  1942.                 /* FALLTHROUGH */
  1943.         case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
  1944.         case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
  1945.         case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
  1946.                 /* GPIO0:0 is hooked to mt352 reset pin */
  1947.                 cx_set(MO_GP0_IO, 0x00000101);
  1948.                 cx_clear(MO_GP0_IO, 0x00000001);
  1949.                 msleep(1);
  1950.                 cx_set(MO_GP0_IO, 0x00000101);
  1951.                 if (0 == core->i2c_rc &&
  1952.                     core->board == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID)
  1953.                         dvico_fusionhdtv_hybrid_init(core);
  1954.                 break;
  1955.         case CX88_BOARD_KWORLD_DVB_T:
  1956.         case CX88_BOARD_DNTV_LIVE_DVB_T:
  1957.                 cx_set(MO_GP0_IO, 0x00000707);
  1958.                 cx_set(MO_GP2_IO, 0x00000101);
  1959.                 cx_clear(MO_GP2_IO, 0x00000001);
  1960.                 msleep(1);
  1961.                 cx_clear(MO_GP0_IO, 0x00000007);
  1962.                 cx_set(MO_GP2_IO, 0x00000101);
  1963.                 break;
  1964.         case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
  1965.                 cx_write(MO_GP0_IO, 0x00080808);
  1966.                 break;
  1967.         case CX88_BOARD_ATI_HDTVWONDER:
  1968.                 if (0 == core->i2c_rc) {
  1969.                         /* enable tuner */
  1970.                         int i;
  1971.                         static const u8 buffer [] = { 0x10,0x12,0x13,0x04,0x16,0x00,0x14,0x04,0x017,0x00 };
  1972.                         core->i2c_client.addr = 0x0a;
  1973.  
  1974.                         for (i = 0; i < 5; i++)
  1975.                                 if (2 != i2c_master_send(&core->i2c_client,&buffer[i*2],2))
  1976.                                         printk(KERN_WARNING "%s: Unable to enable tuner(%i).\n",
  1977.                                                 core->name, i);
  1978.                 }
  1979.                 break;
  1980.         }
  1981.         if (cx88_boards[core->board].radio.type == CX88_RADIO)
  1982.                 core->has_radio = 1;
  1983. }
  1984.  
  1985. /* ------------------------------------------------------------------ */
  1986.  
  1987. EXPORT_SYMBOL(cx88_boards);
  1988.  
  1989. /*
  1990.  * Local variables:
  1991.  * c-basic-offset: 8
  1992.  * End:
  1993.  * kate: eol "unix"; indent-width 3; remove-trailing-space on; replace-trailing-space-save on; tab-width 8; replace-tabs off; space-indent off; mixed-indent off
  1994.  */

Update the Post

Either update this post and resubmit it with changes, or make a new post.

You may also comment on this post.

update paste below
details of the post (optional)

Note: Only the paste content is required, though the following information can be useful to others.

Save name / title?

(space separated, optional)



Please note that information posted here will expire by default in one month. If you do not want it to expire, please set the expiry time above. If it is set to expire, web search engines will not be allowed to index it prior to it expiring. Items that are not marked to expire will be indexable by search engines. Be careful with your passwords. All illegal activities will be reported and any information will be handed over to the authorities, so be good.

comments powered by Disqus
worth-right
worth-right
worth-right