162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci    bttv-cards.c
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci    this file has configuration information - card-specific stuff
762306a36Sopenharmony_ci    like the big tvcards array for the most part
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci    Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
1062306a36Sopenharmony_ci			   & Marcus Metzler (mocm@thp.uni-koeln.de)
1162306a36Sopenharmony_ci    (c) 1999-2001 Gerd Knorr <kraxel@goldbach.in-berlin.de>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci*/
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <linux/delay.h>
1962306a36Sopenharmony_ci#include <linux/module.h>
2062306a36Sopenharmony_ci#include <linux/kmod.h>
2162306a36Sopenharmony_ci#include <linux/init.h>
2262306a36Sopenharmony_ci#include <linux/pci.h>
2362306a36Sopenharmony_ci#include <linux/vmalloc.h>
2462306a36Sopenharmony_ci#include <linux/firmware.h>
2562306a36Sopenharmony_ci#include <net/checksum.h>
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#include <asm/unaligned.h>
2862306a36Sopenharmony_ci#include <asm/io.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#include "bttvp.h"
3162306a36Sopenharmony_ci#include <media/v4l2-common.h>
3262306a36Sopenharmony_ci#include <media/i2c/tvaudio.h>
3362306a36Sopenharmony_ci#include "bttv-audio-hook.h"
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/* fwd decl */
3662306a36Sopenharmony_cistatic void boot_msp34xx(struct bttv *btv, int pin);
3762306a36Sopenharmony_cistatic void hauppauge_eeprom(struct bttv *btv);
3862306a36Sopenharmony_cistatic void avermedia_eeprom(struct bttv *btv);
3962306a36Sopenharmony_cistatic void osprey_eeprom(struct bttv *btv, const u8 ee[256]);
4062306a36Sopenharmony_cistatic void modtec_eeprom(struct bttv *btv);
4162306a36Sopenharmony_cistatic void init_PXC200(struct bttv *btv);
4262306a36Sopenharmony_cistatic void init_RTV24(struct bttv *btv);
4362306a36Sopenharmony_cistatic void init_PCI8604PW(struct bttv *btv);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic void rv605_muxsel(struct bttv *btv, unsigned int input);
4662306a36Sopenharmony_cistatic void eagle_muxsel(struct bttv *btv, unsigned int input);
4762306a36Sopenharmony_cistatic void xguard_muxsel(struct bttv *btv, unsigned int input);
4862306a36Sopenharmony_cistatic void ivc120_muxsel(struct bttv *btv, unsigned int input);
4962306a36Sopenharmony_cistatic void gvc1100_muxsel(struct bttv *btv, unsigned int input);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic void PXC200_muxsel(struct bttv *btv, unsigned int input);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic void picolo_tetra_muxsel(struct bttv *btv, unsigned int input);
5462306a36Sopenharmony_cistatic void picolo_tetra_init(struct bttv *btv);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic void tibetCS16_muxsel(struct bttv *btv, unsigned int input);
5762306a36Sopenharmony_cistatic void tibetCS16_init(struct bttv *btv);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic void kodicom4400r_muxsel(struct bttv *btv, unsigned int input);
6062306a36Sopenharmony_cistatic void kodicom4400r_init(struct bttv *btv);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic void sigmaSLC_muxsel(struct bttv *btv, unsigned int input);
6362306a36Sopenharmony_cistatic void sigmaSQ_muxsel(struct bttv *btv, unsigned int input);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic void geovision_muxsel(struct bttv *btv, unsigned int input);
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic void phytec_muxsel(struct bttv *btv, unsigned int input);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic void gv800s_muxsel(struct bttv *btv, unsigned int input);
7062306a36Sopenharmony_cistatic void gv800s_init(struct bttv *btv);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic void td3116_muxsel(struct bttv *btv, unsigned int input);
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistatic int terratec_active_radio_upgrade(struct bttv *btv);
7562306a36Sopenharmony_cistatic int tea575x_init(struct bttv *btv);
7662306a36Sopenharmony_cistatic void identify_by_eeprom(struct bttv *btv,
7762306a36Sopenharmony_ci			       unsigned char eeprom_data[256]);
7862306a36Sopenharmony_cistatic int pvr_boot(struct bttv *btv);
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/* config variables */
8162306a36Sopenharmony_cistatic unsigned int triton1;
8262306a36Sopenharmony_cistatic unsigned int vsfx;
8362306a36Sopenharmony_cistatic unsigned int latency = UNSET;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistatic unsigned int card[BTTV_MAX]   = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
8662306a36Sopenharmony_cistatic unsigned int pll[BTTV_MAX]    = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
8762306a36Sopenharmony_cistatic unsigned int tuner[BTTV_MAX]  = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
8862306a36Sopenharmony_cistatic unsigned int svhs[BTTV_MAX]   = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
8962306a36Sopenharmony_cistatic unsigned int remote[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
9062306a36Sopenharmony_cistatic unsigned int audiodev[BTTV_MAX];
9162306a36Sopenharmony_cistatic unsigned int saa6588[BTTV_MAX];
9262306a36Sopenharmony_cistatic struct bttv  *master[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = NULL };
9362306a36Sopenharmony_cistatic unsigned int autoload = UNSET;
9462306a36Sopenharmony_cistatic unsigned int gpiomask = UNSET;
9562306a36Sopenharmony_cistatic unsigned int audioall = UNSET;
9662306a36Sopenharmony_cistatic unsigned int audiomux[5] = { [ 0 ... 4 ] = UNSET };
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/* insmod options */
9962306a36Sopenharmony_cimodule_param(triton1,    int, 0444);
10062306a36Sopenharmony_cimodule_param(vsfx,       int, 0444);
10162306a36Sopenharmony_cimodule_param(latency,    int, 0444);
10262306a36Sopenharmony_cimodule_param(gpiomask,   int, 0444);
10362306a36Sopenharmony_cimodule_param(audioall,   int, 0444);
10462306a36Sopenharmony_cimodule_param(autoload,   int, 0444);
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_cimodule_param_array(card,     int, NULL, 0444);
10762306a36Sopenharmony_cimodule_param_array(pll,      int, NULL, 0444);
10862306a36Sopenharmony_cimodule_param_array(tuner,    int, NULL, 0444);
10962306a36Sopenharmony_cimodule_param_array(svhs,     int, NULL, 0444);
11062306a36Sopenharmony_cimodule_param_array(remote,   int, NULL, 0444);
11162306a36Sopenharmony_cimodule_param_array(audiodev, int, NULL, 0444);
11262306a36Sopenharmony_cimodule_param_array(audiomux, int, NULL, 0444);
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciMODULE_PARM_DESC(triton1, "set ETBF pci config bit [enable bug compatibility for triton1 + others]");
11562306a36Sopenharmony_ciMODULE_PARM_DESC(vsfx, "set VSFX pci config bit [yet another chipset flaw workaround]");
11662306a36Sopenharmony_ciMODULE_PARM_DESC(latency,"pci latency timer");
11762306a36Sopenharmony_ciMODULE_PARM_DESC(card,"specify TV/grabber card model, see CARDLIST file for a list");
11862306a36Sopenharmony_ciMODULE_PARM_DESC(pll, "specify installed crystal (0=none, 28=28 MHz, 35=35 MHz, 14=14 MHz)");
11962306a36Sopenharmony_ciMODULE_PARM_DESC(tuner,"specify installed tuner type");
12062306a36Sopenharmony_ciMODULE_PARM_DESC(autoload, "obsolete option, please do not use anymore");
12162306a36Sopenharmony_ciMODULE_PARM_DESC(audiodev, "specify audio device:\n"
12262306a36Sopenharmony_ci		"\t\t-1 = no audio\n"
12362306a36Sopenharmony_ci		"\t\t 0 = autodetect (default)\n"
12462306a36Sopenharmony_ci		"\t\t 1 = msp3400\n"
12562306a36Sopenharmony_ci		"\t\t 2 = tda7432\n"
12662306a36Sopenharmony_ci		"\t\t 3 = tvaudio");
12762306a36Sopenharmony_ciMODULE_PARM_DESC(saa6588, "if 1, then load the saa6588 RDS module, default (0) is to use the card definition.");
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci/* I2C addresses list */
13162306a36Sopenharmony_ci#define I2C_ADDR_TDA7432	0x8a
13262306a36Sopenharmony_ci#define I2C_ADDR_MSP3400	0x80
13362306a36Sopenharmony_ci#define I2C_ADDR_MSP3400_ALT	0x88
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
13762306a36Sopenharmony_ci/* list of card IDs for bt878+ cards                                       */
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cistatic struct CARD {
14062306a36Sopenharmony_ci	unsigned id;
14162306a36Sopenharmony_ci	int cardnr;
14262306a36Sopenharmony_ci	char *name;
14362306a36Sopenharmony_ci} cards[] = {
14462306a36Sopenharmony_ci	{ 0x13eb0070, BTTV_BOARD_HAUPPAUGE878,  "Hauppauge WinTV" },
14562306a36Sopenharmony_ci	{ 0x39000070, BTTV_BOARD_HAUPPAUGE878,  "Hauppauge WinTV-D" },
14662306a36Sopenharmony_ci	{ 0x45000070, BTTV_BOARD_HAUPPAUGEPVR,  "Hauppauge WinTV/PVR" },
14762306a36Sopenharmony_ci	{ 0xff000070, BTTV_BOARD_OSPREY1x0,     "Osprey-100" },
14862306a36Sopenharmony_ci	{ 0xff010070, BTTV_BOARD_OSPREY2x0_SVID,"Osprey-200" },
14962306a36Sopenharmony_ci	{ 0xff020070, BTTV_BOARD_OSPREY500,     "Osprey-500" },
15062306a36Sopenharmony_ci	{ 0xff030070, BTTV_BOARD_OSPREY2000,    "Osprey-2000" },
15162306a36Sopenharmony_ci	{ 0xff040070, BTTV_BOARD_OSPREY540,     "Osprey-540" },
15262306a36Sopenharmony_ci	{ 0xff070070, BTTV_BOARD_OSPREY440,     "Osprey-440" },
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	{ 0x00011002, BTTV_BOARD_ATI_TVWONDER,  "ATI TV Wonder" },
15562306a36Sopenharmony_ci	{ 0x00031002, BTTV_BOARD_ATI_TVWONDERVE,"ATI TV Wonder/VE" },
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	{ 0x6606107d, BTTV_BOARD_WINFAST2000,   "Leadtek WinFast TV 2000" },
15862306a36Sopenharmony_ci	{ 0x6607107d, BTTV_BOARD_WINFASTVC100,  "Leadtek WinFast VC 100" },
15962306a36Sopenharmony_ci	{ 0x6609107d, BTTV_BOARD_WINFAST2000,   "Leadtek TV 2000 XP" },
16062306a36Sopenharmony_ci	{ 0x263610b4, BTTV_BOARD_STB2,          "STB TV PCI FM, Gateway P/N 6000704" },
16162306a36Sopenharmony_ci	{ 0x264510b4, BTTV_BOARD_STB2,          "STB TV PCI FM, Gateway P/N 6000704" },
16262306a36Sopenharmony_ci	{ 0x402010fc, BTTV_BOARD_GVBCTV3PCI,    "I-O Data Co. GV-BCTV3/PCI" },
16362306a36Sopenharmony_ci	{ 0x405010fc, BTTV_BOARD_GVBCTV4PCI,    "I-O Data Co. GV-BCTV4/PCI" },
16462306a36Sopenharmony_ci	{ 0x407010fc, BTTV_BOARD_GVBCTV5PCI,    "I-O Data Co. GV-BCTV5/PCI" },
16562306a36Sopenharmony_ci	{ 0xd01810fc, BTTV_BOARD_GVBCTV5PCI,    "I-O Data Co. GV-BCTV5/PCI" },
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	{ 0x001211bd, BTTV_BOARD_PINNACLE,      "Pinnacle PCTV" },
16862306a36Sopenharmony_ci	/* some cards ship with byteswapped IDs ... */
16962306a36Sopenharmony_ci	{ 0x1200bd11, BTTV_BOARD_PINNACLE,      "Pinnacle PCTV [bswap]" },
17062306a36Sopenharmony_ci	{ 0xff00bd11, BTTV_BOARD_PINNACLE,      "Pinnacle PCTV [bswap]" },
17162306a36Sopenharmony_ci	/* this seems to happen as well ... */
17262306a36Sopenharmony_ci	{ 0xff1211bd, BTTV_BOARD_PINNACLE,      "Pinnacle PCTV" },
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci	{ 0x3000121a, BTTV_BOARD_VOODOOTV_200,  "3Dfx VoodooTV 200" },
17562306a36Sopenharmony_ci	{ 0x263710b4, BTTV_BOARD_VOODOOTV_FM,   "3Dfx VoodooTV FM" },
17662306a36Sopenharmony_ci	{ 0x3060121a, BTTV_BOARD_STB2,	  "3Dfx VoodooTV 100/ STB OEM" },
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	{ 0x3000144f, BTTV_BOARD_MAGICTVIEW063, "(Askey Magic/others) TView99 CPH06x" },
17962306a36Sopenharmony_ci	{ 0xa005144f, BTTV_BOARD_MAGICTVIEW063, "CPH06X TView99-Card" },
18062306a36Sopenharmony_ci	{ 0x3002144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH05x" },
18162306a36Sopenharmony_ci	{ 0x3005144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH061/06L (T1/LC)" },
18262306a36Sopenharmony_ci	{ 0x5000144f, BTTV_BOARD_MAGICTVIEW061, "Askey CPH050" },
18362306a36Sopenharmony_ci	{ 0x300014ff, BTTV_BOARD_MAGICTVIEW061, "TView 99 (CPH061)" },
18462306a36Sopenharmony_ci	{ 0x300214ff, BTTV_BOARD_PHOEBE_TVMAS,  "Phoebe TV Master (CPH060)" },
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci	{ 0x00011461, BTTV_BOARD_AVPHONE98,     "AVerMedia TVPhone98" },
18762306a36Sopenharmony_ci	{ 0x00021461, BTTV_BOARD_AVERMEDIA98,   "AVermedia TVCapture 98" },
18862306a36Sopenharmony_ci	{ 0x00031461, BTTV_BOARD_AVPHONE98,     "AVerMedia TVPhone98" },
18962306a36Sopenharmony_ci	{ 0x00041461, BTTV_BOARD_AVERMEDIA98,   "AVerMedia TVCapture 98" },
19062306a36Sopenharmony_ci	{ 0x03001461, BTTV_BOARD_AVERMEDIA98,   "VDOMATE TV TUNER CARD" },
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci	{ 0x1117153b, BTTV_BOARD_TERRATVALUE,   "Terratec TValue (Philips PAL B/G)" },
19362306a36Sopenharmony_ci	{ 0x1118153b, BTTV_BOARD_TERRATVALUE,   "Terratec TValue (Temic PAL B/G)" },
19462306a36Sopenharmony_ci	{ 0x1119153b, BTTV_BOARD_TERRATVALUE,   "Terratec TValue (Philips PAL I)" },
19562306a36Sopenharmony_ci	{ 0x111a153b, BTTV_BOARD_TERRATVALUE,   "Terratec TValue (Temic PAL I)" },
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	{ 0x1123153b, BTTV_BOARD_TERRATVRADIO,  "Terratec TV Radio+" },
19862306a36Sopenharmony_ci	{ 0x1127153b, BTTV_BOARD_TERRATV,       "Terratec TV+ (V1.05)"    },
19962306a36Sopenharmony_ci	/* clashes with FlyVideo
20062306a36Sopenharmony_ci	 *{ 0x18521852, BTTV_BOARD_TERRATV,     "Terratec TV+ (V1.10)"    }, */
20162306a36Sopenharmony_ci	{ 0x1134153b, BTTV_BOARD_TERRATVALUE,   "Terratec TValue (LR102)" },
20262306a36Sopenharmony_ci	{ 0x1135153b, BTTV_BOARD_TERRATVALUER,  "Terratec TValue Radio" }, /* LR102 */
20362306a36Sopenharmony_ci	{ 0x5018153b, BTTV_BOARD_TERRATVALUE,   "Terratec TValue" },       /* ?? */
20462306a36Sopenharmony_ci	{ 0xff3b153b, BTTV_BOARD_TERRATVALUER,  "Terratec TValue Radio" }, /* ?? */
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	{ 0x400015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" },
20762306a36Sopenharmony_ci	{ 0x400a15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" },
20862306a36Sopenharmony_ci	{ 0x400d15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },
20962306a36Sopenharmony_ci	{ 0x401015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },
21062306a36Sopenharmony_ci	{ 0x401615b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	{ 0x1430aa00, BTTV_BOARD_PV143,         "Provideo PV143A" },
21362306a36Sopenharmony_ci	{ 0x1431aa00, BTTV_BOARD_PV143,         "Provideo PV143B" },
21462306a36Sopenharmony_ci	{ 0x1432aa00, BTTV_BOARD_PV143,         "Provideo PV143C" },
21562306a36Sopenharmony_ci	{ 0x1433aa00, BTTV_BOARD_PV143,         "Provideo PV143D" },
21662306a36Sopenharmony_ci	{ 0x1433aa03, BTTV_BOARD_PV143,         "Security Eyes" },
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	{ 0x1460aa00, BTTV_BOARD_PV150,         "Provideo PV150A-1" },
21962306a36Sopenharmony_ci	{ 0x1461aa01, BTTV_BOARD_PV150,         "Provideo PV150A-2" },
22062306a36Sopenharmony_ci	{ 0x1462aa02, BTTV_BOARD_PV150,         "Provideo PV150A-3" },
22162306a36Sopenharmony_ci	{ 0x1463aa03, BTTV_BOARD_PV150,         "Provideo PV150A-4" },
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	{ 0x1464aa04, BTTV_BOARD_PV150,         "Provideo PV150B-1" },
22462306a36Sopenharmony_ci	{ 0x1465aa05, BTTV_BOARD_PV150,         "Provideo PV150B-2" },
22562306a36Sopenharmony_ci	{ 0x1466aa06, BTTV_BOARD_PV150,         "Provideo PV150B-3" },
22662306a36Sopenharmony_ci	{ 0x1467aa07, BTTV_BOARD_PV150,         "Provideo PV150B-4" },
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	{ 0xa132ff00, BTTV_BOARD_IVC100,        "IVC-100"  },
22962306a36Sopenharmony_ci	{ 0xa1550000, BTTV_BOARD_IVC200,        "IVC-200"  },
23062306a36Sopenharmony_ci	{ 0xa1550001, BTTV_BOARD_IVC200,        "IVC-200"  },
23162306a36Sopenharmony_ci	{ 0xa1550002, BTTV_BOARD_IVC200,        "IVC-200"  },
23262306a36Sopenharmony_ci	{ 0xa1550003, BTTV_BOARD_IVC200,        "IVC-200"  },
23362306a36Sopenharmony_ci	{ 0xa1550100, BTTV_BOARD_IVC200,        "IVC-200G" },
23462306a36Sopenharmony_ci	{ 0xa1550101, BTTV_BOARD_IVC200,        "IVC-200G" },
23562306a36Sopenharmony_ci	{ 0xa1550102, BTTV_BOARD_IVC200,        "IVC-200G" },
23662306a36Sopenharmony_ci	{ 0xa1550103, BTTV_BOARD_IVC200,        "IVC-200G" },
23762306a36Sopenharmony_ci	{ 0xa1550800, BTTV_BOARD_IVC200,        "IVC-200"  },
23862306a36Sopenharmony_ci	{ 0xa1550801, BTTV_BOARD_IVC200,        "IVC-200"  },
23962306a36Sopenharmony_ci	{ 0xa1550802, BTTV_BOARD_IVC200,        "IVC-200"  },
24062306a36Sopenharmony_ci	{ 0xa1550803, BTTV_BOARD_IVC200,        "IVC-200"  },
24162306a36Sopenharmony_ci	{ 0xa182ff00, BTTV_BOARD_IVC120,        "IVC-120G" },
24262306a36Sopenharmony_ci	{ 0xa182ff01, BTTV_BOARD_IVC120,        "IVC-120G" },
24362306a36Sopenharmony_ci	{ 0xa182ff02, BTTV_BOARD_IVC120,        "IVC-120G" },
24462306a36Sopenharmony_ci	{ 0xa182ff03, BTTV_BOARD_IVC120,        "IVC-120G" },
24562306a36Sopenharmony_ci	{ 0xa182ff04, BTTV_BOARD_IVC120,        "IVC-120G" },
24662306a36Sopenharmony_ci	{ 0xa182ff05, BTTV_BOARD_IVC120,        "IVC-120G" },
24762306a36Sopenharmony_ci	{ 0xa182ff06, BTTV_BOARD_IVC120,        "IVC-120G" },
24862306a36Sopenharmony_ci	{ 0xa182ff07, BTTV_BOARD_IVC120,        "IVC-120G" },
24962306a36Sopenharmony_ci	{ 0xa182ff08, BTTV_BOARD_IVC120,        "IVC-120G" },
25062306a36Sopenharmony_ci	{ 0xa182ff09, BTTV_BOARD_IVC120,        "IVC-120G" },
25162306a36Sopenharmony_ci	{ 0xa182ff0a, BTTV_BOARD_IVC120,        "IVC-120G" },
25262306a36Sopenharmony_ci	{ 0xa182ff0b, BTTV_BOARD_IVC120,        "IVC-120G" },
25362306a36Sopenharmony_ci	{ 0xa182ff0c, BTTV_BOARD_IVC120,        "IVC-120G" },
25462306a36Sopenharmony_ci	{ 0xa182ff0d, BTTV_BOARD_IVC120,        "IVC-120G" },
25562306a36Sopenharmony_ci	{ 0xa182ff0e, BTTV_BOARD_IVC120,        "IVC-120G" },
25662306a36Sopenharmony_ci	{ 0xa182ff0f, BTTV_BOARD_IVC120,        "IVC-120G" },
25762306a36Sopenharmony_ci	{ 0xf0500000, BTTV_BOARD_IVCE8784,      "IVCE-8784" },
25862306a36Sopenharmony_ci	{ 0xf0500001, BTTV_BOARD_IVCE8784,      "IVCE-8784" },
25962306a36Sopenharmony_ci	{ 0xf0500002, BTTV_BOARD_IVCE8784,      "IVCE-8784" },
26062306a36Sopenharmony_ci	{ 0xf0500003, BTTV_BOARD_IVCE8784,      "IVCE-8784" },
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	{ 0x41424344, BTTV_BOARD_GRANDTEC,      "GrandTec Multi Capture" },
26362306a36Sopenharmony_ci	{ 0x01020304, BTTV_BOARD_XGUARD,        "Grandtec Grand X-Guard" },
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	{ 0x18501851, BTTV_BOARD_CHRONOS_VS2,   "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" },
26662306a36Sopenharmony_ci	{ 0xa0501851, BTTV_BOARD_CHRONOS_VS2,   "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" },
26762306a36Sopenharmony_ci	{ 0x18511851, BTTV_BOARD_FLYVIDEO98EZ,  "FlyVideo 98EZ (LR51)/ CyberMail AV" },
26862306a36Sopenharmony_ci	{ 0x18521852, BTTV_BOARD_TYPHOON_TVIEW, "FlyVideo 98FM (LR50)/ Typhoon TView TV/FM Tuner" },
26962306a36Sopenharmony_ci	{ 0x41a0a051, BTTV_BOARD_FLYVIDEO_98FM, "Lifeview FlyVideo 98 LR50 Rev Q" },
27062306a36Sopenharmony_ci	{ 0x18501f7f, BTTV_BOARD_FLYVIDEO_98,   "Lifeview Flyvideo 98" },
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci	{ 0x010115cb, BTTV_BOARD_GMV1,          "AG GMV1" },
27362306a36Sopenharmony_ci	{ 0x010114c7, BTTV_BOARD_MODTEC_205,    "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV" },
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci	{ 0x10b42636, BTTV_BOARD_HAUPPAUGE878,  "STB ???" },
27662306a36Sopenharmony_ci	{ 0x217d6606, BTTV_BOARD_WINFAST2000,   "Leadtek WinFast TV 2000" },
27762306a36Sopenharmony_ci	{ 0xfff6f6ff, BTTV_BOARD_WINFAST2000,   "Leadtek WinFast TV 2000" },
27862306a36Sopenharmony_ci	{ 0x03116000, BTTV_BOARD_SENSORAY311_611, "Sensoray 311" },
27962306a36Sopenharmony_ci	{ 0x06116000, BTTV_BOARD_SENSORAY311_611, "Sensoray 611" },
28062306a36Sopenharmony_ci	{ 0x00790e11, BTTV_BOARD_WINDVR,        "Canopus WinDVR PCI" },
28162306a36Sopenharmony_ci	{ 0xa0fca1a0, BTTV_BOARD_ZOLTRIX,       "Face to Face Tvmax" },
28262306a36Sopenharmony_ci	{ 0x82b2aa6a, BTTV_BOARD_SIMUS_GVC1100, "SIMUS GVC1100" },
28362306a36Sopenharmony_ci	{ 0x146caa0c, BTTV_BOARD_PV951,         "ituner spectra8" },
28462306a36Sopenharmony_ci	{ 0x200a1295, BTTV_BOARD_PXC200,        "ImageNation PXC200A" },
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	{ 0x40111554, BTTV_BOARD_PV_BT878P_9B,  "Prolink Pixelview PV-BT" },
28762306a36Sopenharmony_ci	{ 0x17de0a01, BTTV_BOARD_KWORLD,        "Mecer TV/FM/Video Tuner" },
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci	{ 0x01051805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #1" },
29062306a36Sopenharmony_ci	{ 0x01061805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #2" },
29162306a36Sopenharmony_ci	{ 0x01071805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #3" },
29262306a36Sopenharmony_ci	{ 0x01081805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #4" },
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	{ 0x15409511, BTTV_BOARD_ACORP_Y878F, "Acorp Y878F" },
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	{ 0x53534149, BTTV_BOARD_SSAI_SECURITY, "SSAI Security Video Interface" },
29762306a36Sopenharmony_ci	{ 0x5353414a, BTTV_BOARD_SSAI_ULTRASOUND, "SSAI Ultrasound Video Interface" },
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci	/* likely broken, vendor id doesn't match the other magic views ...
30062306a36Sopenharmony_ci	 * { 0xa0fca04f, BTTV_BOARD_MAGICTVIEW063, "Guillemot Maxi TV Video 3" }, */
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	/* Duplicate PCI ID, reconfigure for this board during the eeprom read.
30362306a36Sopenharmony_ci	* { 0x13eb0070, BTTV_BOARD_HAUPPAUGE_IMPACTVCB,  "Hauppauge ImpactVCB" }, */
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci	{ 0x109e036e, BTTV_BOARD_CONCEPTRONIC_CTVFMI2,	"Conceptronic CTVFMi v2"},
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	/* DVB cards (using pci function .1 for mpeg data xfer) */
30862306a36Sopenharmony_ci	{ 0x001c11bd, BTTV_BOARD_PINNACLESAT,   "Pinnacle PCTV Sat" },
30962306a36Sopenharmony_ci	{ 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" },
31062306a36Sopenharmony_ci	{ 0x20007063, BTTV_BOARD_PC_HDTV,       "pcHDTV HD-2000 TV"},
31162306a36Sopenharmony_ci	{ 0x002611bd, BTTV_BOARD_TWINHAN_DST,   "Pinnacle PCTV SAT CI" },
31262306a36Sopenharmony_ci	{ 0x00011822, BTTV_BOARD_TWINHAN_DST,   "Twinhan VisionPlus DVB" },
31362306a36Sopenharmony_ci	{ 0xfc00270f, BTTV_BOARD_TWINHAN_DST,   "ChainTech digitop DST-1000 DVB-S" },
31462306a36Sopenharmony_ci	{ 0x07711461, BTTV_BOARD_AVDVBT_771,    "AVermedia AverTV DVB-T 771" },
31562306a36Sopenharmony_ci	{ 0x07611461, BTTV_BOARD_AVDVBT_761,    "AverMedia AverTV DVB-T 761" },
31662306a36Sopenharmony_ci	{ 0xdb1018ac, BTTV_BOARD_DVICO_DVBT_LITE,    "DViCO FusionHDTV DVB-T Lite" },
31762306a36Sopenharmony_ci	{ 0xdb1118ac, BTTV_BOARD_DVICO_DVBT_LITE,    "Ultraview DVB-T Lite" },
31862306a36Sopenharmony_ci	{ 0xd50018ac, BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE,    "DViCO FusionHDTV 5 Lite" },
31962306a36Sopenharmony_ci	{ 0x00261822, BTTV_BOARD_TWINHAN_DST,	"DNTV Live! Mini "},
32062306a36Sopenharmony_ci	{ 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2,	"DViCO FusionHDTV 2" },
32162306a36Sopenharmony_ci	{ 0x763c008a, BTTV_BOARD_GEOVISION_GV600,	"GeoVision GV-600" },
32262306a36Sopenharmony_ci	{ 0x18011000, BTTV_BOARD_ENLTV_FM_2,	"Encore ENL TV-FM-2" },
32362306a36Sopenharmony_ci	{ 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S) (master)" },
32462306a36Sopenharmony_ci	{ 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL,	"GeoVision GV-800(S) (slave)" },
32562306a36Sopenharmony_ci	{ 0x763d800c, BTTV_BOARD_GEOVISION_GV800S_SL,	"GeoVision GV-800(S) (slave)" },
32662306a36Sopenharmony_ci	{ 0x763d800d, BTTV_BOARD_GEOVISION_GV800S_SL,	"GeoVision GV-800(S) (slave)" },
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci	{ 0x15401830, BTTV_BOARD_PV183,         "Provideo PV183-1" },
32962306a36Sopenharmony_ci	{ 0x15401831, BTTV_BOARD_PV183,         "Provideo PV183-2" },
33062306a36Sopenharmony_ci	{ 0x15401832, BTTV_BOARD_PV183,         "Provideo PV183-3" },
33162306a36Sopenharmony_ci	{ 0x15401833, BTTV_BOARD_PV183,         "Provideo PV183-4" },
33262306a36Sopenharmony_ci	{ 0x15401834, BTTV_BOARD_PV183,         "Provideo PV183-5" },
33362306a36Sopenharmony_ci	{ 0x15401835, BTTV_BOARD_PV183,         "Provideo PV183-6" },
33462306a36Sopenharmony_ci	{ 0x15401836, BTTV_BOARD_PV183,         "Provideo PV183-7" },
33562306a36Sopenharmony_ci	{ 0x15401837, BTTV_BOARD_PV183,         "Provideo PV183-8" },
33662306a36Sopenharmony_ci	{ 0x3116f200, BTTV_BOARD_TVT_TD3116,	"Tongwei Video Technology TD-3116" },
33762306a36Sopenharmony_ci	{ 0x02280279, BTTV_BOARD_APOSONIC_WDVR, "Aposonic W-DVR" },
33862306a36Sopenharmony_ci	{ 0, -1, NULL }
33962306a36Sopenharmony_ci};
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
34262306a36Sopenharmony_ci/* array with description for bt848 / bt878 tv/grabber cards               */
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_cistruct tvcard bttv_tvcards[] = {
34562306a36Sopenharmony_ci	/* ---- card 0x00 ---------------------------------- */
34662306a36Sopenharmony_ci	[BTTV_BOARD_UNKNOWN] = {
34762306a36Sopenharmony_ci		.name		= " *** UNKNOWN/GENERIC *** ",
34862306a36Sopenharmony_ci		.video_inputs	= 4,
34962306a36Sopenharmony_ci		.svhs		= 2,
35062306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0),
35162306a36Sopenharmony_ci		.tuner_type	= UNSET,
35262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
35362306a36Sopenharmony_ci	},
35462306a36Sopenharmony_ci	[BTTV_BOARD_MIRO] = {
35562306a36Sopenharmony_ci		.name		= "MIRO PCTV",
35662306a36Sopenharmony_ci		.video_inputs	= 4,
35762306a36Sopenharmony_ci		/* .audio_inputs= 1, */
35862306a36Sopenharmony_ci		.svhs		= 2,
35962306a36Sopenharmony_ci		.gpiomask	= 15,
36062306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
36162306a36Sopenharmony_ci		.gpiomux	= { 2, 0, 0, 0 },
36262306a36Sopenharmony_ci		.gpiomute	= 10,
36362306a36Sopenharmony_ci		.tuner_type	= UNSET,
36462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
36562306a36Sopenharmony_ci	},
36662306a36Sopenharmony_ci	[BTTV_BOARD_HAUPPAUGE] = {
36762306a36Sopenharmony_ci		.name		= "Hauppauge (bt848)",
36862306a36Sopenharmony_ci		.video_inputs	= 4,
36962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
37062306a36Sopenharmony_ci		.svhs		= 2,
37162306a36Sopenharmony_ci		.gpiomask	= 7,
37262306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
37362306a36Sopenharmony_ci		.gpiomux	= { 0, 1, 2, 3 },
37462306a36Sopenharmony_ci		.gpiomute	= 4,
37562306a36Sopenharmony_ci		.tuner_type	= UNSET,
37662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
37762306a36Sopenharmony_ci	},
37862306a36Sopenharmony_ci	[BTTV_BOARD_STB] = {
37962306a36Sopenharmony_ci		.name		= "STB, Gateway P/N 6000699 (bt848)",
38062306a36Sopenharmony_ci		.video_inputs	= 3,
38162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
38262306a36Sopenharmony_ci		.svhs		= 2,
38362306a36Sopenharmony_ci		.gpiomask	= 7,
38462306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
38562306a36Sopenharmony_ci		.gpiomux	= { 4, 0, 2, 3 },
38662306a36Sopenharmony_ci		.gpiomute	= 1,
38762306a36Sopenharmony_ci		.no_msp34xx	= 1,
38862306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_NTSC,
38962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
39062306a36Sopenharmony_ci		.pll            = PLL_28,
39162306a36Sopenharmony_ci		.has_radio      = 1,
39262306a36Sopenharmony_ci	},
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	/* ---- card 0x04 ---------------------------------- */
39562306a36Sopenharmony_ci	[BTTV_BOARD_INTEL] = {
39662306a36Sopenharmony_ci		.name		= "Intel Create and Share PCI/ Smart Video Recorder III",
39762306a36Sopenharmony_ci		.video_inputs	= 4,
39862306a36Sopenharmony_ci		/* .audio_inputs= 0, */
39962306a36Sopenharmony_ci		.svhs		= 2,
40062306a36Sopenharmony_ci		.gpiomask	= 0,
40162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
40262306a36Sopenharmony_ci		.gpiomux	= { 0 },
40362306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
40462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
40562306a36Sopenharmony_ci	},
40662306a36Sopenharmony_ci	[BTTV_BOARD_DIAMOND] = {
40762306a36Sopenharmony_ci		.name		= "Diamond DTV2000",
40862306a36Sopenharmony_ci		.video_inputs	= 4,
40962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
41062306a36Sopenharmony_ci		.svhs		= 2,
41162306a36Sopenharmony_ci		.gpiomask	= 3,
41262306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0),
41362306a36Sopenharmony_ci		.gpiomux	= { 0, 1, 0, 1 },
41462306a36Sopenharmony_ci		.gpiomute	= 3,
41562306a36Sopenharmony_ci		.tuner_type	= UNSET,
41662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
41762306a36Sopenharmony_ci	},
41862306a36Sopenharmony_ci	[BTTV_BOARD_AVERMEDIA] = {
41962306a36Sopenharmony_ci		.name		= "AVerMedia TVPhone",
42062306a36Sopenharmony_ci		.video_inputs	= 3,
42162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
42262306a36Sopenharmony_ci		.svhs		= 3,
42362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
42462306a36Sopenharmony_ci		.gpiomask	= 0x0f,
42562306a36Sopenharmony_ci		.gpiomux	= { 0x0c, 0x04, 0x08, 0x04 },
42662306a36Sopenharmony_ci		/*                0x04 for some cards ?? */
42762306a36Sopenharmony_ci		.tuner_type	= UNSET,
42862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
42962306a36Sopenharmony_ci		.audio_mode_gpio= avermedia_tvphone_audio,
43062306a36Sopenharmony_ci		.has_remote     = 1,
43162306a36Sopenharmony_ci	},
43262306a36Sopenharmony_ci	[BTTV_BOARD_MATRIX_VISION] = {
43362306a36Sopenharmony_ci		.name		= "MATRIX-Vision MV-Delta",
43462306a36Sopenharmony_ci		.video_inputs	= 5,
43562306a36Sopenharmony_ci		/* .audio_inputs= 1, */
43662306a36Sopenharmony_ci		.svhs		= 3,
43762306a36Sopenharmony_ci		.gpiomask	= 0,
43862306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0, 0),
43962306a36Sopenharmony_ci		.gpiomux	= { 0 },
44062306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
44162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
44262306a36Sopenharmony_ci	},
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci	/* ---- card 0x08 ---------------------------------- */
44562306a36Sopenharmony_ci	[BTTV_BOARD_FLYVIDEO] = {
44662306a36Sopenharmony_ci		.name		= "Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26",
44762306a36Sopenharmony_ci		.video_inputs	= 4,
44862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
44962306a36Sopenharmony_ci		.svhs		= 2,
45062306a36Sopenharmony_ci		.gpiomask	= 0xc00,
45162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
45262306a36Sopenharmony_ci		.gpiomux	= { 0, 0xc00, 0x800, 0x400 },
45362306a36Sopenharmony_ci		.gpiomute	= 0xc00,
45462306a36Sopenharmony_ci		.pll		= PLL_28,
45562306a36Sopenharmony_ci		.tuner_type	= UNSET,
45662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
45762306a36Sopenharmony_ci	},
45862306a36Sopenharmony_ci	[BTTV_BOARD_TURBOTV] = {
45962306a36Sopenharmony_ci		.name		= "IMS/IXmicro TurboTV",
46062306a36Sopenharmony_ci		.video_inputs	= 3,
46162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
46262306a36Sopenharmony_ci		.svhs		= 2,
46362306a36Sopenharmony_ci		.gpiomask	= 3,
46462306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
46562306a36Sopenharmony_ci		.gpiomux	= { 1, 1, 2, 3 },
46662306a36Sopenharmony_ci		.pll		= PLL_28,
46762306a36Sopenharmony_ci		.tuner_type	= TUNER_TEMIC_PAL,
46862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
46962306a36Sopenharmony_ci	},
47062306a36Sopenharmony_ci	[BTTV_BOARD_HAUPPAUGE878] = {
47162306a36Sopenharmony_ci		.name		= "Hauppauge (bt878)",
47262306a36Sopenharmony_ci		.video_inputs	= 4,
47362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
47462306a36Sopenharmony_ci		.svhs		= 2,
47562306a36Sopenharmony_ci		.gpiomask	= 0x0f, /* old: 7 */
47662306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 0, 1, 1),
47762306a36Sopenharmony_ci		.gpiomux	= { 0, 1, 2, 3 },
47862306a36Sopenharmony_ci		.gpiomute	= 4,
47962306a36Sopenharmony_ci		.pll		= PLL_28,
48062306a36Sopenharmony_ci		.tuner_type	= UNSET,
48162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
48262306a36Sopenharmony_ci	},
48362306a36Sopenharmony_ci	[BTTV_BOARD_MIROPRO] = {
48462306a36Sopenharmony_ci		.name		= "MIRO PCTV pro",
48562306a36Sopenharmony_ci		.video_inputs	= 3,
48662306a36Sopenharmony_ci		/* .audio_inputs= 1, */
48762306a36Sopenharmony_ci		.svhs		= 2,
48862306a36Sopenharmony_ci		.gpiomask	= 0x3014f,
48962306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
49062306a36Sopenharmony_ci		.gpiomux	= { 0x20001,0x10001, 0, 0 },
49162306a36Sopenharmony_ci		.gpiomute	= 10,
49262306a36Sopenharmony_ci		.tuner_type	= UNSET,
49362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
49462306a36Sopenharmony_ci	},
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci	/* ---- card 0x0c ---------------------------------- */
49762306a36Sopenharmony_ci	[BTTV_BOARD_ADSTECH_TV] = {
49862306a36Sopenharmony_ci		.name		= "ADS Technologies Channel Surfer TV (bt848)",
49962306a36Sopenharmony_ci		.video_inputs	= 3,
50062306a36Sopenharmony_ci		/* .audio_inputs= 1, */
50162306a36Sopenharmony_ci		.svhs		= 2,
50262306a36Sopenharmony_ci		.gpiomask	= 15,
50362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
50462306a36Sopenharmony_ci		.gpiomux	= { 13, 14, 11, 7 },
50562306a36Sopenharmony_ci		.tuner_type	= UNSET,
50662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
50762306a36Sopenharmony_ci	},
50862306a36Sopenharmony_ci	[BTTV_BOARD_AVERMEDIA98] = {
50962306a36Sopenharmony_ci		.name		= "AVerMedia TVCapture 98",
51062306a36Sopenharmony_ci		.video_inputs	= 3,
51162306a36Sopenharmony_ci		/* .audio_inputs= 4, */
51262306a36Sopenharmony_ci		.svhs		= 2,
51362306a36Sopenharmony_ci		.gpiomask	= 15,
51462306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
51562306a36Sopenharmony_ci		.gpiomux	= { 13, 14, 11, 7 },
51662306a36Sopenharmony_ci		.msp34xx_alt    = 1,
51762306a36Sopenharmony_ci		.pll		= PLL_28,
51862306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL,
51962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
52062306a36Sopenharmony_ci		.audio_mode_gpio= avermedia_tv_stereo_audio,
52162306a36Sopenharmony_ci		.no_gpioirq     = 1,
52262306a36Sopenharmony_ci	},
52362306a36Sopenharmony_ci	[BTTV_BOARD_VHX] = {
52462306a36Sopenharmony_ci		.name		= "Aimslab Video Highway Xtreme (VHX)",
52562306a36Sopenharmony_ci		.video_inputs	= 3,
52662306a36Sopenharmony_ci		/* .audio_inputs= 1, */
52762306a36Sopenharmony_ci		.svhs		= 2,
52862306a36Sopenharmony_ci		.gpiomask	= 7,
52962306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
53062306a36Sopenharmony_ci		.gpiomux	= { 0, 2, 1, 3 }, /* old: {0, 1, 2, 3, 4} */
53162306a36Sopenharmony_ci		.gpiomute	= 4,
53262306a36Sopenharmony_ci		.pll		= PLL_28,
53362306a36Sopenharmony_ci		.tuner_type	= UNSET,
53462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
53562306a36Sopenharmony_ci	},
53662306a36Sopenharmony_ci	[BTTV_BOARD_ZOLTRIX] = {
53762306a36Sopenharmony_ci		.name		= "Zoltrix TV-Max",
53862306a36Sopenharmony_ci		.video_inputs	= 3,
53962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
54062306a36Sopenharmony_ci		.svhs		= 2,
54162306a36Sopenharmony_ci		.gpiomask	= 15,
54262306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
54362306a36Sopenharmony_ci		.gpiomux	= { 0, 0, 1, 0 },
54462306a36Sopenharmony_ci		.gpiomute	= 10,
54562306a36Sopenharmony_ci		.tuner_type	= UNSET,
54662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
54762306a36Sopenharmony_ci	},
54862306a36Sopenharmony_ci
54962306a36Sopenharmony_ci	/* ---- card 0x10 ---------------------------------- */
55062306a36Sopenharmony_ci	[BTTV_BOARD_PIXVIEWPLAYTV] = {
55162306a36Sopenharmony_ci		.name		= "Prolink Pixelview PlayTV (bt878)",
55262306a36Sopenharmony_ci		.video_inputs	= 3,
55362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
55462306a36Sopenharmony_ci		.svhs		= 2,
55562306a36Sopenharmony_ci		.gpiomask	= 0x01fe00,
55662306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
55762306a36Sopenharmony_ci		/* 2003-10-20 by "Anton A. Arapov" <arapov@mail.ru> */
55862306a36Sopenharmony_ci		.gpiomux        = { 0x001e00, 0, 0x018000, 0x014000 },
55962306a36Sopenharmony_ci		.gpiomute	= 0x002000,
56062306a36Sopenharmony_ci		.pll		= PLL_28,
56162306a36Sopenharmony_ci		.tuner_type	= UNSET,
56262306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
56362306a36Sopenharmony_ci	},
56462306a36Sopenharmony_ci	[BTTV_BOARD_WINVIEW_601] = {
56562306a36Sopenharmony_ci		.name		= "Leadtek WinView 601",
56662306a36Sopenharmony_ci		.video_inputs	= 3,
56762306a36Sopenharmony_ci		/* .audio_inputs= 1, */
56862306a36Sopenharmony_ci		.svhs		= 2,
56962306a36Sopenharmony_ci		.gpiomask	= 0x8300f8,
57062306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1, 0),
57162306a36Sopenharmony_ci		.gpiomux	= { 0x4fa007,0xcfa007,0xcfa007,0xcfa007 },
57262306a36Sopenharmony_ci		.gpiomute	= 0xcfa007,
57362306a36Sopenharmony_ci		.tuner_type	= UNSET,
57462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
57562306a36Sopenharmony_ci		.volume_gpio	= winview_volume,
57662306a36Sopenharmony_ci		.has_radio	= 1,
57762306a36Sopenharmony_ci	},
57862306a36Sopenharmony_ci	[BTTV_BOARD_AVEC_INTERCAP] = {
57962306a36Sopenharmony_ci		.name		= "AVEC Intercapture",
58062306a36Sopenharmony_ci		.video_inputs	= 3,
58162306a36Sopenharmony_ci		/* .audio_inputs= 2, */
58262306a36Sopenharmony_ci		.svhs		= 2,
58362306a36Sopenharmony_ci		.gpiomask	= 0,
58462306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
58562306a36Sopenharmony_ci		.gpiomux	= { 1, 0, 0, 0 },
58662306a36Sopenharmony_ci		.tuner_type	= UNSET,
58762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
58862306a36Sopenharmony_ci	},
58962306a36Sopenharmony_ci	[BTTV_BOARD_LIFE_FLYKIT] = {
59062306a36Sopenharmony_ci		.name		= "Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)",
59162306a36Sopenharmony_ci		.video_inputs	= 4,
59262306a36Sopenharmony_ci		/* .audio_inputs= 1, */
59362306a36Sopenharmony_ci		.svhs		= NO_SVHS,
59462306a36Sopenharmony_ci		.gpiomask	= 0x8dff00,
59562306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
59662306a36Sopenharmony_ci		.gpiomux	= { 0 },
59762306a36Sopenharmony_ci		.no_msp34xx	= 1,
59862306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
59962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
60062306a36Sopenharmony_ci	},
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ci	/* ---- card 0x14 ---------------------------------- */
60362306a36Sopenharmony_ci	[BTTV_BOARD_CEI_RAFFLES] = {
60462306a36Sopenharmony_ci		.name		= "CEI Raffles Card",
60562306a36Sopenharmony_ci		.video_inputs	= 3,
60662306a36Sopenharmony_ci		/* .audio_inputs= 3, */
60762306a36Sopenharmony_ci		.svhs		= 2,
60862306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
60962306a36Sopenharmony_ci		.tuner_type	= UNSET,
61062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
61162306a36Sopenharmony_ci	},
61262306a36Sopenharmony_ci	[BTTV_BOARD_CONFERENCETV] = {
61362306a36Sopenharmony_ci		.name		= "Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50",
61462306a36Sopenharmony_ci		.video_inputs	= 4,
61562306a36Sopenharmony_ci		/* .audio_inputs= 2,  tuner, line in */
61662306a36Sopenharmony_ci		.svhs		= 2,
61762306a36Sopenharmony_ci		.gpiomask	= 0x1800,
61862306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
61962306a36Sopenharmony_ci		.gpiomux	= { 0, 0x800, 0x1000, 0x1000 },
62062306a36Sopenharmony_ci		.gpiomute	= 0x1800,
62162306a36Sopenharmony_ci		.pll		= PLL_28,
62262306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL_I,
62362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
62462306a36Sopenharmony_ci	},
62562306a36Sopenharmony_ci	[BTTV_BOARD_PHOEBE_TVMAS] = {
62662306a36Sopenharmony_ci		.name		= "Askey CPH050/ Phoebe Tv Master + FM",
62762306a36Sopenharmony_ci		.video_inputs	= 3,
62862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
62962306a36Sopenharmony_ci		.svhs		= 2,
63062306a36Sopenharmony_ci		.gpiomask	= 0xc00,
63162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
63262306a36Sopenharmony_ci		.gpiomux	= { 0, 1, 0x800, 0x400 },
63362306a36Sopenharmony_ci		.gpiomute	= 0xc00,
63462306a36Sopenharmony_ci		.pll		= PLL_28,
63562306a36Sopenharmony_ci		.tuner_type	= UNSET,
63662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
63762306a36Sopenharmony_ci	},
63862306a36Sopenharmony_ci	[BTTV_BOARD_MODTEC_205] = {
63962306a36Sopenharmony_ci		.name		= "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878",
64062306a36Sopenharmony_ci		.video_inputs	= 3,
64162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
64262306a36Sopenharmony_ci		.svhs		= NO_SVHS,
64362306a36Sopenharmony_ci		.has_dig_in	= 1,
64462306a36Sopenharmony_ci		.gpiomask	= 7,
64562306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 0), /* input 2 is digital */
64662306a36Sopenharmony_ci		/* .digital_mode= DIGITAL_MODE_CAMERA, */
64762306a36Sopenharmony_ci		.gpiomux	= { 0, 0, 0, 0 },
64862306a36Sopenharmony_ci		.no_msp34xx	= 1,
64962306a36Sopenharmony_ci		.pll            = PLL_28,
65062306a36Sopenharmony_ci		.tuner_type     = TUNER_ALPS_TSBB5_PAL_I,
65162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
65262306a36Sopenharmony_ci	},
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci	/* ---- card 0x18 ---------------------------------- */
65562306a36Sopenharmony_ci	[BTTV_BOARD_MAGICTVIEW061] = {
65662306a36Sopenharmony_ci		.name		= "Askey CPH05X/06X (bt878) [many vendors]",
65762306a36Sopenharmony_ci		.video_inputs	= 3,
65862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
65962306a36Sopenharmony_ci		.svhs		= 2,
66062306a36Sopenharmony_ci		.gpiomask	= 0xe00,
66162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
66262306a36Sopenharmony_ci		.gpiomux	= {0x400, 0x400, 0x400, 0x400 },
66362306a36Sopenharmony_ci		.gpiomute	= 0xc00,
66462306a36Sopenharmony_ci		.pll		= PLL_28,
66562306a36Sopenharmony_ci		.tuner_type	= UNSET,
66662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
66762306a36Sopenharmony_ci		.has_remote     = 1,
66862306a36Sopenharmony_ci		.has_radio	= 1,  /* not every card has radio */
66962306a36Sopenharmony_ci	},
67062306a36Sopenharmony_ci	[BTTV_BOARD_VOBIS_BOOSTAR] = {
67162306a36Sopenharmony_ci		.name           = "Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar",
67262306a36Sopenharmony_ci		.video_inputs	= 3,
67362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
67462306a36Sopenharmony_ci		.svhs		= 2,
67562306a36Sopenharmony_ci		.gpiomask       = 0x1f0fff,
67662306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
67762306a36Sopenharmony_ci		.gpiomux        = { 0x20000, 0x30000, 0x10000, 0 },
67862306a36Sopenharmony_ci		.gpiomute	= 0x40000,
67962306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL,
68062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
68162306a36Sopenharmony_ci		.audio_mode_gpio= terratv_audio,
68262306a36Sopenharmony_ci	},
68362306a36Sopenharmony_ci	[BTTV_BOARD_HAUPPAUG_WCAM] = {
68462306a36Sopenharmony_ci		.name		= "Hauppauge WinCam newer (bt878)",
68562306a36Sopenharmony_ci		.video_inputs	= 4,
68662306a36Sopenharmony_ci		/* .audio_inputs= 1, */
68762306a36Sopenharmony_ci		.svhs		= 3,
68862306a36Sopenharmony_ci		.gpiomask	= 7,
68962306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 0, 1, 1),
69062306a36Sopenharmony_ci		.gpiomux	= { 0, 1, 2, 3 },
69162306a36Sopenharmony_ci		.gpiomute	= 4,
69262306a36Sopenharmony_ci		.tuner_type	= UNSET,
69362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
69462306a36Sopenharmony_ci	},
69562306a36Sopenharmony_ci	[BTTV_BOARD_MAXI] = {
69662306a36Sopenharmony_ci		.name		= "Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50",
69762306a36Sopenharmony_ci		.video_inputs	= 4,
69862306a36Sopenharmony_ci		/* .audio_inputs= 2, */
69962306a36Sopenharmony_ci		.svhs		= 2,
70062306a36Sopenharmony_ci		.gpiomask	= 0x1800,
70162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
70262306a36Sopenharmony_ci		.gpiomux	= { 0, 0x800, 0x1000, 0x1000 },
70362306a36Sopenharmony_ci		.gpiomute	= 0x1800,
70462306a36Sopenharmony_ci		.pll            = PLL_28,
70562306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_SECAM,
70662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
70762306a36Sopenharmony_ci	},
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ci	/* ---- card 0x1c ---------------------------------- */
71062306a36Sopenharmony_ci	[BTTV_BOARD_TERRATV] = {
71162306a36Sopenharmony_ci		.name           = "Terratec TerraTV+ Version 1.1 (bt878)",
71262306a36Sopenharmony_ci		.video_inputs	= 3,
71362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
71462306a36Sopenharmony_ci		.svhs		= 2,
71562306a36Sopenharmony_ci		.gpiomask	= 0x1f0fff,
71662306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
71762306a36Sopenharmony_ci		.gpiomux	= { 0x20000, 0x30000, 0x10000, 0x00000 },
71862306a36Sopenharmony_ci		.gpiomute	= 0x40000,
71962306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL,
72062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
72162306a36Sopenharmony_ci		.audio_mode_gpio= terratv_audio,
72262306a36Sopenharmony_ci		/* GPIO wiring:
72362306a36Sopenharmony_ci		External 20 pin connector (for Active Radio Upgrade board)
72462306a36Sopenharmony_ci		gpio00: i2c-sda
72562306a36Sopenharmony_ci		gpio01: i2c-scl
72662306a36Sopenharmony_ci		gpio02: om5610-data
72762306a36Sopenharmony_ci		gpio03: om5610-clk
72862306a36Sopenharmony_ci		gpio04: om5610-wre
72962306a36Sopenharmony_ci		gpio05: om5610-stereo
73062306a36Sopenharmony_ci		gpio06: rds6588-davn
73162306a36Sopenharmony_ci		gpio07: Pin 7 n.c.
73262306a36Sopenharmony_ci		gpio08: nIOW
73362306a36Sopenharmony_ci		gpio09+10: nIOR, nSEL ?? (bt878)
73462306a36Sopenharmony_ci			gpio09: nIOR (bt848)
73562306a36Sopenharmony_ci			gpio10: nSEL (bt848)
73662306a36Sopenharmony_ci		Sound Routing:
73762306a36Sopenharmony_ci		gpio16: u2-A0 (1st 4052bt)
73862306a36Sopenharmony_ci		gpio17: u2-A1
73962306a36Sopenharmony_ci		gpio18: u2-nEN
74062306a36Sopenharmony_ci		gpio19: u4-A0 (2nd 4052)
74162306a36Sopenharmony_ci		gpio20: u4-A1
74262306a36Sopenharmony_ci			u4-nEN - GND
74362306a36Sopenharmony_ci		Btspy:
74462306a36Sopenharmony_ci			00000 : Cdrom (internal audio input)
74562306a36Sopenharmony_ci			10000 : ext. Video audio input
74662306a36Sopenharmony_ci			20000 : TV Mono
74762306a36Sopenharmony_ci			a0000 : TV Mono/2
74862306a36Sopenharmony_ci		1a0000 : TV Stereo
74962306a36Sopenharmony_ci			30000 : Radio
75062306a36Sopenharmony_ci			40000 : Mute
75162306a36Sopenharmony_ci	*/
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_ci	},
75462306a36Sopenharmony_ci	[BTTV_BOARD_PXC200] = {
75562306a36Sopenharmony_ci		/* Jannik Fritsch <jannik@techfak.uni-bielefeld.de> */
75662306a36Sopenharmony_ci		.name		= "Imagenation PXC200",
75762306a36Sopenharmony_ci		.video_inputs	= 5,
75862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
75962306a36Sopenharmony_ci		.svhs		= 1, /* was: 4 */
76062306a36Sopenharmony_ci		.gpiomask	= 0,
76162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0, 0),
76262306a36Sopenharmony_ci		.gpiomux	= { 0 },
76362306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
76462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
76562306a36Sopenharmony_ci		.muxsel_hook    = PXC200_muxsel,
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci	},
76862306a36Sopenharmony_ci	[BTTV_BOARD_FLYVIDEO_98] = {
76962306a36Sopenharmony_ci		.name		= "Lifeview FlyVideo 98 LR50",
77062306a36Sopenharmony_ci		.video_inputs	= 4,
77162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
77262306a36Sopenharmony_ci		.svhs		= 2,
77362306a36Sopenharmony_ci		.gpiomask	= 0x1800,  /* 0x8dfe00 */
77462306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
77562306a36Sopenharmony_ci		.gpiomux	= { 0, 0x0800, 0x1000, 0x1000 },
77662306a36Sopenharmony_ci		.gpiomute	= 0x1800,
77762306a36Sopenharmony_ci		.pll            = PLL_28,
77862306a36Sopenharmony_ci		.tuner_type	= UNSET,
77962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
78062306a36Sopenharmony_ci	},
78162306a36Sopenharmony_ci	[BTTV_BOARD_IPROTV] = {
78262306a36Sopenharmony_ci		.name		= "Formac iProTV, Formac ProTV I (bt848)",
78362306a36Sopenharmony_ci		.video_inputs	= 4,
78462306a36Sopenharmony_ci		/* .audio_inputs= 1, */
78562306a36Sopenharmony_ci		.svhs		= 3,
78662306a36Sopenharmony_ci		.gpiomask	= 1,
78762306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
78862306a36Sopenharmony_ci		.gpiomux	= { 1, 0, 0, 0 },
78962306a36Sopenharmony_ci		.pll            = PLL_28,
79062306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL,
79162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
79262306a36Sopenharmony_ci	},
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_ci	/* ---- card 0x20 ---------------------------------- */
79562306a36Sopenharmony_ci	[BTTV_BOARD_INTEL_C_S_PCI] = {
79662306a36Sopenharmony_ci		.name		= "Intel Create and Share PCI/ Smart Video Recorder III",
79762306a36Sopenharmony_ci		.video_inputs	= 4,
79862306a36Sopenharmony_ci		/* .audio_inputs= 0, */
79962306a36Sopenharmony_ci		.svhs		= 2,
80062306a36Sopenharmony_ci		.gpiomask	= 0,
80162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
80262306a36Sopenharmony_ci		.gpiomux	= { 0 },
80362306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
80462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
80562306a36Sopenharmony_ci	},
80662306a36Sopenharmony_ci	[BTTV_BOARD_TERRATVALUE] = {
80762306a36Sopenharmony_ci		.name           = "Terratec TerraTValue Version Bt878",
80862306a36Sopenharmony_ci		.video_inputs	= 3,
80962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
81062306a36Sopenharmony_ci		.svhs		= 2,
81162306a36Sopenharmony_ci		.gpiomask	= 0xffff00,
81262306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
81362306a36Sopenharmony_ci		.gpiomux	= { 0x500, 0, 0x300, 0x900 },
81462306a36Sopenharmony_ci		.gpiomute	= 0x900,
81562306a36Sopenharmony_ci		.pll		= PLL_28,
81662306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL,
81762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
81862306a36Sopenharmony_ci	},
81962306a36Sopenharmony_ci	[BTTV_BOARD_WINFAST2000] = {
82062306a36Sopenharmony_ci		.name		= "Leadtek WinFast 2000/ WinFast 2000 XP",
82162306a36Sopenharmony_ci		.video_inputs	= 4,
82262306a36Sopenharmony_ci		/* .audio_inputs= 1, */
82362306a36Sopenharmony_ci		.svhs		= 2,
82462306a36Sopenharmony_ci		/* TV, CVid, SVid, CVid over SVid connector */
82562306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1, 0),
82662306a36Sopenharmony_ci		/* Alexander Varakin <avarakin@hotmail.com> [stereo version] */
82762306a36Sopenharmony_ci		.gpiomask	= 0xb33000,
82862306a36Sopenharmony_ci		.gpiomux	= { 0x122000,0x1000,0x0000,0x620000 },
82962306a36Sopenharmony_ci		.gpiomute	= 0x800000,
83062306a36Sopenharmony_ci		/* Audio Routing for "WinFast 2000 XP" (no tv stereo !)
83162306a36Sopenharmony_ci			gpio23 -- hef4052:nEnable (0x800000)
83262306a36Sopenharmony_ci			gpio12 -- hef4052:A1
83362306a36Sopenharmony_ci			gpio13 -- hef4052:A0
83462306a36Sopenharmony_ci		0x0000: external audio
83562306a36Sopenharmony_ci		0x1000: FM
83662306a36Sopenharmony_ci		0x2000: TV
83762306a36Sopenharmony_ci		0x3000: n.c.
83862306a36Sopenharmony_ci		Note: There exists another variant "Winfast 2000" with tv stereo !?
83962306a36Sopenharmony_ci		Note: eeprom only contains FF and pci subsystem id 107d:6606
84062306a36Sopenharmony_ci		*/
84162306a36Sopenharmony_ci		.pll		= PLL_28,
84262306a36Sopenharmony_ci		.has_radio	= 1,
84362306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL, /* default for now, gpio reads BFFF06 for Pal bg+dk */
84462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
84562306a36Sopenharmony_ci		.audio_mode_gpio= winfast2000_audio,
84662306a36Sopenharmony_ci		.has_remote     = 1,
84762306a36Sopenharmony_ci	},
84862306a36Sopenharmony_ci	[BTTV_BOARD_CHRONOS_VS2] = {
84962306a36Sopenharmony_ci		.name		= "Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II",
85062306a36Sopenharmony_ci		.video_inputs	= 4,
85162306a36Sopenharmony_ci		/* .audio_inputs= 3, */
85262306a36Sopenharmony_ci		.svhs		= 2,
85362306a36Sopenharmony_ci		.gpiomask	= 0x1800,
85462306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
85562306a36Sopenharmony_ci		.gpiomux	= { 0, 0x800, 0x1000, 0x1000 },
85662306a36Sopenharmony_ci		.gpiomute	= 0x1800,
85762306a36Sopenharmony_ci		.pll		= PLL_28,
85862306a36Sopenharmony_ci		.tuner_type	= UNSET,
85962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
86062306a36Sopenharmony_ci	},
86162306a36Sopenharmony_ci
86262306a36Sopenharmony_ci	/* ---- card 0x24 ---------------------------------- */
86362306a36Sopenharmony_ci	[BTTV_BOARD_TYPHOON_TVIEW] = {
86462306a36Sopenharmony_ci		.name		= "Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner",
86562306a36Sopenharmony_ci		.video_inputs	= 4,
86662306a36Sopenharmony_ci		/* .audio_inputs= 3, */
86762306a36Sopenharmony_ci		.svhs		= 2,
86862306a36Sopenharmony_ci		.gpiomask	= 0x1800,
86962306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
87062306a36Sopenharmony_ci		.gpiomux	= { 0, 0x800, 0x1000, 0x1000 },
87162306a36Sopenharmony_ci		.gpiomute	= 0x1800,
87262306a36Sopenharmony_ci		.pll		= PLL_28,
87362306a36Sopenharmony_ci		.tuner_type	= UNSET,
87462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
87562306a36Sopenharmony_ci		.has_radio	= 1,
87662306a36Sopenharmony_ci	},
87762306a36Sopenharmony_ci	[BTTV_BOARD_PXELVWPLTVPRO] = {
87862306a36Sopenharmony_ci		.name		= "Prolink PixelView PlayTV pro",
87962306a36Sopenharmony_ci		.video_inputs	= 3,
88062306a36Sopenharmony_ci		/* .audio_inputs= 1, */
88162306a36Sopenharmony_ci		.svhs		= 2,
88262306a36Sopenharmony_ci		.gpiomask	= 0xff,
88362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
88462306a36Sopenharmony_ci		.gpiomux	= { 0x21, 0x20, 0x24, 0x2c },
88562306a36Sopenharmony_ci		.gpiomute	= 0x29,
88662306a36Sopenharmony_ci		.no_msp34xx	= 1,
88762306a36Sopenharmony_ci		.pll		= PLL_28,
88862306a36Sopenharmony_ci		.tuner_type	= UNSET,
88962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
89062306a36Sopenharmony_ci	},
89162306a36Sopenharmony_ci	[BTTV_BOARD_MAGICTVIEW063] = {
89262306a36Sopenharmony_ci		.name		= "Askey CPH06X TView99",
89362306a36Sopenharmony_ci		.video_inputs	= 4,
89462306a36Sopenharmony_ci		/* .audio_inputs= 1, */
89562306a36Sopenharmony_ci		.svhs		= 2,
89662306a36Sopenharmony_ci		.gpiomask	= 0x551e00,
89762306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0),
89862306a36Sopenharmony_ci		.gpiomux	= { 0x551400, 0x551200, 0, 0 },
89962306a36Sopenharmony_ci		.gpiomute	= 0x551c00,
90062306a36Sopenharmony_ci		.pll		= PLL_28,
90162306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL_I,
90262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
90362306a36Sopenharmony_ci		.has_remote     = 1,
90462306a36Sopenharmony_ci	},
90562306a36Sopenharmony_ci	[BTTV_BOARD_PINNACLE] = {
90662306a36Sopenharmony_ci		.name		= "Pinnacle PCTV Studio/Rave",
90762306a36Sopenharmony_ci		.video_inputs	= 3,
90862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
90962306a36Sopenharmony_ci		.svhs		= 2,
91062306a36Sopenharmony_ci		.gpiomask	= 0x03000F,
91162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
91262306a36Sopenharmony_ci		.gpiomux	= { 2, 0xd0001, 0, 0 },
91362306a36Sopenharmony_ci		.gpiomute	= 1,
91462306a36Sopenharmony_ci		.pll		= PLL_28,
91562306a36Sopenharmony_ci		.tuner_type	= UNSET,
91662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
91762306a36Sopenharmony_ci	},
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_ci	/* ---- card 0x28 ---------------------------------- */
92062306a36Sopenharmony_ci	[BTTV_BOARD_STB2] = {
92162306a36Sopenharmony_ci		.name		= "STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100",
92262306a36Sopenharmony_ci		.video_inputs	= 3,
92362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
92462306a36Sopenharmony_ci		.svhs		= 2,
92562306a36Sopenharmony_ci		.gpiomask	= 7,
92662306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
92762306a36Sopenharmony_ci		.gpiomux	= { 4, 0, 2, 3 },
92862306a36Sopenharmony_ci		.gpiomute	= 1,
92962306a36Sopenharmony_ci		.no_msp34xx	= 1,
93062306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_NTSC,
93162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
93262306a36Sopenharmony_ci		.pll            = PLL_28,
93362306a36Sopenharmony_ci		.has_radio      = 1,
93462306a36Sopenharmony_ci	},
93562306a36Sopenharmony_ci	[BTTV_BOARD_AVPHONE98] = {
93662306a36Sopenharmony_ci		.name		= "AVerMedia TVPhone 98",
93762306a36Sopenharmony_ci		.video_inputs	= 3,
93862306a36Sopenharmony_ci		/* .audio_inputs= 4, */
93962306a36Sopenharmony_ci		.svhs		= 2,
94062306a36Sopenharmony_ci		.gpiomask	= 15,
94162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
94262306a36Sopenharmony_ci		.gpiomux	= { 13, 4, 11, 7 },
94362306a36Sopenharmony_ci		.pll		= PLL_28,
94462306a36Sopenharmony_ci		.tuner_type	= UNSET,
94562306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
94662306a36Sopenharmony_ci		.has_radio	= 1,
94762306a36Sopenharmony_ci		.audio_mode_gpio= avermedia_tvphone_audio,
94862306a36Sopenharmony_ci	},
94962306a36Sopenharmony_ci	[BTTV_BOARD_PV951] = {
95062306a36Sopenharmony_ci		.name		= "ProVideo PV951", /* pic16c54 */
95162306a36Sopenharmony_ci		.video_inputs	= 3,
95262306a36Sopenharmony_ci		/* .audio_inputs= 1, */
95362306a36Sopenharmony_ci		.svhs		= 2,
95462306a36Sopenharmony_ci		.gpiomask	= 0,
95562306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
95662306a36Sopenharmony_ci		.gpiomux	= { 0, 0, 0, 0},
95762306a36Sopenharmony_ci		.no_msp34xx	= 1,
95862306a36Sopenharmony_ci		.pll		= PLL_28,
95962306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL_I,
96062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
96162306a36Sopenharmony_ci	},
96262306a36Sopenharmony_ci	[BTTV_BOARD_ONAIR_TV] = {
96362306a36Sopenharmony_ci		.name		= "Little OnAir TV",
96462306a36Sopenharmony_ci		.video_inputs	= 3,
96562306a36Sopenharmony_ci		/* .audio_inputs= 1, */
96662306a36Sopenharmony_ci		.svhs		= 2,
96762306a36Sopenharmony_ci		.gpiomask	= 0xe00b,
96862306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
96962306a36Sopenharmony_ci		.gpiomux	= { 0xff9ff6, 0xff9ff6, 0xff1ff7, 0 },
97062306a36Sopenharmony_ci		.gpiomute	= 0xff3ffc,
97162306a36Sopenharmony_ci		.no_msp34xx	= 1,
97262306a36Sopenharmony_ci		.tuner_type	= UNSET,
97362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
97462306a36Sopenharmony_ci	},
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_ci	/* ---- card 0x2c ---------------------------------- */
97762306a36Sopenharmony_ci	[BTTV_BOARD_SIGMA_TVII_FM] = {
97862306a36Sopenharmony_ci		.name		= "Sigma TVII-FM",
97962306a36Sopenharmony_ci		.video_inputs	= 2,
98062306a36Sopenharmony_ci		/* .audio_inputs= 1, */
98162306a36Sopenharmony_ci		.svhs		= NO_SVHS,
98262306a36Sopenharmony_ci		.gpiomask	= 3,
98362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
98462306a36Sopenharmony_ci		.gpiomux	= { 1, 1, 0, 2 },
98562306a36Sopenharmony_ci		.gpiomute	= 3,
98662306a36Sopenharmony_ci		.no_msp34xx	= 1,
98762306a36Sopenharmony_ci		.pll		= PLL_NONE,
98862306a36Sopenharmony_ci		.tuner_type	= UNSET,
98962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
99062306a36Sopenharmony_ci	},
99162306a36Sopenharmony_ci	[BTTV_BOARD_MATRIX_VISION2] = {
99262306a36Sopenharmony_ci		.name		= "MATRIX-Vision MV-Delta 2",
99362306a36Sopenharmony_ci		.video_inputs	= 5,
99462306a36Sopenharmony_ci		/* .audio_inputs= 1, */
99562306a36Sopenharmony_ci		.svhs		= 3,
99662306a36Sopenharmony_ci		.gpiomask	= 0,
99762306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0, 0),
99862306a36Sopenharmony_ci		.gpiomux	= { 0 },
99962306a36Sopenharmony_ci		.no_msp34xx	= 1,
100062306a36Sopenharmony_ci		.pll		= PLL_28,
100162306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
100262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
100362306a36Sopenharmony_ci	},
100462306a36Sopenharmony_ci	[BTTV_BOARD_ZOLTRIX_GENIE] = {
100562306a36Sopenharmony_ci		.name		= "Zoltrix Genie TV/FM",
100662306a36Sopenharmony_ci		.video_inputs	= 3,
100762306a36Sopenharmony_ci		/* .audio_inputs= 1, */
100862306a36Sopenharmony_ci		.svhs		= 2,
100962306a36Sopenharmony_ci		.gpiomask	= 0xbcf03f,
101062306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
101162306a36Sopenharmony_ci		.gpiomux	= { 0xbc803f, 0xbc903f, 0xbcb03f, 0 },
101262306a36Sopenharmony_ci		.gpiomute	= 0xbcb03f,
101362306a36Sopenharmony_ci		.no_msp34xx	= 1,
101462306a36Sopenharmony_ci		.pll		= PLL_28,
101562306a36Sopenharmony_ci		.tuner_type	= TUNER_TEMIC_4039FR5_NTSC,
101662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
101762306a36Sopenharmony_ci	},
101862306a36Sopenharmony_ci	[BTTV_BOARD_TERRATVRADIO] = {
101962306a36Sopenharmony_ci		.name		= "Terratec TV/Radio+",
102062306a36Sopenharmony_ci		.video_inputs	= 3,
102162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
102262306a36Sopenharmony_ci		.svhs		= 2,
102362306a36Sopenharmony_ci		.gpiomask	= 0x70000,
102462306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
102562306a36Sopenharmony_ci		.gpiomux	= { 0x20000, 0x30000, 0x10000, 0 },
102662306a36Sopenharmony_ci		.gpiomute	= 0x40000,
102762306a36Sopenharmony_ci		.no_msp34xx	= 1,
102862306a36Sopenharmony_ci		.pll		= PLL_35,
102962306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL_I,
103062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
103162306a36Sopenharmony_ci		.has_radio	= 1,
103262306a36Sopenharmony_ci	},
103362306a36Sopenharmony_ci
103462306a36Sopenharmony_ci	/* ---- card 0x30 ---------------------------------- */
103562306a36Sopenharmony_ci	[BTTV_BOARD_DYNALINK] = {
103662306a36Sopenharmony_ci		.name		= "Askey CPH03x/ Dynalink Magic TView",
103762306a36Sopenharmony_ci		.video_inputs	= 3,
103862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
103962306a36Sopenharmony_ci		.svhs		= 2,
104062306a36Sopenharmony_ci		.gpiomask	= 15,
104162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
104262306a36Sopenharmony_ci		.gpiomux	= {2,0,0,0 },
104362306a36Sopenharmony_ci		.gpiomute	= 1,
104462306a36Sopenharmony_ci		.pll		= PLL_28,
104562306a36Sopenharmony_ci		.tuner_type	= UNSET,
104662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
104762306a36Sopenharmony_ci	},
104862306a36Sopenharmony_ci	[BTTV_BOARD_GVBCTV3PCI] = {
104962306a36Sopenharmony_ci		.name		= "IODATA GV-BCTV3/PCI",
105062306a36Sopenharmony_ci		.video_inputs	= 3,
105162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
105262306a36Sopenharmony_ci		.svhs		= 2,
105362306a36Sopenharmony_ci		.gpiomask	= 0x010f00,
105462306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 0, 0),
105562306a36Sopenharmony_ci		.gpiomux	= {0x10000, 0, 0x10000, 0 },
105662306a36Sopenharmony_ci		.no_msp34xx	= 1,
105762306a36Sopenharmony_ci		.pll		= PLL_28,
105862306a36Sopenharmony_ci		.tuner_type	= TUNER_ALPS_TSHC6_NTSC,
105962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
106062306a36Sopenharmony_ci		.audio_mode_gpio= gvbctv3pci_audio,
106162306a36Sopenharmony_ci	},
106262306a36Sopenharmony_ci	[BTTV_BOARD_PXELVWPLTVPAK] = {
106362306a36Sopenharmony_ci		.name		= "Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP",
106462306a36Sopenharmony_ci		.video_inputs	= 5,
106562306a36Sopenharmony_ci		/* .audio_inputs= 1, */
106662306a36Sopenharmony_ci		.svhs		= 3,
106762306a36Sopenharmony_ci		.has_dig_in	= 1,
106862306a36Sopenharmony_ci		.gpiomask	= 0xAA0000,
106962306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1, 0), /* in 4 is digital */
107062306a36Sopenharmony_ci		/* .digital_mode= DIGITAL_MODE_CAMERA, */
107162306a36Sopenharmony_ci		.gpiomux	= { 0x20000, 0, 0x80000, 0x80000 },
107262306a36Sopenharmony_ci		.gpiomute	= 0xa8000,
107362306a36Sopenharmony_ci		.no_msp34xx	= 1,
107462306a36Sopenharmony_ci		.pll		= PLL_28,
107562306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL_I,
107662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
107762306a36Sopenharmony_ci		.has_remote	= 1,
107862306a36Sopenharmony_ci		/* GPIO wiring: (different from Rev.4C !)
107962306a36Sopenharmony_ci			GPIO17: U4.A0 (first hef4052bt)
108062306a36Sopenharmony_ci			GPIO19: U4.A1
108162306a36Sopenharmony_ci			GPIO20: U5.A1 (second hef4052bt)
108262306a36Sopenharmony_ci			GPIO21: U4.nEN
108362306a36Sopenharmony_ci			GPIO22: BT832 Reset Line
108462306a36Sopenharmony_ci			GPIO23: A5,A0, U5,nEN
108562306a36Sopenharmony_ci		Note: At i2c=0x8a is a Bt832 chip, which changes to 0x88 after being reset via GPIO22
108662306a36Sopenharmony_ci		*/
108762306a36Sopenharmony_ci	},
108862306a36Sopenharmony_ci	[BTTV_BOARD_EAGLE] = {
108962306a36Sopenharmony_ci		.name           = "Eagle Wireless Capricorn2 (bt878A)",
109062306a36Sopenharmony_ci		.video_inputs   = 4,
109162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
109262306a36Sopenharmony_ci		.svhs           = 2,
109362306a36Sopenharmony_ci		.gpiomask       = 7,
109462306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 0, 1, 1),
109562306a36Sopenharmony_ci		.gpiomux        = { 0, 1, 2, 3 },
109662306a36Sopenharmony_ci		.gpiomute	= 4,
109762306a36Sopenharmony_ci		.pll            = PLL_28,
109862306a36Sopenharmony_ci		.tuner_type     = UNSET /* TUNER_ALPS_TMDH2_NTSC */,
109962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
110062306a36Sopenharmony_ci	},
110162306a36Sopenharmony_ci
110262306a36Sopenharmony_ci	/* ---- card 0x34 ---------------------------------- */
110362306a36Sopenharmony_ci	[BTTV_BOARD_PINNACLEPRO] = {
110462306a36Sopenharmony_ci		/* David Härdeman <david@2gen.com> */
110562306a36Sopenharmony_ci		.name           = "Pinnacle PCTV Studio Pro",
110662306a36Sopenharmony_ci		.video_inputs   = 4,
110762306a36Sopenharmony_ci		/* .audio_inputs= 1, */
110862306a36Sopenharmony_ci		.svhs           = 3,
110962306a36Sopenharmony_ci		.gpiomask       = 0x03000F,
111062306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
111162306a36Sopenharmony_ci		.gpiomux	= { 1, 0xd0001, 0, 0 },
111262306a36Sopenharmony_ci		.gpiomute	= 10,
111362306a36Sopenharmony_ci				/* sound path (5 sources):
111462306a36Sopenharmony_ci				MUX1 (mask 0x03), Enable Pin 0x08 (0=enable, 1=disable)
111562306a36Sopenharmony_ci					0= ext. Audio IN
111662306a36Sopenharmony_ci					1= from MUX2
111762306a36Sopenharmony_ci					2= Mono TV sound from Tuner
111862306a36Sopenharmony_ci					3= not connected
111962306a36Sopenharmony_ci				MUX2 (mask 0x30000):
112062306a36Sopenharmony_ci					0,2,3= from MSP34xx
112162306a36Sopenharmony_ci					1= FM stereo Radio from Tuner */
112262306a36Sopenharmony_ci		.pll            = PLL_28,
112362306a36Sopenharmony_ci		.tuner_type     = UNSET,
112462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
112562306a36Sopenharmony_ci	},
112662306a36Sopenharmony_ci	[BTTV_BOARD_TVIEW_RDS_FM] = {
112762306a36Sopenharmony_ci		/* Claas Langbehn <claas@bigfoot.com>,
112862306a36Sopenharmony_ci		Sven Grothklags <sven@upb.de> */
112962306a36Sopenharmony_ci		.name		= "Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS",
113062306a36Sopenharmony_ci		.video_inputs	= 4,
113162306a36Sopenharmony_ci		/* .audio_inputs= 3, */
113262306a36Sopenharmony_ci		.svhs		= 2,
113362306a36Sopenharmony_ci		.gpiomask	= 0x1c,
113462306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
113562306a36Sopenharmony_ci		.gpiomux	= { 0, 0, 0x10, 8 },
113662306a36Sopenharmony_ci		.gpiomute	= 4,
113762306a36Sopenharmony_ci		.pll		= PLL_28,
113862306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL,
113962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
114062306a36Sopenharmony_ci		.has_radio	= 1,
114162306a36Sopenharmony_ci	},
114262306a36Sopenharmony_ci	[BTTV_BOARD_LIFETEC_9415] = {
114362306a36Sopenharmony_ci		/* Tim Röstermundt <rosterm@uni-muenster.de>
114462306a36Sopenharmony_ci		in de.comp.os.unix.linux.hardware:
114562306a36Sopenharmony_ci			options bttv card=0 pll=1 radio=1 gpiomask=0x18e0
114662306a36Sopenharmony_ci			gpiomux =0x44c71f,0x44d71f,0,0x44d71f,0x44dfff
114762306a36Sopenharmony_ci			options tuner type=5 */
114862306a36Sopenharmony_ci		.name		= "Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]",
114962306a36Sopenharmony_ci		.video_inputs	= 4,
115062306a36Sopenharmony_ci		/* .audio_inputs= 1, */
115162306a36Sopenharmony_ci		.svhs		= 2,
115262306a36Sopenharmony_ci		.gpiomask	= 0x18e0,
115362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
115462306a36Sopenharmony_ci		.gpiomux	= { 0x0000,0x0800,0x1000,0x1000 },
115562306a36Sopenharmony_ci		.gpiomute	= 0x18e0,
115662306a36Sopenharmony_ci			/* For cards with tda9820/tda9821:
115762306a36Sopenharmony_ci				0x0000: Tuner normal stereo
115862306a36Sopenharmony_ci				0x0080: Tuner A2 SAP (second audio program = Zweikanalton)
115962306a36Sopenharmony_ci				0x0880: Tuner A2 stereo */
116062306a36Sopenharmony_ci		.pll		= PLL_28,
116162306a36Sopenharmony_ci		.tuner_type	= UNSET,
116262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
116362306a36Sopenharmony_ci	},
116462306a36Sopenharmony_ci	[BTTV_BOARD_BESTBUY_EASYTV] = {
116562306a36Sopenharmony_ci		/* Miguel Angel Alvarez <maacruz@navegalia.com>
116662306a36Sopenharmony_ci		old Easy TV BT848 version (model CPH031) */
116762306a36Sopenharmony_ci		.name           = "Askey CPH031/ BESTBUY Easy TV",
116862306a36Sopenharmony_ci		.video_inputs	= 4,
116962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
117062306a36Sopenharmony_ci		.svhs           = 2,
117162306a36Sopenharmony_ci		.gpiomask       = 0xF,
117262306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
117362306a36Sopenharmony_ci		.gpiomux        = { 2, 0, 0, 0 },
117462306a36Sopenharmony_ci		.gpiomute	= 10,
117562306a36Sopenharmony_ci		.pll		= PLL_28,
117662306a36Sopenharmony_ci		.tuner_type	= TUNER_TEMIC_PAL,
117762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
117862306a36Sopenharmony_ci	},
117962306a36Sopenharmony_ci
118062306a36Sopenharmony_ci	/* ---- card 0x38 ---------------------------------- */
118162306a36Sopenharmony_ci	[BTTV_BOARD_FLYVIDEO_98FM] = {
118262306a36Sopenharmony_ci		/* Gordon Heydon <gjheydon@bigfoot.com ('98) */
118362306a36Sopenharmony_ci		.name           = "Lifeview FlyVideo 98FM LR50",
118462306a36Sopenharmony_ci		.video_inputs   = 4,
118562306a36Sopenharmony_ci		/* .audio_inputs= 3, */
118662306a36Sopenharmony_ci		.svhs           = 2,
118762306a36Sopenharmony_ci		.gpiomask       = 0x1800,
118862306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
118962306a36Sopenharmony_ci		.gpiomux        = { 0, 0x800, 0x1000, 0x1000 },
119062306a36Sopenharmony_ci		.gpiomute	= 0x1800,
119162306a36Sopenharmony_ci		.pll            = PLL_28,
119262306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
119362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
119462306a36Sopenharmony_ci	},
119562306a36Sopenharmony_ci		/* This is the ultimate cheapo capture card
119662306a36Sopenharmony_ci		* just a BT848A on a small PCB!
119762306a36Sopenharmony_ci		* Steve Hosgood <steve@equiinet.com> */
119862306a36Sopenharmony_ci	[BTTV_BOARD_GRANDTEC] = {
119962306a36Sopenharmony_ci		.name           = "GrandTec 'Grand Video Capture' (Bt848)",
120062306a36Sopenharmony_ci		.video_inputs   = 2,
120162306a36Sopenharmony_ci		/* .audio_inputs= 0, */
120262306a36Sopenharmony_ci		.svhs           = 1,
120362306a36Sopenharmony_ci		.gpiomask       = 0,
120462306a36Sopenharmony_ci		.muxsel         = MUXSEL(3, 1),
120562306a36Sopenharmony_ci		.gpiomux        = { 0 },
120662306a36Sopenharmony_ci		.no_msp34xx     = 1,
120762306a36Sopenharmony_ci		.pll            = PLL_35,
120862306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
120962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
121062306a36Sopenharmony_ci	},
121162306a36Sopenharmony_ci	[BTTV_BOARD_ASKEY_CPH060] = {
121262306a36Sopenharmony_ci		/* Daniel Herrington <daniel.herrington@home.com> */
121362306a36Sopenharmony_ci		.name           = "Askey CPH060/ Phoebe TV Master Only (No FM)",
121462306a36Sopenharmony_ci		.video_inputs   = 3,
121562306a36Sopenharmony_ci		/* .audio_inputs= 1, */
121662306a36Sopenharmony_ci		.svhs           = 2,
121762306a36Sopenharmony_ci		.gpiomask       = 0xe00,
121862306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
121962306a36Sopenharmony_ci		.gpiomux        = { 0x400, 0x400, 0x400, 0x400 },
122062306a36Sopenharmony_ci		.gpiomute	= 0x800,
122162306a36Sopenharmony_ci		.pll            = PLL_28,
122262306a36Sopenharmony_ci		.tuner_type     = TUNER_TEMIC_4036FY5_NTSC,
122362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
122462306a36Sopenharmony_ci	},
122562306a36Sopenharmony_ci	[BTTV_BOARD_ASKEY_CPH03X] = {
122662306a36Sopenharmony_ci		/* Matti Mottus <mottus@physic.ut.ee> */
122762306a36Sopenharmony_ci		.name		= "Askey CPH03x TV Capturer",
122862306a36Sopenharmony_ci		.video_inputs	= 4,
122962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
123062306a36Sopenharmony_ci		.svhs		= 2,
123162306a36Sopenharmony_ci		.gpiomask       = 0x03000F,
123262306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0),
123362306a36Sopenharmony_ci		.gpiomux        = { 2, 0, 0, 0 },
123462306a36Sopenharmony_ci		.gpiomute	= 1,
123562306a36Sopenharmony_ci		.pll            = PLL_28,
123662306a36Sopenharmony_ci		.tuner_type	= TUNER_TEMIC_PAL,
123762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
123862306a36Sopenharmony_ci		.has_remote	= 1,
123962306a36Sopenharmony_ci	},
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_ci	/* ---- card 0x3c ---------------------------------- */
124262306a36Sopenharmony_ci	[BTTV_BOARD_MM100PCTV] = {
124362306a36Sopenharmony_ci		/* Philip Blundell <philb@gnu.org> */
124462306a36Sopenharmony_ci		.name           = "Modular Technology MM100PCTV",
124562306a36Sopenharmony_ci		.video_inputs   = 2,
124662306a36Sopenharmony_ci		/* .audio_inputs= 2, */
124762306a36Sopenharmony_ci		.svhs		= NO_SVHS,
124862306a36Sopenharmony_ci		.gpiomask       = 11,
124962306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
125062306a36Sopenharmony_ci		.gpiomux        = { 2, 0, 0, 1 },
125162306a36Sopenharmony_ci		.gpiomute	= 8,
125262306a36Sopenharmony_ci		.pll            = PLL_35,
125362306a36Sopenharmony_ci		.tuner_type     = TUNER_TEMIC_PAL,
125462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
125562306a36Sopenharmony_ci	},
125662306a36Sopenharmony_ci	[BTTV_BOARD_GMV1] = {
125762306a36Sopenharmony_ci		/* Adrian Cox <adrian@humboldt.co.uk */
125862306a36Sopenharmony_ci		.name		= "AG Electronics GMV1",
125962306a36Sopenharmony_ci		.video_inputs   = 2,
126062306a36Sopenharmony_ci		/* .audio_inputs= 0, */
126162306a36Sopenharmony_ci		.svhs		= 1,
126262306a36Sopenharmony_ci		.gpiomask       = 0xF,
126362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 2),
126462306a36Sopenharmony_ci		.gpiomux        = { },
126562306a36Sopenharmony_ci		.no_msp34xx     = 1,
126662306a36Sopenharmony_ci		.pll		= PLL_28,
126762306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
126862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
126962306a36Sopenharmony_ci	},
127062306a36Sopenharmony_ci	[BTTV_BOARD_BESTBUY_EASYTV2] = {
127162306a36Sopenharmony_ci		/* Miguel Angel Alvarez <maacruz@navegalia.com>
127262306a36Sopenharmony_ci		new Easy TV BT878 version (model CPH061)
127362306a36Sopenharmony_ci		special thanks to Informatica Mieres for providing the card */
127462306a36Sopenharmony_ci		.name           = "Askey CPH061/ BESTBUY Easy TV (bt878)",
127562306a36Sopenharmony_ci		.video_inputs	= 3,
127662306a36Sopenharmony_ci		/* .audio_inputs= 2, */
127762306a36Sopenharmony_ci		.svhs           = 2,
127862306a36Sopenharmony_ci		.gpiomask       = 0xFF,
127962306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
128062306a36Sopenharmony_ci		.gpiomux        = { 1, 0, 4, 4 },
128162306a36Sopenharmony_ci		.gpiomute	= 9,
128262306a36Sopenharmony_ci		.pll		= PLL_28,
128362306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL,
128462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
128562306a36Sopenharmony_ci	},
128662306a36Sopenharmony_ci	[BTTV_BOARD_ATI_TVWONDER] = {
128762306a36Sopenharmony_ci		/* Lukas Gebauer <geby@volny.cz> */
128862306a36Sopenharmony_ci		.name		= "ATI TV-Wonder",
128962306a36Sopenharmony_ci		.video_inputs	= 3,
129062306a36Sopenharmony_ci		/* .audio_inputs= 1, */
129162306a36Sopenharmony_ci		.svhs		= 2,
129262306a36Sopenharmony_ci		.gpiomask	= 0xf03f,
129362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0),
129462306a36Sopenharmony_ci		.gpiomux	= { 0xbffe, 0, 0xbfff, 0 },
129562306a36Sopenharmony_ci		.gpiomute	= 0xbffe,
129662306a36Sopenharmony_ci		.pll		= PLL_28,
129762306a36Sopenharmony_ci		.tuner_type	= TUNER_TEMIC_4006FN5_MULTI_PAL,
129862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
129962306a36Sopenharmony_ci	},
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_ci	/* ---- card 0x40 ---------------------------------- */
130262306a36Sopenharmony_ci	[BTTV_BOARD_ATI_TVWONDERVE] = {
130362306a36Sopenharmony_ci		/* Lukas Gebauer <geby@volny.cz> */
130462306a36Sopenharmony_ci		.name		= "ATI TV-Wonder VE",
130562306a36Sopenharmony_ci		.video_inputs	= 2,
130662306a36Sopenharmony_ci		/* .audio_inputs= 1, */
130762306a36Sopenharmony_ci		.svhs		= NO_SVHS,
130862306a36Sopenharmony_ci		.gpiomask	= 1,
130962306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 0, 1),
131062306a36Sopenharmony_ci		.gpiomux	= { 0, 0, 1, 0 },
131162306a36Sopenharmony_ci		.no_msp34xx	= 1,
131262306a36Sopenharmony_ci		.pll		= PLL_28,
131362306a36Sopenharmony_ci		.tuner_type	= TUNER_TEMIC_4006FN5_MULTI_PAL,
131462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
131562306a36Sopenharmony_ci	},
131662306a36Sopenharmony_ci	[BTTV_BOARD_FLYVIDEO2000] = {
131762306a36Sopenharmony_ci		/* DeeJay <deejay@westel900.net (2000S) */
131862306a36Sopenharmony_ci		.name           = "Lifeview FlyVideo 2000S LR90",
131962306a36Sopenharmony_ci		.video_inputs   = 3,
132062306a36Sopenharmony_ci		/* .audio_inputs= 3, */
132162306a36Sopenharmony_ci		.svhs           = 2,
132262306a36Sopenharmony_ci		.gpiomask	= 0x18e0,
132362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 0, 1),
132462306a36Sopenharmony_ci				/* Radio changed from 1e80 to 0x800 to make
132562306a36Sopenharmony_ci				FlyVideo2000S in .hu happy (gm)*/
132662306a36Sopenharmony_ci				/* -dk-???: set mute=0x1800 for tda9874h daughterboard */
132762306a36Sopenharmony_ci		.gpiomux	= { 0x0000,0x0800,0x1000,0x1000 },
132862306a36Sopenharmony_ci		.gpiomute	= 0x1800,
132962306a36Sopenharmony_ci		.audio_mode_gpio= fv2000s_audio,
133062306a36Sopenharmony_ci		.no_msp34xx	= 1,
133162306a36Sopenharmony_ci		.pll            = PLL_28,
133262306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
133362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
133462306a36Sopenharmony_ci	},
133562306a36Sopenharmony_ci	[BTTV_BOARD_TERRATVALUER] = {
133662306a36Sopenharmony_ci		.name		= "Terratec TValueRadio",
133762306a36Sopenharmony_ci		.video_inputs	= 3,
133862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
133962306a36Sopenharmony_ci		.svhs		= 2,
134062306a36Sopenharmony_ci		.gpiomask	= 0xffff00,
134162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
134262306a36Sopenharmony_ci		.gpiomux	= { 0x500, 0x500, 0x300, 0x900 },
134362306a36Sopenharmony_ci		.gpiomute	= 0x900,
134462306a36Sopenharmony_ci		.pll		= PLL_28,
134562306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL,
134662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
134762306a36Sopenharmony_ci		.has_radio	= 1,
134862306a36Sopenharmony_ci	},
134962306a36Sopenharmony_ci	[BTTV_BOARD_GVBCTV4PCI] = {
135062306a36Sopenharmony_ci		/* TANAKA Kei <peg00625@nifty.com> */
135162306a36Sopenharmony_ci		.name           = "IODATA GV-BCTV4/PCI",
135262306a36Sopenharmony_ci		.video_inputs   = 3,
135362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
135462306a36Sopenharmony_ci		.svhs           = 2,
135562306a36Sopenharmony_ci		.gpiomask       = 0x010f00,
135662306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 0, 0),
135762306a36Sopenharmony_ci		.gpiomux        = {0x10000, 0, 0x10000, 0 },
135862306a36Sopenharmony_ci		.no_msp34xx     = 1,
135962306a36Sopenharmony_ci		.pll            = PLL_28,
136062306a36Sopenharmony_ci		.tuner_type     = TUNER_SHARP_2U5JF5540_NTSC,
136162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
136262306a36Sopenharmony_ci		.audio_mode_gpio= gvbctv3pci_audio,
136362306a36Sopenharmony_ci	},
136462306a36Sopenharmony_ci
136562306a36Sopenharmony_ci	/* ---- card 0x44 ---------------------------------- */
136662306a36Sopenharmony_ci	[BTTV_BOARD_VOODOOTV_FM] = {
136762306a36Sopenharmony_ci		.name           = "3Dfx VoodooTV FM (Euro)",
136862306a36Sopenharmony_ci		/* try "insmod msp3400 simple=0" if you have
136962306a36Sopenharmony_ci		* sound problems with this card. */
137062306a36Sopenharmony_ci		.video_inputs   = 4,
137162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
137262306a36Sopenharmony_ci		.svhs           = NO_SVHS,
137362306a36Sopenharmony_ci		.gpiomask       = 0x4f8a00,
137462306a36Sopenharmony_ci		/* 0x100000: 1=MSP enabled (0=disable again)
137562306a36Sopenharmony_ci		* 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) */
137662306a36Sopenharmony_ci		.gpiomux        = {0x947fff, 0x987fff,0x947fff,0x947fff },
137762306a36Sopenharmony_ci		.gpiomute	= 0x947fff,
137862306a36Sopenharmony_ci		/* tvtuner, radio,   external,internal, mute,  stereo
137962306a36Sopenharmony_ci		* tuner, Composite, SVid, Composite-on-Svid-adapter */
138062306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 0, 1),
138162306a36Sopenharmony_ci		.tuner_type     = TUNER_MT2032,
138262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
138362306a36Sopenharmony_ci		.pll		= PLL_28,
138462306a36Sopenharmony_ci		.has_radio	= 1,
138562306a36Sopenharmony_ci	},
138662306a36Sopenharmony_ci	[BTTV_BOARD_VOODOOTV_200] = {
138762306a36Sopenharmony_ci		.name           = "VoodooTV 200 (USA)",
138862306a36Sopenharmony_ci		/* try "insmod msp3400 simple=0" if you have
138962306a36Sopenharmony_ci		* sound problems with this card. */
139062306a36Sopenharmony_ci		.video_inputs   = 4,
139162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
139262306a36Sopenharmony_ci		.svhs           = NO_SVHS,
139362306a36Sopenharmony_ci		.gpiomask       = 0x4f8a00,
139462306a36Sopenharmony_ci		/* 0x100000: 1=MSP enabled (0=disable again)
139562306a36Sopenharmony_ci		* 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) */
139662306a36Sopenharmony_ci		.gpiomux        = {0x947fff, 0x987fff,0x947fff,0x947fff },
139762306a36Sopenharmony_ci		.gpiomute	= 0x947fff,
139862306a36Sopenharmony_ci		/* tvtuner, radio,   external,internal, mute,  stereo
139962306a36Sopenharmony_ci		* tuner, Composite, SVid, Composite-on-Svid-adapter */
140062306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 0, 1),
140162306a36Sopenharmony_ci		.tuner_type     = TUNER_MT2032,
140262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
140362306a36Sopenharmony_ci		.pll		= PLL_28,
140462306a36Sopenharmony_ci		.has_radio	= 1,
140562306a36Sopenharmony_ci	},
140662306a36Sopenharmony_ci	[BTTV_BOARD_AIMMS] = {
140762306a36Sopenharmony_ci		/* Philip Blundell <pb@nexus.co.uk> */
140862306a36Sopenharmony_ci		.name           = "Active Imaging AIMMS",
140962306a36Sopenharmony_ci		.video_inputs   = 1,
141062306a36Sopenharmony_ci		/* .audio_inputs= 0, */
141162306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
141262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
141362306a36Sopenharmony_ci		.pll            = PLL_28,
141462306a36Sopenharmony_ci		.muxsel         = MUXSEL(2),
141562306a36Sopenharmony_ci		.gpiomask       = 0
141662306a36Sopenharmony_ci	},
141762306a36Sopenharmony_ci	[BTTV_BOARD_PV_BT878P_PLUS] = {
141862306a36Sopenharmony_ci		/* Tomasz Pyra <hellfire@sedez.iq.pl> */
141962306a36Sopenharmony_ci		.name           = "Prolink Pixelview PV-BT878P+ (Rev.4C,8E)",
142062306a36Sopenharmony_ci		.video_inputs   = 3,
142162306a36Sopenharmony_ci		/* .audio_inputs= 4, */
142262306a36Sopenharmony_ci		.svhs           = 2,
142362306a36Sopenharmony_ci		.gpiomask       = 15,
142462306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
142562306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 11, 7 }, /* TV and Radio with same GPIO ! */
142662306a36Sopenharmony_ci		.gpiomute	= 13,
142762306a36Sopenharmony_ci		.pll            = PLL_28,
142862306a36Sopenharmony_ci		.tuner_type     = TUNER_LG_PAL_I_FM,
142962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
143062306a36Sopenharmony_ci		.has_remote     = 1,
143162306a36Sopenharmony_ci		/* GPIO wiring:
143262306a36Sopenharmony_ci			GPIO0: U4.A0 (hef4052bt)
143362306a36Sopenharmony_ci			GPIO1: U4.A1
143462306a36Sopenharmony_ci			GPIO2: U4.A1 (second hef4052bt)
143562306a36Sopenharmony_ci			GPIO3: U4.nEN, U5.A0, A5.nEN
143662306a36Sopenharmony_ci			GPIO8-15: vrd866b ?
143762306a36Sopenharmony_ci		*/
143862306a36Sopenharmony_ci	},
143962306a36Sopenharmony_ci	[BTTV_BOARD_FLYVIDEO98EZ] = {
144062306a36Sopenharmony_ci		.name		= "Lifeview FlyVideo 98EZ (capture only) LR51",
144162306a36Sopenharmony_ci		.video_inputs	= 4,
144262306a36Sopenharmony_ci		/* .audio_inputs= 0, */
144362306a36Sopenharmony_ci		.svhs		= 2,
144462306a36Sopenharmony_ci		/* AV1, AV2, SVHS, CVid adapter on SVHS */
144562306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
144662306a36Sopenharmony_ci		.pll		= PLL_28,
144762306a36Sopenharmony_ci		.no_msp34xx	= 1,
144862306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
144962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
145062306a36Sopenharmony_ci	},
145162306a36Sopenharmony_ci
145262306a36Sopenharmony_ci	/* ---- card 0x48 ---------------------------------- */
145362306a36Sopenharmony_ci	[BTTV_BOARD_PV_BT878P_9B] = {
145462306a36Sopenharmony_ci		/* Dariusz Kowalewski <darekk@automex.pl> */
145562306a36Sopenharmony_ci		.name		= "Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)",
145662306a36Sopenharmony_ci		.video_inputs	= 4,
145762306a36Sopenharmony_ci		/* .audio_inputs= 1, */
145862306a36Sopenharmony_ci		.svhs		= 2,
145962306a36Sopenharmony_ci		.gpiomask	= 0x3f,
146062306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
146162306a36Sopenharmony_ci		.gpiomux	= { 0x01, 0x00, 0x03, 0x03 },
146262306a36Sopenharmony_ci		.gpiomute	= 0x09,
146362306a36Sopenharmony_ci		.no_msp34xx	= 1,
146462306a36Sopenharmony_ci		.pll		= PLL_28,
146562306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_PAL,
146662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
146762306a36Sopenharmony_ci		.audio_mode_gpio= pvbt878p9b_audio, /* Note: not all cards have stereo */
146862306a36Sopenharmony_ci		.has_radio	= 1,  /* Note: not all cards have radio */
146962306a36Sopenharmony_ci		.has_remote     = 1,
147062306a36Sopenharmony_ci		/* GPIO wiring:
147162306a36Sopenharmony_ci			GPIO0: A0 hef4052
147262306a36Sopenharmony_ci			GPIO1: A1 hef4052
147362306a36Sopenharmony_ci			GPIO3: nEN hef4052
147462306a36Sopenharmony_ci			GPIO8-15: vrd866b
147562306a36Sopenharmony_ci			GPIO20,22,23: R30,R29,R28
147662306a36Sopenharmony_ci		*/
147762306a36Sopenharmony_ci	},
147862306a36Sopenharmony_ci	[BTTV_BOARD_SENSORAY311_611] = {
147962306a36Sopenharmony_ci		/* Clay Kunz <ckunz@mail.arc.nasa.gov> */
148062306a36Sopenharmony_ci		/* you must jumper JP5 for the 311 card (PC/104+) to work */
148162306a36Sopenharmony_ci		.name           = "Sensoray 311/611",
148262306a36Sopenharmony_ci		.video_inputs   = 5,
148362306a36Sopenharmony_ci		/* .audio_inputs= 0, */
148462306a36Sopenharmony_ci		.svhs           = 4,
148562306a36Sopenharmony_ci		.gpiomask       = 0,
148662306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0, 0),
148762306a36Sopenharmony_ci		.gpiomux        = { 0 },
148862306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
148962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
149062306a36Sopenharmony_ci	},
149162306a36Sopenharmony_ci	[BTTV_BOARD_RV605] = {
149262306a36Sopenharmony_ci		/* Miguel Freitas <miguel@cetuc.puc-rio.br> */
149362306a36Sopenharmony_ci		.name           = "RemoteVision MX (RV605)",
149462306a36Sopenharmony_ci		.video_inputs   = 16,
149562306a36Sopenharmony_ci		/* .audio_inputs= 0, */
149662306a36Sopenharmony_ci		.svhs           = NO_SVHS,
149762306a36Sopenharmony_ci		.gpiomask       = 0x00,
149862306a36Sopenharmony_ci		.gpiomask2      = 0x07ff,
149962306a36Sopenharmony_ci		.muxsel         = MUXSEL(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3),
150062306a36Sopenharmony_ci		.no_msp34xx     = 1,
150162306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
150262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
150362306a36Sopenharmony_ci		.muxsel_hook    = rv605_muxsel,
150462306a36Sopenharmony_ci	},
150562306a36Sopenharmony_ci	[BTTV_BOARD_POWERCLR_MTV878] = {
150662306a36Sopenharmony_ci		.name           = "Powercolor MTV878/ MTV878R/ MTV878F",
150762306a36Sopenharmony_ci		.video_inputs   = 3,
150862306a36Sopenharmony_ci		/* .audio_inputs= 2, */
150962306a36Sopenharmony_ci		.svhs           = 2,
151062306a36Sopenharmony_ci		.gpiomask       = 0x1C800F,  /* Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset */
151162306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 1, 1),
151262306a36Sopenharmony_ci		.gpiomux        = { 0, 1, 2, 2 },
151362306a36Sopenharmony_ci		.gpiomute	= 4,
151462306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
151562306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
151662306a36Sopenharmony_ci		.pll		= PLL_28,
151762306a36Sopenharmony_ci		.has_radio	= 1,
151862306a36Sopenharmony_ci	},
151962306a36Sopenharmony_ci
152062306a36Sopenharmony_ci	/* ---- card 0x4c ---------------------------------- */
152162306a36Sopenharmony_ci	[BTTV_BOARD_WINDVR] = {
152262306a36Sopenharmony_ci		/* Masaki Suzuki <masaki@btree.org> */
152362306a36Sopenharmony_ci		.name           = "Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP)",
152462306a36Sopenharmony_ci		.video_inputs   = 3,
152562306a36Sopenharmony_ci		/* .audio_inputs= 1, */
152662306a36Sopenharmony_ci		.svhs           = 2,
152762306a36Sopenharmony_ci		.gpiomask       = 0x140007,
152862306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
152962306a36Sopenharmony_ci		.gpiomux        = { 0, 1, 2, 3 },
153062306a36Sopenharmony_ci		.gpiomute	= 4,
153162306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_NTSC,
153262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
153362306a36Sopenharmony_ci		.audio_mode_gpio= windvr_audio,
153462306a36Sopenharmony_ci	},
153562306a36Sopenharmony_ci	[BTTV_BOARD_GRANDTEC_MULTI] = {
153662306a36Sopenharmony_ci		.name           = "GrandTec Multi Capture Card (Bt878)",
153762306a36Sopenharmony_ci		.video_inputs   = 4,
153862306a36Sopenharmony_ci		/* .audio_inputs= 0, */
153962306a36Sopenharmony_ci		.svhs           = NO_SVHS,
154062306a36Sopenharmony_ci		.gpiomask       = 0,
154162306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
154262306a36Sopenharmony_ci		.gpiomux        = { 0 },
154362306a36Sopenharmony_ci		.no_msp34xx     = 1,
154462306a36Sopenharmony_ci		.pll            = PLL_28,
154562306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
154662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
154762306a36Sopenharmony_ci	},
154862306a36Sopenharmony_ci	[BTTV_BOARD_KWORLD] = {
154962306a36Sopenharmony_ci		.name           = "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF",
155062306a36Sopenharmony_ci		.video_inputs   = 4,
155162306a36Sopenharmony_ci		/* .audio_inputs= 3, */
155262306a36Sopenharmony_ci		.svhs           = 2,
155362306a36Sopenharmony_ci		.gpiomask       = 7,
155462306a36Sopenharmony_ci		/* Tuner, SVid, SVHS, SVid to SVHS connector */
155562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
155662306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 4, 4 },/* Yes, this tuner uses the same audio output for TV and FM radio!
155762306a36Sopenharmony_ci						* This card lacks external Audio In, so we mute it on Ext. & Int.
155862306a36Sopenharmony_ci						* The PCB can take a sbx1637/sbx1673, wiring unknown.
155962306a36Sopenharmony_ci						* This card lacks PCI subsystem ID, sigh.
156062306a36Sopenharmony_ci						* gpiomux =1: lower volume, 2+3: mute
156162306a36Sopenharmony_ci						* btwincap uses 0x80000/0x80003
156262306a36Sopenharmony_ci						*/
156362306a36Sopenharmony_ci		.gpiomute	= 4,
156462306a36Sopenharmony_ci		.no_msp34xx     = 1,
156562306a36Sopenharmony_ci		.pll            = PLL_28,
156662306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
156762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
156862306a36Sopenharmony_ci		/* Samsung TCPA9095PC27A (BG+DK), philips compatible, w/FM, stereo and
156962306a36Sopenharmony_ci		radio signal strength indicators work fine. */
157062306a36Sopenharmony_ci		.has_radio	= 1,
157162306a36Sopenharmony_ci		/* GPIO Info:
157262306a36Sopenharmony_ci			GPIO0,1:   HEF4052 A0,A1
157362306a36Sopenharmony_ci			GPIO2:     HEF4052 nENABLE
157462306a36Sopenharmony_ci			GPIO3-7:   n.c.
157562306a36Sopenharmony_ci			GPIO8-13:  IRDC357 data0-5 (data6 n.c. ?) [chip not present on my card]
157662306a36Sopenharmony_ci			GPIO14,15: ??
157762306a36Sopenharmony_ci			GPIO16-21: n.c.
157862306a36Sopenharmony_ci			GPIO22,23: ??
157962306a36Sopenharmony_ci			??       : mtu8b56ep microcontroller for IR (GPIO wiring unknown)*/
158062306a36Sopenharmony_ci	},
158162306a36Sopenharmony_ci	[BTTV_BOARD_DSP_TCVIDEO] = {
158262306a36Sopenharmony_ci		/* Arthur Tetzlaff-Deas, DSP Design Ltd <software@dspdesign.com> */
158362306a36Sopenharmony_ci		.name           = "DSP Design TCVIDEO",
158462306a36Sopenharmony_ci		.video_inputs   = 4,
158562306a36Sopenharmony_ci		.svhs           = NO_SVHS,
158662306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
158762306a36Sopenharmony_ci		.pll            = PLL_28,
158862306a36Sopenharmony_ci		.tuner_type     = UNSET,
158962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
159062306a36Sopenharmony_ci	},
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_ci		/* ---- card 0x50 ---------------------------------- */
159362306a36Sopenharmony_ci	[BTTV_BOARD_HAUPPAUGEPVR] = {
159462306a36Sopenharmony_ci		.name           = "Hauppauge WinTV PVR",
159562306a36Sopenharmony_ci		.video_inputs   = 4,
159662306a36Sopenharmony_ci		/* .audio_inputs= 1, */
159762306a36Sopenharmony_ci		.svhs           = 2,
159862306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 0, 1, 1),
159962306a36Sopenharmony_ci		.pll            = PLL_28,
160062306a36Sopenharmony_ci		.tuner_type     = UNSET,
160162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
160262306a36Sopenharmony_ci
160362306a36Sopenharmony_ci		.gpiomask       = 7,
160462306a36Sopenharmony_ci		.gpiomux        = {7},
160562306a36Sopenharmony_ci	},
160662306a36Sopenharmony_ci	[BTTV_BOARD_GVBCTV5PCI] = {
160762306a36Sopenharmony_ci		.name           = "IODATA GV-BCTV5/PCI",
160862306a36Sopenharmony_ci		.video_inputs   = 3,
160962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
161062306a36Sopenharmony_ci		.svhs           = 2,
161162306a36Sopenharmony_ci		.gpiomask       = 0x0f0f80,
161262306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
161362306a36Sopenharmony_ci		.gpiomux        = {0x030000, 0x010000, 0, 0 },
161462306a36Sopenharmony_ci		.gpiomute	= 0x020000,
161562306a36Sopenharmony_ci		.no_msp34xx     = 1,
161662306a36Sopenharmony_ci		.pll            = PLL_28,
161762306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_NTSC_M,
161862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
161962306a36Sopenharmony_ci		.audio_mode_gpio= gvbctv5pci_audio,
162062306a36Sopenharmony_ci		.has_radio      = 1,
162162306a36Sopenharmony_ci	},
162262306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY1x0] = {
162362306a36Sopenharmony_ci		.name           = "Osprey 100/150 (878)", /* 0x1(2|3)-45C6-C1 */
162462306a36Sopenharmony_ci		.video_inputs   = 4,                  /* id-inputs-clock */
162562306a36Sopenharmony_ci		/* .audio_inputs= 0, */
162662306a36Sopenharmony_ci		.svhs           = 3,
162762306a36Sopenharmony_ci		.muxsel         = MUXSEL(3, 2, 0, 1),
162862306a36Sopenharmony_ci		.pll            = PLL_28,
162962306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
163062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
163162306a36Sopenharmony_ci		.no_msp34xx     = 1,
163262306a36Sopenharmony_ci		.no_tda7432     = 1,
163362306a36Sopenharmony_ci	},
163462306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY1x0_848] = {
163562306a36Sopenharmony_ci		.name           = "Osprey 100/150 (848)", /* 0x04-54C0-C1 & older boards */
163662306a36Sopenharmony_ci		.video_inputs   = 3,
163762306a36Sopenharmony_ci		/* .audio_inputs= 0, */
163862306a36Sopenharmony_ci		.svhs           = 2,
163962306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1),
164062306a36Sopenharmony_ci		.pll            = PLL_28,
164162306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
164262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
164362306a36Sopenharmony_ci		.no_msp34xx     = 1,
164462306a36Sopenharmony_ci		.no_tda7432     = 1,
164562306a36Sopenharmony_ci	},
164662306a36Sopenharmony_ci
164762306a36Sopenharmony_ci		/* ---- card 0x54 ---------------------------------- */
164862306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY101_848] = {
164962306a36Sopenharmony_ci		.name           = "Osprey 101 (848)", /* 0x05-40C0-C1 */
165062306a36Sopenharmony_ci		.video_inputs   = 2,
165162306a36Sopenharmony_ci		/* .audio_inputs= 0, */
165262306a36Sopenharmony_ci		.svhs           = 1,
165362306a36Sopenharmony_ci		.muxsel         = MUXSEL(3, 1),
165462306a36Sopenharmony_ci		.pll            = PLL_28,
165562306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
165662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
165762306a36Sopenharmony_ci		.no_msp34xx     = 1,
165862306a36Sopenharmony_ci		.no_tda7432     = 1,
165962306a36Sopenharmony_ci	},
166062306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY1x1] = {
166162306a36Sopenharmony_ci		.name           = "Osprey 101/151",       /* 0x1(4|5)-0004-C4 */
166262306a36Sopenharmony_ci		.video_inputs   = 1,
166362306a36Sopenharmony_ci		/* .audio_inputs= 0, */
166462306a36Sopenharmony_ci		.svhs           = NO_SVHS,
166562306a36Sopenharmony_ci		.muxsel         = MUXSEL(0),
166662306a36Sopenharmony_ci		.pll            = PLL_28,
166762306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
166862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
166962306a36Sopenharmony_ci		.no_msp34xx     = 1,
167062306a36Sopenharmony_ci		.no_tda7432     = 1,
167162306a36Sopenharmony_ci	},
167262306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY1x1_SVID] = {
167362306a36Sopenharmony_ci		.name           = "Osprey 101/151 w/ svid",  /* 0x(16|17|20)-00C4-C1 */
167462306a36Sopenharmony_ci		.video_inputs   = 2,
167562306a36Sopenharmony_ci		/* .audio_inputs= 0, */
167662306a36Sopenharmony_ci		.svhs           = 1,
167762306a36Sopenharmony_ci		.muxsel         = MUXSEL(0, 1),
167862306a36Sopenharmony_ci		.pll            = PLL_28,
167962306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
168062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
168162306a36Sopenharmony_ci		.no_msp34xx     = 1,
168262306a36Sopenharmony_ci		.no_tda7432     = 1,
168362306a36Sopenharmony_ci	},
168462306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY2xx] = {
168562306a36Sopenharmony_ci		.name           = "Osprey 200/201/250/251",  /* 0x1(8|9|E|F)-0004-C4 */
168662306a36Sopenharmony_ci		.video_inputs   = 1,
168762306a36Sopenharmony_ci		/* .audio_inputs= 1, */
168862306a36Sopenharmony_ci		.svhs           = NO_SVHS,
168962306a36Sopenharmony_ci		.muxsel         = MUXSEL(0),
169062306a36Sopenharmony_ci		.pll            = PLL_28,
169162306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
169262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
169362306a36Sopenharmony_ci		.no_msp34xx     = 1,
169462306a36Sopenharmony_ci		.no_tda7432     = 1,
169562306a36Sopenharmony_ci	},
169662306a36Sopenharmony_ci
169762306a36Sopenharmony_ci		/* ---- card 0x58 ---------------------------------- */
169862306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY2x0_SVID] = {
169962306a36Sopenharmony_ci		.name           = "Osprey 200/250",   /* 0x1(A|B)-00C4-C1 */
170062306a36Sopenharmony_ci		.video_inputs   = 2,
170162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
170262306a36Sopenharmony_ci		.svhs           = 1,
170362306a36Sopenharmony_ci		.muxsel         = MUXSEL(0, 1),
170462306a36Sopenharmony_ci		.pll            = PLL_28,
170562306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
170662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
170762306a36Sopenharmony_ci		.no_msp34xx     = 1,
170862306a36Sopenharmony_ci		.no_tda7432     = 1,
170962306a36Sopenharmony_ci	},
171062306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY2x0] = {
171162306a36Sopenharmony_ci		.name           = "Osprey 210/220/230",   /* 0x1(A|B)-04C0-C1 */
171262306a36Sopenharmony_ci		.video_inputs   = 2,
171362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
171462306a36Sopenharmony_ci		.svhs           = 1,
171562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3),
171662306a36Sopenharmony_ci		.pll            = PLL_28,
171762306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
171862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
171962306a36Sopenharmony_ci		.no_msp34xx     = 1,
172062306a36Sopenharmony_ci		.no_tda7432     = 1,
172162306a36Sopenharmony_ci	},
172262306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY500] = {
172362306a36Sopenharmony_ci		.name           = "Osprey 500",   /* 500 */
172462306a36Sopenharmony_ci		.video_inputs   = 2,
172562306a36Sopenharmony_ci		/* .audio_inputs= 1, */
172662306a36Sopenharmony_ci		.svhs           = 1,
172762306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3),
172862306a36Sopenharmony_ci		.pll            = PLL_28,
172962306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
173062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
173162306a36Sopenharmony_ci		.no_msp34xx     = 1,
173262306a36Sopenharmony_ci		.no_tda7432     = 1,
173362306a36Sopenharmony_ci	},
173462306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY540] = {
173562306a36Sopenharmony_ci		.name           = "Osprey 540",   /* 540 */
173662306a36Sopenharmony_ci		.video_inputs   = 4,
173762306a36Sopenharmony_ci		/* .audio_inputs= 1, */
173862306a36Sopenharmony_ci		.pll            = PLL_28,
173962306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
174062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
174162306a36Sopenharmony_ci		.no_msp34xx     = 1,
174262306a36Sopenharmony_ci		.no_tda7432     = 1,
174362306a36Sopenharmony_ci	},
174462306a36Sopenharmony_ci
174562306a36Sopenharmony_ci		/* ---- card 0x5C ---------------------------------- */
174662306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY2000] = {
174762306a36Sopenharmony_ci		.name           = "Osprey 2000",  /* 2000 */
174862306a36Sopenharmony_ci		.video_inputs   = 2,
174962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
175062306a36Sopenharmony_ci		.svhs           = 1,
175162306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3),
175262306a36Sopenharmony_ci		.pll            = PLL_28,
175362306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
175462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
175562306a36Sopenharmony_ci		.no_msp34xx     = 1,
175662306a36Sopenharmony_ci		.no_tda7432     = 1,      /* must avoid, conflicts with the bt860 */
175762306a36Sopenharmony_ci	},
175862306a36Sopenharmony_ci	[BTTV_BOARD_IDS_EAGLE] = {
175962306a36Sopenharmony_ci		/* M G Berberich <berberic@forwiss.uni-passau.de> */
176062306a36Sopenharmony_ci		.name           = "IDS Eagle",
176162306a36Sopenharmony_ci		.video_inputs   = 4,
176262306a36Sopenharmony_ci		/* .audio_inputs= 0, */
176362306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
176462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
176562306a36Sopenharmony_ci		.svhs           = NO_SVHS,
176662306a36Sopenharmony_ci		.gpiomask       = 0,
176762306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 2, 2, 2),
176862306a36Sopenharmony_ci		.muxsel_hook    = eagle_muxsel,
176962306a36Sopenharmony_ci		.no_msp34xx     = 1,
177062306a36Sopenharmony_ci		.pll            = PLL_28,
177162306a36Sopenharmony_ci	},
177262306a36Sopenharmony_ci	[BTTV_BOARD_PINNACLESAT] = {
177362306a36Sopenharmony_ci		.name           = "Pinnacle PCTV Sat",
177462306a36Sopenharmony_ci		.video_inputs   = 2,
177562306a36Sopenharmony_ci		/* .audio_inputs= 0, */
177662306a36Sopenharmony_ci		.svhs           = 1,
177762306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
177862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
177962306a36Sopenharmony_ci		.no_msp34xx     = 1,
178062306a36Sopenharmony_ci		.no_tda7432     = 1,
178162306a36Sopenharmony_ci		.muxsel         = MUXSEL(3, 1),
178262306a36Sopenharmony_ci		.pll            = PLL_28,
178362306a36Sopenharmony_ci		.no_gpioirq     = 1,
178462306a36Sopenharmony_ci		.has_dvb        = 1,
178562306a36Sopenharmony_ci	},
178662306a36Sopenharmony_ci	[BTTV_BOARD_FORMAC_PROTV] = {
178762306a36Sopenharmony_ci		.name           = "Formac ProTV II (bt878)",
178862306a36Sopenharmony_ci		.video_inputs   = 4,
178962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
179062306a36Sopenharmony_ci		.svhs           = 3,
179162306a36Sopenharmony_ci		.gpiomask       = 2,
179262306a36Sopenharmony_ci		/* TV, Comp1, Composite over SVID con, SVID */
179362306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
179462306a36Sopenharmony_ci		.gpiomux        = { 2, 2, 0, 0 },
179562306a36Sopenharmony_ci		.pll            = PLL_28,
179662306a36Sopenharmony_ci		.has_radio      = 1,
179762306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
179862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
179962306a36Sopenharmony_ci	/* sound routing:
180062306a36Sopenharmony_ci		GPIO=0x00,0x01,0x03: mute (?)
180162306a36Sopenharmony_ci		0x02: both TV and radio (tuner: FM1216/I)
180262306a36Sopenharmony_ci		The card has onboard audio connectors labeled "cdrom" and "board",
180362306a36Sopenharmony_ci		not soldered here, though unknown wiring.
180462306a36Sopenharmony_ci		Card lacks: external audio in, pci subsystem id.
180562306a36Sopenharmony_ci	*/
180662306a36Sopenharmony_ci	},
180762306a36Sopenharmony_ci
180862306a36Sopenharmony_ci		/* ---- card 0x60 ---------------------------------- */
180962306a36Sopenharmony_ci	[BTTV_BOARD_MACHTV] = {
181062306a36Sopenharmony_ci		.name           = "MachTV",
181162306a36Sopenharmony_ci		.video_inputs   = 3,
181262306a36Sopenharmony_ci		/* .audio_inputs= 1, */
181362306a36Sopenharmony_ci		.svhs           = NO_SVHS,
181462306a36Sopenharmony_ci		.gpiomask       = 7,
181562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
181662306a36Sopenharmony_ci		.gpiomux        = { 0, 1, 2, 3},
181762306a36Sopenharmony_ci		.gpiomute	= 4,
181862306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
181962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
182062306a36Sopenharmony_ci		.pll            = PLL_28,
182162306a36Sopenharmony_ci	},
182262306a36Sopenharmony_ci	[BTTV_BOARD_EURESYS_PICOLO] = {
182362306a36Sopenharmony_ci		.name           = "Euresys Picolo",
182462306a36Sopenharmony_ci		.video_inputs   = 3,
182562306a36Sopenharmony_ci		/* .audio_inputs= 0, */
182662306a36Sopenharmony_ci		.svhs           = 2,
182762306a36Sopenharmony_ci		.gpiomask       = 0,
182862306a36Sopenharmony_ci		.no_msp34xx     = 1,
182962306a36Sopenharmony_ci		.no_tda7432     = 1,
183062306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 0, 1),
183162306a36Sopenharmony_ci		.pll            = PLL_28,
183262306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
183362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
183462306a36Sopenharmony_ci	},
183562306a36Sopenharmony_ci	[BTTV_BOARD_PV150] = {
183662306a36Sopenharmony_ci		/* Luc Van Hoeylandt <luc@e-magic.be> */
183762306a36Sopenharmony_ci		.name           = "ProVideo PV150", /* 0x4f */
183862306a36Sopenharmony_ci		.video_inputs   = 2,
183962306a36Sopenharmony_ci		/* .audio_inputs= 0, */
184062306a36Sopenharmony_ci		.svhs           = NO_SVHS,
184162306a36Sopenharmony_ci		.gpiomask       = 0,
184262306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3),
184362306a36Sopenharmony_ci		.gpiomux        = { 0 },
184462306a36Sopenharmony_ci		.no_msp34xx     = 1,
184562306a36Sopenharmony_ci		.pll            = PLL_28,
184662306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
184762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
184862306a36Sopenharmony_ci	},
184962306a36Sopenharmony_ci	[BTTV_BOARD_AD_TVK503] = {
185062306a36Sopenharmony_ci		/* Hiroshi Takekawa <sian@big.or.jp> */
185162306a36Sopenharmony_ci		/* This card lacks subsystem ID */
185262306a36Sopenharmony_ci		.name           = "AD-TVK503", /* 0x63 */
185362306a36Sopenharmony_ci		.video_inputs   = 4,
185462306a36Sopenharmony_ci		/* .audio_inputs= 1, */
185562306a36Sopenharmony_ci		.svhs           = 2,
185662306a36Sopenharmony_ci		.gpiomask       = 0x001e8007,
185762306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
185862306a36Sopenharmony_ci		/*                  Tuner, Radio, external, internal, off,  on */
185962306a36Sopenharmony_ci		.gpiomux        = { 0x08,  0x0f,  0x0a,     0x08 },
186062306a36Sopenharmony_ci		.gpiomute	= 0x0f,
186162306a36Sopenharmony_ci		.no_msp34xx     = 1,
186262306a36Sopenharmony_ci		.pll            = PLL_28,
186362306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_NTSC,
186462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
186562306a36Sopenharmony_ci		.audio_mode_gpio= adtvk503_audio,
186662306a36Sopenharmony_ci	},
186762306a36Sopenharmony_ci
186862306a36Sopenharmony_ci		/* ---- card 0x64 ---------------------------------- */
186962306a36Sopenharmony_ci	[BTTV_BOARD_HERCULES_SM_TV] = {
187062306a36Sopenharmony_ci		.name           = "Hercules Smart TV Stereo",
187162306a36Sopenharmony_ci		.video_inputs   = 4,
187262306a36Sopenharmony_ci		/* .audio_inputs= 1, */
187362306a36Sopenharmony_ci		.svhs           = 2,
187462306a36Sopenharmony_ci		.gpiomask       = 0x00,
187562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
187662306a36Sopenharmony_ci		.no_msp34xx     = 1,
187762306a36Sopenharmony_ci		.pll            = PLL_28,
187862306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
187962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
188062306a36Sopenharmony_ci		/* Notes:
188162306a36Sopenharmony_ci		- card lacks subsystem ID
188262306a36Sopenharmony_ci		- stereo variant w/ daughter board with tda9874a @0xb0
188362306a36Sopenharmony_ci		- Audio Routing:
188462306a36Sopenharmony_ci			always from tda9874 independent of GPIO (?)
188562306a36Sopenharmony_ci			external line in: unknown
188662306a36Sopenharmony_ci		- Other chips: em78p156elp @ 0x96 (probably IR remote control)
188762306a36Sopenharmony_ci			hef4053 (instead 4052) for unknown function
188862306a36Sopenharmony_ci		*/
188962306a36Sopenharmony_ci	},
189062306a36Sopenharmony_ci	[BTTV_BOARD_PACETV] = {
189162306a36Sopenharmony_ci		.name           = "Pace TV & Radio Card",
189262306a36Sopenharmony_ci		.video_inputs   = 4,
189362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
189462306a36Sopenharmony_ci		.svhs           = 2,
189562306a36Sopenharmony_ci		/* Tuner, CVid, SVid, CVid over SVid connector */
189662306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
189762306a36Sopenharmony_ci		.gpiomask       = 0,
189862306a36Sopenharmony_ci		.no_tda7432     = 1,
189962306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL_I,
190062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
190162306a36Sopenharmony_ci		.has_radio      = 1,
190262306a36Sopenharmony_ci		.pll            = PLL_28,
190362306a36Sopenharmony_ci		/* Bt878, Bt832, FI1246 tuner; no pci subsystem id
190462306a36Sopenharmony_ci		only internal line out: (4pin header) RGGL
190562306a36Sopenharmony_ci		Radio must be decoded by msp3410d (not routed through)*/
190662306a36Sopenharmony_ci		/*
190762306a36Sopenharmony_ci		.digital_mode   = DIGITAL_MODE_CAMERA,  todo!
190862306a36Sopenharmony_ci		*/
190962306a36Sopenharmony_ci	},
191062306a36Sopenharmony_ci	[BTTV_BOARD_IVC200] = {
191162306a36Sopenharmony_ci		/* Chris Willing <chris@vislab.usyd.edu.au> */
191262306a36Sopenharmony_ci		.name           = "IVC-200",
191362306a36Sopenharmony_ci		.video_inputs   = 1,
191462306a36Sopenharmony_ci		/* .audio_inputs= 0, */
191562306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
191662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
191762306a36Sopenharmony_ci		.svhs           = NO_SVHS,
191862306a36Sopenharmony_ci		.gpiomask       = 0xdf,
191962306a36Sopenharmony_ci		.muxsel         = MUXSEL(2),
192062306a36Sopenharmony_ci		.pll            = PLL_28,
192162306a36Sopenharmony_ci	},
192262306a36Sopenharmony_ci	[BTTV_BOARD_IVCE8784] = {
192362306a36Sopenharmony_ci		.name           = "IVCE-8784",
192462306a36Sopenharmony_ci		.video_inputs   = 1,
192562306a36Sopenharmony_ci		/* .audio_inputs= 0, */
192662306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
192762306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
192862306a36Sopenharmony_ci		.svhs           = NO_SVHS,
192962306a36Sopenharmony_ci		.gpiomask       = 0xdf,
193062306a36Sopenharmony_ci		.muxsel         = MUXSEL(2),
193162306a36Sopenharmony_ci		.pll            = PLL_28,
193262306a36Sopenharmony_ci	},
193362306a36Sopenharmony_ci	[BTTV_BOARD_XGUARD] = {
193462306a36Sopenharmony_ci		.name           = "Grand X-Guard / Trust 814PCI",
193562306a36Sopenharmony_ci		.video_inputs   = 16,
193662306a36Sopenharmony_ci		/* .audio_inputs= 0, */
193762306a36Sopenharmony_ci		.svhs           = NO_SVHS,
193862306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
193962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
194062306a36Sopenharmony_ci		.gpiomask2      = 0xff,
194162306a36Sopenharmony_ci		.muxsel         = MUXSEL(2,2,2,2, 3,3,3,3, 1,1,1,1, 0,0,0,0),
194262306a36Sopenharmony_ci		.muxsel_hook    = xguard_muxsel,
194362306a36Sopenharmony_ci		.no_msp34xx     = 1,
194462306a36Sopenharmony_ci		.no_tda7432     = 1,
194562306a36Sopenharmony_ci		.pll            = PLL_28,
194662306a36Sopenharmony_ci	},
194762306a36Sopenharmony_ci
194862306a36Sopenharmony_ci		/* ---- card 0x68 ---------------------------------- */
194962306a36Sopenharmony_ci	[BTTV_BOARD_NEBULA_DIGITV] = {
195062306a36Sopenharmony_ci		.name           = "Nebula Electronics DigiTV",
195162306a36Sopenharmony_ci		.video_inputs   = 1,
195262306a36Sopenharmony_ci		.svhs           = NO_SVHS,
195362306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
195462306a36Sopenharmony_ci		.no_msp34xx     = 1,
195562306a36Sopenharmony_ci		.no_tda7432     = 1,
195662306a36Sopenharmony_ci		.pll            = PLL_28,
195762306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
195862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
195962306a36Sopenharmony_ci		.has_dvb        = 1,
196062306a36Sopenharmony_ci		.has_remote	= 1,
196162306a36Sopenharmony_ci		.gpiomask	= 0x1b,
196262306a36Sopenharmony_ci		.no_gpioirq     = 1,
196362306a36Sopenharmony_ci	},
196462306a36Sopenharmony_ci	[BTTV_BOARD_PV143] = {
196562306a36Sopenharmony_ci		/* Jorge Boncompte - DTI2 <jorge@dti2.net> */
196662306a36Sopenharmony_ci		.name           = "ProVideo PV143",
196762306a36Sopenharmony_ci		.video_inputs   = 4,
196862306a36Sopenharmony_ci		/* .audio_inputs= 0, */
196962306a36Sopenharmony_ci		.svhs           = NO_SVHS,
197062306a36Sopenharmony_ci		.gpiomask       = 0,
197162306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
197262306a36Sopenharmony_ci		.gpiomux        = { 0 },
197362306a36Sopenharmony_ci		.no_msp34xx     = 1,
197462306a36Sopenharmony_ci		.pll            = PLL_28,
197562306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
197662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
197762306a36Sopenharmony_ci	},
197862306a36Sopenharmony_ci	[BTTV_BOARD_VD009X1_VD011_MINIDIN] = {
197962306a36Sopenharmony_ci		/* M.Klahr@phytec.de */
198062306a36Sopenharmony_ci		.name           = "PHYTEC VD-009-X1 VD-011 MiniDIN (bt878)",
198162306a36Sopenharmony_ci		.video_inputs   = 4,
198262306a36Sopenharmony_ci		/* .audio_inputs= 0, */
198362306a36Sopenharmony_ci		.svhs           = 3,
198462306a36Sopenharmony_ci		.gpiomask       = 0x00,
198562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
198662306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
198762306a36Sopenharmony_ci		.pll            = PLL_28,
198862306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
198962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
199062306a36Sopenharmony_ci	},
199162306a36Sopenharmony_ci	[BTTV_BOARD_VD009X1_VD011_COMBI] = {
199262306a36Sopenharmony_ci		.name           = "PHYTEC VD-009-X1 VD-011 Combi (bt878)",
199362306a36Sopenharmony_ci		.video_inputs   = 4,
199462306a36Sopenharmony_ci		/* .audio_inputs= 0, */
199562306a36Sopenharmony_ci		.svhs           = 3,
199662306a36Sopenharmony_ci		.gpiomask       = 0x00,
199762306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
199862306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
199962306a36Sopenharmony_ci		.pll            = PLL_28,
200062306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
200162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
200262306a36Sopenharmony_ci	},
200362306a36Sopenharmony_ci
200462306a36Sopenharmony_ci		/* ---- card 0x6c ---------------------------------- */
200562306a36Sopenharmony_ci	[BTTV_BOARD_VD009_MINIDIN] = {
200662306a36Sopenharmony_ci		.name           = "PHYTEC VD-009 MiniDIN (bt878)",
200762306a36Sopenharmony_ci		.video_inputs   = 10,
200862306a36Sopenharmony_ci		/* .audio_inputs= 0, */
200962306a36Sopenharmony_ci		.svhs           = 9,
201062306a36Sopenharmony_ci		.gpiomask       = 0x00,
201162306a36Sopenharmony_ci		.gpiomask2      = 0x03, /* used for external video mux */
201262306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 2, 2, 2, 3, 3, 3, 3, 1, 0),
201362306a36Sopenharmony_ci		.muxsel_hook	= phytec_muxsel,
201462306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
201562306a36Sopenharmony_ci		.pll            = PLL_28,
201662306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
201762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
201862306a36Sopenharmony_ci	},
201962306a36Sopenharmony_ci	[BTTV_BOARD_VD009_COMBI] = {
202062306a36Sopenharmony_ci		.name           = "PHYTEC VD-009 Combi (bt878)",
202162306a36Sopenharmony_ci		.video_inputs   = 10,
202262306a36Sopenharmony_ci		/* .audio_inputs= 0, */
202362306a36Sopenharmony_ci		.svhs           = 9,
202462306a36Sopenharmony_ci		.gpiomask       = 0x00,
202562306a36Sopenharmony_ci		.gpiomask2      = 0x03, /* used for external video mux */
202662306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 2, 2, 2, 3, 3, 3, 3, 1, 1),
202762306a36Sopenharmony_ci		.muxsel_hook	= phytec_muxsel,
202862306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
202962306a36Sopenharmony_ci		.pll            = PLL_28,
203062306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
203162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
203262306a36Sopenharmony_ci	},
203362306a36Sopenharmony_ci	[BTTV_BOARD_IVC100] = {
203462306a36Sopenharmony_ci		.name           = "IVC-100",
203562306a36Sopenharmony_ci		.video_inputs   = 4,
203662306a36Sopenharmony_ci		/* .audio_inputs= 0, */
203762306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
203862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
203962306a36Sopenharmony_ci		.svhs           = NO_SVHS,
204062306a36Sopenharmony_ci		.gpiomask       = 0xdf,
204162306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
204262306a36Sopenharmony_ci		.pll            = PLL_28,
204362306a36Sopenharmony_ci	},
204462306a36Sopenharmony_ci	[BTTV_BOARD_IVC120] = {
204562306a36Sopenharmony_ci		/* IVC-120G - Alan Garfield <alan@fromorbit.com> */
204662306a36Sopenharmony_ci		.name           = "IVC-120G",
204762306a36Sopenharmony_ci		.video_inputs   = 16,
204862306a36Sopenharmony_ci		/* .audio_inputs= 0, */
204962306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
205062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
205162306a36Sopenharmony_ci		.svhs           = NO_SVHS,   /* card has no svhs */
205262306a36Sopenharmony_ci		.no_msp34xx     = 1,
205362306a36Sopenharmony_ci		.no_tda7432     = 1,
205462306a36Sopenharmony_ci		.gpiomask       = 0x00,
205562306a36Sopenharmony_ci		.muxsel         = MUXSEL(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
205662306a36Sopenharmony_ci		.muxsel_hook    = ivc120_muxsel,
205762306a36Sopenharmony_ci		.pll            = PLL_28,
205862306a36Sopenharmony_ci	},
205962306a36Sopenharmony_ci
206062306a36Sopenharmony_ci		/* ---- card 0x70 ---------------------------------- */
206162306a36Sopenharmony_ci	[BTTV_BOARD_PC_HDTV] = {
206262306a36Sopenharmony_ci		.name           = "pcHDTV HD-2000 TV",
206362306a36Sopenharmony_ci		.video_inputs   = 4,
206462306a36Sopenharmony_ci		/* .audio_inputs= 1, */
206562306a36Sopenharmony_ci		.svhs           = 2,
206662306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
206762306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FCV1236D,
206862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
206962306a36Sopenharmony_ci		.has_dvb        = 1,
207062306a36Sopenharmony_ci	},
207162306a36Sopenharmony_ci	[BTTV_BOARD_TWINHAN_DST] = {
207262306a36Sopenharmony_ci		.name           = "Twinhan DST + clones",
207362306a36Sopenharmony_ci		.no_msp34xx     = 1,
207462306a36Sopenharmony_ci		.no_tda7432     = 1,
207562306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
207662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
207762306a36Sopenharmony_ci		.no_video       = 1,
207862306a36Sopenharmony_ci		.has_dvb        = 1,
207962306a36Sopenharmony_ci	},
208062306a36Sopenharmony_ci	[BTTV_BOARD_WINFASTVC100] = {
208162306a36Sopenharmony_ci		.name           = "Winfast VC100",
208262306a36Sopenharmony_ci		.video_inputs   = 3,
208362306a36Sopenharmony_ci		/* .audio_inputs= 0, */
208462306a36Sopenharmony_ci		.svhs           = 1,
208562306a36Sopenharmony_ci		/* Vid In, SVid In, Vid over SVid in connector */
208662306a36Sopenharmony_ci		.muxsel		= MUXSEL(3, 1, 1, 3),
208762306a36Sopenharmony_ci		.no_msp34xx     = 1,
208862306a36Sopenharmony_ci		.no_tda7432     = 1,
208962306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
209062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
209162306a36Sopenharmony_ci		.pll            = PLL_28,
209262306a36Sopenharmony_ci	},
209362306a36Sopenharmony_ci	[BTTV_BOARD_TEV560] = {
209462306a36Sopenharmony_ci		.name           = "Teppro TEV-560/InterVision IV-560",
209562306a36Sopenharmony_ci		.video_inputs   = 3,
209662306a36Sopenharmony_ci		/* .audio_inputs= 1, */
209762306a36Sopenharmony_ci		.svhs           = 2,
209862306a36Sopenharmony_ci		.gpiomask       = 3,
209962306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
210062306a36Sopenharmony_ci		.gpiomux        = { 1, 1, 1, 1 },
210162306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
210262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
210362306a36Sopenharmony_ci		.pll            = PLL_35,
210462306a36Sopenharmony_ci	},
210562306a36Sopenharmony_ci
210662306a36Sopenharmony_ci		/* ---- card 0x74 ---------------------------------- */
210762306a36Sopenharmony_ci	[BTTV_BOARD_SIMUS_GVC1100] = {
210862306a36Sopenharmony_ci		.name           = "SIMUS GVC1100",
210962306a36Sopenharmony_ci		.video_inputs   = 4,
211062306a36Sopenharmony_ci		/* .audio_inputs= 0, */
211162306a36Sopenharmony_ci		.svhs           = NO_SVHS,
211262306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
211362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
211462306a36Sopenharmony_ci		.pll            = PLL_28,
211562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 2, 2, 2),
211662306a36Sopenharmony_ci		.gpiomask       = 0x3F,
211762306a36Sopenharmony_ci		.muxsel_hook    = gvc1100_muxsel,
211862306a36Sopenharmony_ci	},
211962306a36Sopenharmony_ci	[BTTV_BOARD_NGSTV_PLUS] = {
212062306a36Sopenharmony_ci		/* Carlos Silva r3pek@r3pek.homelinux.org || card 0x75 */
212162306a36Sopenharmony_ci		.name           = "NGS NGSTV+",
212262306a36Sopenharmony_ci		.video_inputs   = 3,
212362306a36Sopenharmony_ci		.svhs           = 2,
212462306a36Sopenharmony_ci		.gpiomask       = 0x008007,
212562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 0, 0),
212662306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 0, 0 },
212762306a36Sopenharmony_ci		.gpiomute	= 0x000003,
212862306a36Sopenharmony_ci		.pll            = PLL_28,
212962306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
213062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
213162306a36Sopenharmony_ci		.has_remote     = 1,
213262306a36Sopenharmony_ci	},
213362306a36Sopenharmony_ci	[BTTV_BOARD_LMLBT4] = {
213462306a36Sopenharmony_ci		/* http://linuxmedialabs.com */
213562306a36Sopenharmony_ci		.name           = "LMLBT4",
213662306a36Sopenharmony_ci		.video_inputs   = 4, /* IN1,IN2,IN3,IN4 */
213762306a36Sopenharmony_ci		/* .audio_inputs= 0, */
213862306a36Sopenharmony_ci		.svhs           = NO_SVHS,
213962306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
214062306a36Sopenharmony_ci		.no_msp34xx     = 1,
214162306a36Sopenharmony_ci		.no_tda7432     = 1,
214262306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
214362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
214462306a36Sopenharmony_ci	},
214562306a36Sopenharmony_ci	[BTTV_BOARD_TEKRAM_M205] = {
214662306a36Sopenharmony_ci		/* Helmroos Harri <harri.helmroos@pp.inet.fi> */
214762306a36Sopenharmony_ci		.name           = "Tekram M205 PRO",
214862306a36Sopenharmony_ci		.video_inputs   = 3,
214962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
215062306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
215162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
215262306a36Sopenharmony_ci		.svhs           = 2,
215362306a36Sopenharmony_ci		.gpiomask       = 0x68,
215462306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1),
215562306a36Sopenharmony_ci		.gpiomux        = { 0x68, 0x68, 0x61, 0x61 },
215662306a36Sopenharmony_ci		.pll            = PLL_28,
215762306a36Sopenharmony_ci	},
215862306a36Sopenharmony_ci
215962306a36Sopenharmony_ci		/* ---- card 0x78 ---------------------------------- */
216062306a36Sopenharmony_ci	[BTTV_BOARD_CONTVFMI] = {
216162306a36Sopenharmony_ci		/* Javier Cendan Ares <jcendan@lycos.es> */
216262306a36Sopenharmony_ci		/* bt878 TV + FM without subsystem ID */
216362306a36Sopenharmony_ci		.name           = "Conceptronic CONTVFMi",
216462306a36Sopenharmony_ci		.video_inputs   = 3,
216562306a36Sopenharmony_ci		/* .audio_inputs= 1, */
216662306a36Sopenharmony_ci		.svhs           = 2,
216762306a36Sopenharmony_ci		.gpiomask       = 0x008007,
216862306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
216962306a36Sopenharmony_ci		.gpiomux        = { 0, 1, 2, 2 },
217062306a36Sopenharmony_ci		.gpiomute	= 3,
217162306a36Sopenharmony_ci		.pll            = PLL_28,
217262306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
217362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
217462306a36Sopenharmony_ci		.has_remote     = 1,
217562306a36Sopenharmony_ci		.has_radio      = 1,
217662306a36Sopenharmony_ci	},
217762306a36Sopenharmony_ci	[BTTV_BOARD_PICOLO_TETRA_CHIP] = {
217862306a36Sopenharmony_ci		/*Eric DEBIEF <debief@telemsa.com>*/
217962306a36Sopenharmony_ci		/*EURESYS Picolo Tetra : 4 Conexant Fusion 878A, no audio, video input set with analog multiplexers GPIO controlled*/
218062306a36Sopenharmony_ci		/*adds picolo_tetra_muxsel(), picolo_tetra_init(), the following declaration*/
218162306a36Sopenharmony_ci		/*structure and #define BTTV_BOARD_PICOLO_TETRA_CHIP 0x79 in bttv.h*/
218262306a36Sopenharmony_ci		.name           = "Euresys Picolo Tetra",
218362306a36Sopenharmony_ci		.video_inputs   = 4,
218462306a36Sopenharmony_ci		/* .audio_inputs= 0, */
218562306a36Sopenharmony_ci		.svhs           = NO_SVHS,
218662306a36Sopenharmony_ci		.gpiomask       = 0,
218762306a36Sopenharmony_ci		.gpiomask2      = 0x3C<<16,/*Set the GPIO[18]->GPIO[21] as output pin.==> drive the video inputs through analog multiplexers*/
218862306a36Sopenharmony_ci		.no_msp34xx     = 1,
218962306a36Sopenharmony_ci		.no_tda7432     = 1,
219062306a36Sopenharmony_ci		/*878A input is always MUX0, see above.*/
219162306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 2, 2, 2),
219262306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
219362306a36Sopenharmony_ci		.pll            = PLL_28,
219462306a36Sopenharmony_ci		.muxsel_hook    = picolo_tetra_muxsel,/*Required as it doesn't follow the classic input selection policy*/
219562306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
219662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
219762306a36Sopenharmony_ci	},
219862306a36Sopenharmony_ci	[BTTV_BOARD_SPIRIT_TV] = {
219962306a36Sopenharmony_ci		/* Spirit TV Tuner from http://spiritmodems.com.au */
220062306a36Sopenharmony_ci		/* Stafford Goodsell <surge@goliath.homeunix.org> */
220162306a36Sopenharmony_ci		.name           = "Spirit TV Tuner",
220262306a36Sopenharmony_ci		.video_inputs   = 3,
220362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
220462306a36Sopenharmony_ci		.svhs           = 2,
220562306a36Sopenharmony_ci		.gpiomask       = 0x0000000f,
220662306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 1, 1),
220762306a36Sopenharmony_ci		.gpiomux        = { 0x02, 0x00, 0x00, 0x00 },
220862306a36Sopenharmony_ci		.tuner_type     = TUNER_TEMIC_PAL,
220962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
221062306a36Sopenharmony_ci		.no_msp34xx     = 1,
221162306a36Sopenharmony_ci	},
221262306a36Sopenharmony_ci	[BTTV_BOARD_AVDVBT_771] = {
221362306a36Sopenharmony_ci		/* Wolfram Joost <wojo@frokaschwei.de> */
221462306a36Sopenharmony_ci		.name           = "AVerMedia AVerTV DVB-T 771",
221562306a36Sopenharmony_ci		.video_inputs   = 2,
221662306a36Sopenharmony_ci		.svhs           = 1,
221762306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
221862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
221962306a36Sopenharmony_ci		.muxsel         = MUXSEL(3, 3),
222062306a36Sopenharmony_ci		.no_msp34xx     = 1,
222162306a36Sopenharmony_ci		.no_tda7432     = 1,
222262306a36Sopenharmony_ci		.pll            = PLL_28,
222362306a36Sopenharmony_ci		.has_dvb        = 1,
222462306a36Sopenharmony_ci		.no_gpioirq     = 1,
222562306a36Sopenharmony_ci		.has_remote     = 1,
222662306a36Sopenharmony_ci	},
222762306a36Sopenharmony_ci		/* ---- card 0x7c ---------------------------------- */
222862306a36Sopenharmony_ci	[BTTV_BOARD_AVDVBT_761] = {
222962306a36Sopenharmony_ci		/* Matt Jesson <dvb@jesson.eclipse.co.uk> */
223062306a36Sopenharmony_ci		/* Based on the Nebula card data - added remote and new card number - BTTV_BOARD_AVDVBT_761, see also ir-kbd-gpio.c */
223162306a36Sopenharmony_ci		.name           = "AverMedia AverTV DVB-T 761",
223262306a36Sopenharmony_ci		.video_inputs   = 2,
223362306a36Sopenharmony_ci		.svhs           = 1,
223462306a36Sopenharmony_ci		.muxsel         = MUXSEL(3, 1, 2, 0), /* Comp0, S-Video, ?, ? */
223562306a36Sopenharmony_ci		.no_msp34xx     = 1,
223662306a36Sopenharmony_ci		.no_tda7432     = 1,
223762306a36Sopenharmony_ci		.pll            = PLL_28,
223862306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
223962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
224062306a36Sopenharmony_ci		.has_dvb        = 1,
224162306a36Sopenharmony_ci		.no_gpioirq     = 1,
224262306a36Sopenharmony_ci		.has_remote     = 1,
224362306a36Sopenharmony_ci	},
224462306a36Sopenharmony_ci	[BTTV_BOARD_MATRIX_VISIONSQ] = {
224562306a36Sopenharmony_ci		/* andre.schwarz@matrix-vision.de */
224662306a36Sopenharmony_ci		.name		= "MATRIX Vision Sigma-SQ",
224762306a36Sopenharmony_ci		.video_inputs	= 16,
224862306a36Sopenharmony_ci		/* .audio_inputs= 0, */
224962306a36Sopenharmony_ci		.svhs		= NO_SVHS,
225062306a36Sopenharmony_ci		.gpiomask	= 0x0,
225162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3),
225262306a36Sopenharmony_ci		.muxsel_hook	= sigmaSQ_muxsel,
225362306a36Sopenharmony_ci		.gpiomux	= { 0 },
225462306a36Sopenharmony_ci		.no_msp34xx	= 1,
225562306a36Sopenharmony_ci		.pll		= PLL_28,
225662306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
225762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
225862306a36Sopenharmony_ci	},
225962306a36Sopenharmony_ci	[BTTV_BOARD_MATRIX_VISIONSLC] = {
226062306a36Sopenharmony_ci		/* andre.schwarz@matrix-vision.de */
226162306a36Sopenharmony_ci		.name		= "MATRIX Vision Sigma-SLC",
226262306a36Sopenharmony_ci		.video_inputs	= 4,
226362306a36Sopenharmony_ci		/* .audio_inputs= 0, */
226462306a36Sopenharmony_ci		.svhs		= NO_SVHS,
226562306a36Sopenharmony_ci		.gpiomask	= 0x0,
226662306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 2, 2, 2),
226762306a36Sopenharmony_ci		.muxsel_hook	= sigmaSLC_muxsel,
226862306a36Sopenharmony_ci		.gpiomux	= { 0 },
226962306a36Sopenharmony_ci		.no_msp34xx	= 1,
227062306a36Sopenharmony_ci		.pll		= PLL_28,
227162306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
227262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
227362306a36Sopenharmony_ci	},
227462306a36Sopenharmony_ci		/* BTTV_BOARD_APAC_VIEWCOMP */
227562306a36Sopenharmony_ci	[BTTV_BOARD_APAC_VIEWCOMP] = {
227662306a36Sopenharmony_ci		/* Attila Kondoros <attila.kondoros@chello.hu> */
227762306a36Sopenharmony_ci		/* bt878 TV + FM 0x00000000 subsystem ID */
227862306a36Sopenharmony_ci		.name           = "APAC Viewcomp 878(AMAX)",
227962306a36Sopenharmony_ci		.video_inputs   = 2,
228062306a36Sopenharmony_ci		/* .audio_inputs= 1, */
228162306a36Sopenharmony_ci		.svhs           = NO_SVHS,
228262306a36Sopenharmony_ci		.gpiomask       = 0xFF,
228362306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
228462306a36Sopenharmony_ci		.gpiomux        = { 2, 0, 0, 0 },
228562306a36Sopenharmony_ci		.gpiomute	= 10,
228662306a36Sopenharmony_ci		.pll            = PLL_28,
228762306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
228862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
228962306a36Sopenharmony_ci		.has_remote     = 1,   /* miniremote works, see ir-kbd-gpio.c */
229062306a36Sopenharmony_ci		.has_radio      = 1,   /* not every card has radio */
229162306a36Sopenharmony_ci	},
229262306a36Sopenharmony_ci
229362306a36Sopenharmony_ci		/* ---- card 0x80 ---------------------------------- */
229462306a36Sopenharmony_ci	[BTTV_BOARD_DVICO_DVBT_LITE] = {
229562306a36Sopenharmony_ci		/* Chris Pascoe <c.pascoe@itee.uq.edu.au> */
229662306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T Lite",
229762306a36Sopenharmony_ci		.no_msp34xx     = 1,
229862306a36Sopenharmony_ci		.no_tda7432     = 1,
229962306a36Sopenharmony_ci		.pll            = PLL_28,
230062306a36Sopenharmony_ci		.no_video       = 1,
230162306a36Sopenharmony_ci		.has_dvb        = 1,
230262306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
230362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
230462306a36Sopenharmony_ci	},
230562306a36Sopenharmony_ci	[BTTV_BOARD_VGEAR_MYVCD] = {
230662306a36Sopenharmony_ci		/* Steven <photon38@pchome.com.tw> */
230762306a36Sopenharmony_ci		.name           = "V-Gear MyVCD",
230862306a36Sopenharmony_ci		.video_inputs   = 3,
230962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
231062306a36Sopenharmony_ci		.svhs           = 2,
231162306a36Sopenharmony_ci		.gpiomask       = 0x3f,
231262306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
231362306a36Sopenharmony_ci		.gpiomux        = {0x31, 0x31, 0x31, 0x31 },
231462306a36Sopenharmony_ci		.gpiomute	= 0x31,
231562306a36Sopenharmony_ci		.no_msp34xx     = 1,
231662306a36Sopenharmony_ci		.pll            = PLL_28,
231762306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_NTSC_M,
231862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
231962306a36Sopenharmony_ci		.has_radio      = 0,
232062306a36Sopenharmony_ci	},
232162306a36Sopenharmony_ci	[BTTV_BOARD_SUPER_TV] = {
232262306a36Sopenharmony_ci		/* Rick C <cryptdragoon@gmail.com> */
232362306a36Sopenharmony_ci		.name           = "Super TV Tuner",
232462306a36Sopenharmony_ci		.video_inputs   = 4,
232562306a36Sopenharmony_ci		/* .audio_inputs= 1, */
232662306a36Sopenharmony_ci		.svhs           = 2,
232762306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
232862306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_NTSC,
232962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
233062306a36Sopenharmony_ci		.gpiomask       = 0x008007,
233162306a36Sopenharmony_ci		.gpiomux        = { 0, 0x000001,0,0 },
233262306a36Sopenharmony_ci		.has_radio      = 1,
233362306a36Sopenharmony_ci	},
233462306a36Sopenharmony_ci	[BTTV_BOARD_TIBET_CS16] = {
233562306a36Sopenharmony_ci		/* Chris Fanning <video4linux@haydon.net> */
233662306a36Sopenharmony_ci		.name           = "Tibet Systems 'Progress DVR' CS16",
233762306a36Sopenharmony_ci		.video_inputs   = 16,
233862306a36Sopenharmony_ci		/* .audio_inputs= 0, */
233962306a36Sopenharmony_ci		.svhs           = NO_SVHS,
234062306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
234162306a36Sopenharmony_ci		.pll		= PLL_28,
234262306a36Sopenharmony_ci		.no_msp34xx     = 1,
234362306a36Sopenharmony_ci		.no_tda7432	= 1,
234462306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
234562306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
234662306a36Sopenharmony_ci		.muxsel_hook    = tibetCS16_muxsel,
234762306a36Sopenharmony_ci	},
234862306a36Sopenharmony_ci	[BTTV_BOARD_KODICOM_4400R] = {
234962306a36Sopenharmony_ci		/* Bill Brack <wbrack@mmm.com.hk> */
235062306a36Sopenharmony_ci		/*
235162306a36Sopenharmony_ci		* Note that, because of the card's wiring, the "master"
235262306a36Sopenharmony_ci		* BT878A chip (i.e. the one which controls the analog switch
235362306a36Sopenharmony_ci		* and must use this card type) is the 2nd one detected.  The
235462306a36Sopenharmony_ci		* other 3 chips should use card type 0x85, whose description
235562306a36Sopenharmony_ci		* follows this one.  There is a EEPROM on the card (which is
235662306a36Sopenharmony_ci		* connected to the I2C of one of those other chips), but is
235762306a36Sopenharmony_ci		* not currently handled.  There is also a facility for a
235862306a36Sopenharmony_ci		* "monitor", which is also not currently implemented.
235962306a36Sopenharmony_ci		*/
236062306a36Sopenharmony_ci		.name           = "Kodicom 4400R (master)",
236162306a36Sopenharmony_ci		.video_inputs	= 16,
236262306a36Sopenharmony_ci		/* .audio_inputs= 0, */
236362306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
236462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
236562306a36Sopenharmony_ci		.svhs		= NO_SVHS,
236662306a36Sopenharmony_ci		/* GPIO bits 0-9 used for analog switch:
236762306a36Sopenharmony_ci		*   00 - 03:	camera selector
236862306a36Sopenharmony_ci		*   04 - 06:	channel (controller) selector
236962306a36Sopenharmony_ci		*   07:	data (1->on, 0->off)
237062306a36Sopenharmony_ci		*   08:	strobe
237162306a36Sopenharmony_ci		*   09:	reset
237262306a36Sopenharmony_ci		* bit 16 is input from sync separator for the channel
237362306a36Sopenharmony_ci		*/
237462306a36Sopenharmony_ci		.gpiomask	= 0x0003ff,
237562306a36Sopenharmony_ci		.no_gpioirq     = 1,
237662306a36Sopenharmony_ci		.muxsel		= MUXSEL(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3),
237762306a36Sopenharmony_ci		.pll		= PLL_28,
237862306a36Sopenharmony_ci		.no_msp34xx	= 1,
237962306a36Sopenharmony_ci		.no_tda7432	= 1,
238062306a36Sopenharmony_ci		.muxsel_hook	= kodicom4400r_muxsel,
238162306a36Sopenharmony_ci	},
238262306a36Sopenharmony_ci	[BTTV_BOARD_KODICOM_4400R_SL] = {
238362306a36Sopenharmony_ci		/* Bill Brack <wbrack@mmm.com.hk> */
238462306a36Sopenharmony_ci		/* Note that, for reasons unknown, the "master" BT878A chip (i.e. the
238562306a36Sopenharmony_ci		* one which controls the analog switch, and must use the card type)
238662306a36Sopenharmony_ci		* is the 2nd one detected.  The other 3 chips should use this card
238762306a36Sopenharmony_ci		* type
238862306a36Sopenharmony_ci		*/
238962306a36Sopenharmony_ci		.name		= "Kodicom 4400R (slave)",
239062306a36Sopenharmony_ci		.video_inputs	= 16,
239162306a36Sopenharmony_ci		/* .audio_inputs= 0, */
239262306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
239362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
239462306a36Sopenharmony_ci		.svhs		= NO_SVHS,
239562306a36Sopenharmony_ci		.gpiomask	= 0x010000,
239662306a36Sopenharmony_ci		.no_gpioirq     = 1,
239762306a36Sopenharmony_ci		.muxsel		= MUXSEL(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3),
239862306a36Sopenharmony_ci		.pll		= PLL_28,
239962306a36Sopenharmony_ci		.no_msp34xx	= 1,
240062306a36Sopenharmony_ci		.no_tda7432	= 1,
240162306a36Sopenharmony_ci		.muxsel_hook	= kodicom4400r_muxsel,
240262306a36Sopenharmony_ci	},
240362306a36Sopenharmony_ci		/* ---- card 0x86---------------------------------- */
240462306a36Sopenharmony_ci	[BTTV_BOARD_ADLINK_RTV24] = {
240562306a36Sopenharmony_ci		/* Michael Henson <mhenson@clarityvi.com> */
240662306a36Sopenharmony_ci		/* Adlink RTV24 with special unlock codes */
240762306a36Sopenharmony_ci		.name           = "Adlink RTV24",
240862306a36Sopenharmony_ci		.video_inputs   = 4,
240962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
241062306a36Sopenharmony_ci		.svhs           = 2,
241162306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
241262306a36Sopenharmony_ci		.tuner_type     = UNSET,
241362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
241462306a36Sopenharmony_ci		.pll            = PLL_28,
241562306a36Sopenharmony_ci	},
241662306a36Sopenharmony_ci		/* ---- card 0x87---------------------------------- */
241762306a36Sopenharmony_ci	[BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE] = {
241862306a36Sopenharmony_ci		/* Michael Krufky <mkrufky@linuxtv.org> */
241962306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV 5 Lite",
242062306a36Sopenharmony_ci		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
242162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
242262306a36Sopenharmony_ci		.video_inputs   = 3,
242362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
242462306a36Sopenharmony_ci		.svhs           = 2,
242562306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1),
242662306a36Sopenharmony_ci		.gpiomask       = 0x00e00007,
242762306a36Sopenharmony_ci		.gpiomux        = { 0x00400005, 0, 0x00000001, 0 },
242862306a36Sopenharmony_ci		.gpiomute	= 0x00c00007,
242962306a36Sopenharmony_ci		.no_msp34xx     = 1,
243062306a36Sopenharmony_ci		.no_tda7432     = 1,
243162306a36Sopenharmony_ci		.has_dvb        = 1,
243262306a36Sopenharmony_ci	},
243362306a36Sopenharmony_ci		/* ---- card 0x88---------------------------------- */
243462306a36Sopenharmony_ci	[BTTV_BOARD_ACORP_Y878F] = {
243562306a36Sopenharmony_ci		/* Mauro Carvalho Chehab <mchehab@kernel.org> */
243662306a36Sopenharmony_ci		.name		= "Acorp Y878F",
243762306a36Sopenharmony_ci		.video_inputs	= 3,
243862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
243962306a36Sopenharmony_ci		.svhs		= 2,
244062306a36Sopenharmony_ci		.gpiomask	= 0x01fe00,
244162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
244262306a36Sopenharmony_ci		.gpiomux        = { 0x001e00, 0, 0x018000, 0x014000 },
244362306a36Sopenharmony_ci		.gpiomute	= 0x002000,
244462306a36Sopenharmony_ci		.pll		= PLL_28,
244562306a36Sopenharmony_ci		.tuner_type	= TUNER_YMEC_TVF66T5_B_DFF,
244662306a36Sopenharmony_ci		.tuner_addr	= 0xc1 >>1,
244762306a36Sopenharmony_ci		.has_radio	= 1,
244862306a36Sopenharmony_ci	},
244962306a36Sopenharmony_ci		/* ---- card 0x89 ---------------------------------- */
245062306a36Sopenharmony_ci	[BTTV_BOARD_CONCEPTRONIC_CTVFMI2] = {
245162306a36Sopenharmony_ci		.name           = "Conceptronic CTVFMi v2",
245262306a36Sopenharmony_ci		.video_inputs   = 3,
245362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
245462306a36Sopenharmony_ci		.svhs           = 2,
245562306a36Sopenharmony_ci		.gpiomask       = 0x001c0007,
245662306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
245762306a36Sopenharmony_ci		.gpiomux        = { 0, 1, 2, 2 },
245862306a36Sopenharmony_ci		.gpiomute	= 3,
245962306a36Sopenharmony_ci		.pll            = PLL_28,
246062306a36Sopenharmony_ci		.tuner_type     = TUNER_TENA_9533_DI,
246162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
246262306a36Sopenharmony_ci		.has_remote     = 1,
246362306a36Sopenharmony_ci		.has_radio      = 1,
246462306a36Sopenharmony_ci	},
246562306a36Sopenharmony_ci		/* ---- card 0x8a ---------------------------------- */
246662306a36Sopenharmony_ci	[BTTV_BOARD_PV_BT878P_2E] = {
246762306a36Sopenharmony_ci		.name		= "Prolink Pixelview PV-BT878P+ (Rev.2E)",
246862306a36Sopenharmony_ci		.video_inputs	= 5,
246962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
247062306a36Sopenharmony_ci		.svhs		= 3,
247162306a36Sopenharmony_ci		.has_dig_in	= 1,
247262306a36Sopenharmony_ci		.gpiomask	= 0x01fe00,
247362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1, 0), /* in 4 is digital */
247462306a36Sopenharmony_ci		/* .digital_mode= DIGITAL_MODE_CAMERA, */
247562306a36Sopenharmony_ci		.gpiomux	= { 0x00400, 0x10400, 0x04400, 0x80000 },
247662306a36Sopenharmony_ci		.gpiomute	= 0x12400,
247762306a36Sopenharmony_ci		.no_msp34xx	= 1,
247862306a36Sopenharmony_ci		.pll		= PLL_28,
247962306a36Sopenharmony_ci		.tuner_type	= TUNER_LG_PAL_FM,
248062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
248162306a36Sopenharmony_ci		.has_remote	= 1,
248262306a36Sopenharmony_ci	},
248362306a36Sopenharmony_ci		/* ---- card 0x8b ---------------------------------- */
248462306a36Sopenharmony_ci	[BTTV_BOARD_PV_M4900] = {
248562306a36Sopenharmony_ci		/* Sérgio Fortier <sergiofortier@yahoo.com.br> */
248662306a36Sopenharmony_ci		.name           = "Prolink PixelView PlayTV MPEG2 PV-M4900",
248762306a36Sopenharmony_ci		.video_inputs   = 3,
248862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
248962306a36Sopenharmony_ci		.svhs           = 2,
249062306a36Sopenharmony_ci		.gpiomask       = 0x3f,
249162306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
249262306a36Sopenharmony_ci		.gpiomux        = { 0x21, 0x20, 0x24, 0x2c },
249362306a36Sopenharmony_ci		.gpiomute	= 0x29,
249462306a36Sopenharmony_ci		.no_msp34xx     = 1,
249562306a36Sopenharmony_ci		.pll            = PLL_28,
249662306a36Sopenharmony_ci		.tuner_type     = TUNER_YMEC_TVF_5533MF,
249762306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
249862306a36Sopenharmony_ci		.has_radio      = 1,
249962306a36Sopenharmony_ci		.has_remote     = 1,
250062306a36Sopenharmony_ci	},
250162306a36Sopenharmony_ci		/* ---- card 0x8c ---------------------------------- */
250262306a36Sopenharmony_ci	/* Has four Bt878 chips behind a PCI bridge, each chip has:
250362306a36Sopenharmony_ci	     one external BNC composite input (mux 2)
250462306a36Sopenharmony_ci	     three internal composite inputs (unknown muxes)
250562306a36Sopenharmony_ci	     an 18-bit stereo A/D (CS5331A), which has:
250662306a36Sopenharmony_ci	       one external stereo unbalanced (RCA) audio connection
250762306a36Sopenharmony_ci	       one (or 3?) internal stereo balanced (XLR) audio connection
250862306a36Sopenharmony_ci	       input is selected via gpio to a 14052B mux
250962306a36Sopenharmony_ci		 (mask=0x300, unbal=0x000, bal=0x100, ??=0x200,0x300)
251062306a36Sopenharmony_ci	       gain is controlled via an X9221A chip on the I2C bus @0x28
251162306a36Sopenharmony_ci	       sample rate is controlled via gpio to an MK1413S
251262306a36Sopenharmony_ci		 (mask=0x3, 32kHz=0x0, 44.1kHz=0x1, 48kHz=0x2, ??=0x3)
251362306a36Sopenharmony_ci	     There is neither a tuner nor an svideo input. */
251462306a36Sopenharmony_ci	[BTTV_BOARD_OSPREY440]  = {
251562306a36Sopenharmony_ci		.name           = "Osprey 440",
251662306a36Sopenharmony_ci		.video_inputs   = 4,
251762306a36Sopenharmony_ci		/* .audio_inputs= 2, */
251862306a36Sopenharmony_ci		.svhs           = NO_SVHS,
251962306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 0, 1), /* 3,0,1 are guesses */
252062306a36Sopenharmony_ci		.gpiomask	= 0x303,
252162306a36Sopenharmony_ci		.gpiomute	= 0x000, /* int + 32kHz */
252262306a36Sopenharmony_ci		.gpiomux	= { 0, 0, 0x000, 0x100},
252362306a36Sopenharmony_ci		.pll            = PLL_28,
252462306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
252562306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
252662306a36Sopenharmony_ci		.no_msp34xx     = 1,
252762306a36Sopenharmony_ci		.no_tda7432     = 1,
252862306a36Sopenharmony_ci	},
252962306a36Sopenharmony_ci		/* ---- card 0x8d ---------------------------------- */
253062306a36Sopenharmony_ci	[BTTV_BOARD_ASOUND_SKYEYE] = {
253162306a36Sopenharmony_ci		.name		= "Asound Skyeye PCTV",
253262306a36Sopenharmony_ci		.video_inputs	= 3,
253362306a36Sopenharmony_ci		/* .audio_inputs= 1, */
253462306a36Sopenharmony_ci		.svhs		= 2,
253562306a36Sopenharmony_ci		.gpiomask	= 15,
253662306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
253762306a36Sopenharmony_ci		.gpiomux	= { 2, 0, 0, 0 },
253862306a36Sopenharmony_ci		.gpiomute	= 1,
253962306a36Sopenharmony_ci		.pll		= PLL_28,
254062306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_NTSC,
254162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
254262306a36Sopenharmony_ci	},
254362306a36Sopenharmony_ci		/* ---- card 0x8e ---------------------------------- */
254462306a36Sopenharmony_ci	[BTTV_BOARD_SABRENT_TVFM] = {
254562306a36Sopenharmony_ci		.name		= "Sabrent TV-FM (bttv version)",
254662306a36Sopenharmony_ci		.video_inputs	= 3,
254762306a36Sopenharmony_ci		/* .audio_inputs= 1, */
254862306a36Sopenharmony_ci		.svhs		= 2,
254962306a36Sopenharmony_ci		.gpiomask	= 0x108007,
255062306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 1),
255162306a36Sopenharmony_ci		.gpiomux	= { 100000, 100002, 100002, 100000 },
255262306a36Sopenharmony_ci		.no_msp34xx	= 1,
255362306a36Sopenharmony_ci		.no_tda7432     = 1,
255462306a36Sopenharmony_ci		.pll		= PLL_28,
255562306a36Sopenharmony_ci		.tuner_type	= TUNER_TNF_5335MF,
255662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
255762306a36Sopenharmony_ci		.has_radio      = 1,
255862306a36Sopenharmony_ci	},
255962306a36Sopenharmony_ci	/* ---- card 0x8f ---------------------------------- */
256062306a36Sopenharmony_ci	[BTTV_BOARD_HAUPPAUGE_IMPACTVCB] = {
256162306a36Sopenharmony_ci		.name		= "Hauppauge ImpactVCB (bt878)",
256262306a36Sopenharmony_ci		.video_inputs	= 4,
256362306a36Sopenharmony_ci		/* .audio_inputs= 0, */
256462306a36Sopenharmony_ci		.svhs		= NO_SVHS,
256562306a36Sopenharmony_ci		.gpiomask	= 0x0f, /* old: 7 */
256662306a36Sopenharmony_ci		.muxsel		= MUXSEL(0, 1, 3, 2), /* Composite 0-3 */
256762306a36Sopenharmony_ci		.no_msp34xx	= 1,
256862306a36Sopenharmony_ci		.no_tda7432     = 1,
256962306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
257062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
257162306a36Sopenharmony_ci	},
257262306a36Sopenharmony_ci	[BTTV_BOARD_MACHTV_MAGICTV] = {
257362306a36Sopenharmony_ci		/* Julian Calaby <julian.calaby@gmail.com>
257462306a36Sopenharmony_ci		 * Slightly different from original MachTV definition (0x60)
257562306a36Sopenharmony_ci
257662306a36Sopenharmony_ci		 * FIXME: RegSpy says gpiomask should be "0x001c800f", but it
257762306a36Sopenharmony_ci		 * stuffs up remote chip. Bug is a pin on the jaecs is not set
257862306a36Sopenharmony_ci		 * properly (methinks) causing no keyup bits being set */
257962306a36Sopenharmony_ci
258062306a36Sopenharmony_ci		.name           = "MagicTV", /* rebranded MachTV */
258162306a36Sopenharmony_ci		.video_inputs   = 3,
258262306a36Sopenharmony_ci		/* .audio_inputs= 1, */
258362306a36Sopenharmony_ci		.svhs           = 2,
258462306a36Sopenharmony_ci		.gpiomask       = 7,
258562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
258662306a36Sopenharmony_ci		.gpiomux        = { 0, 1, 2, 3 },
258762306a36Sopenharmony_ci		.gpiomute	= 4,
258862306a36Sopenharmony_ci		.tuner_type     = TUNER_TEMIC_4009FR5_PAL,
258962306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
259062306a36Sopenharmony_ci		.pll            = PLL_28,
259162306a36Sopenharmony_ci		.has_radio      = 1,
259262306a36Sopenharmony_ci		.has_remote     = 1,
259362306a36Sopenharmony_ci	},
259462306a36Sopenharmony_ci	[BTTV_BOARD_SSAI_SECURITY] = {
259562306a36Sopenharmony_ci		.name		= "SSAI Security Video Interface",
259662306a36Sopenharmony_ci		.video_inputs	= 4,
259762306a36Sopenharmony_ci		/* .audio_inputs= 0, */
259862306a36Sopenharmony_ci		.svhs		= NO_SVHS,
259962306a36Sopenharmony_ci		.muxsel		= MUXSEL(0, 1, 2, 3),
260062306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
260162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
260262306a36Sopenharmony_ci	},
260362306a36Sopenharmony_ci	[BTTV_BOARD_SSAI_ULTRASOUND] = {
260462306a36Sopenharmony_ci		.name		= "SSAI Ultrasound Video Interface",
260562306a36Sopenharmony_ci		.video_inputs	= 2,
260662306a36Sopenharmony_ci		/* .audio_inputs= 0, */
260762306a36Sopenharmony_ci		.svhs		= 1,
260862306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 0, 1, 3),
260962306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
261062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
261162306a36Sopenharmony_ci	},
261262306a36Sopenharmony_ci	/* ---- card 0x94---------------------------------- */
261362306a36Sopenharmony_ci	[BTTV_BOARD_DVICO_FUSIONHDTV_2] = {
261462306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV 2",
261562306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FCV1236D,
261662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
261762306a36Sopenharmony_ci		.video_inputs   = 3,
261862306a36Sopenharmony_ci		/* .audio_inputs= 1, */
261962306a36Sopenharmony_ci		.svhs           = 2,
262062306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1),
262162306a36Sopenharmony_ci		.gpiomask       = 0x00e00007,
262262306a36Sopenharmony_ci		.gpiomux        = { 0x00400005, 0, 0x00000001, 0 },
262362306a36Sopenharmony_ci		.gpiomute	= 0x00c00007,
262462306a36Sopenharmony_ci		.no_msp34xx     = 1,
262562306a36Sopenharmony_ci		.no_tda7432     = 1,
262662306a36Sopenharmony_ci	},
262762306a36Sopenharmony_ci	/* ---- card 0x95---------------------------------- */
262862306a36Sopenharmony_ci	[BTTV_BOARD_TYPHOON_TVTUNERPCI] = {
262962306a36Sopenharmony_ci		.name           = "Typhoon TV-Tuner PCI (50684)",
263062306a36Sopenharmony_ci		.video_inputs   = 3,
263162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
263262306a36Sopenharmony_ci		.svhs           = 2,
263362306a36Sopenharmony_ci		.gpiomask       = 0x3014f,
263462306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
263562306a36Sopenharmony_ci		.gpiomux        = { 0x20001,0x10001, 0, 0 },
263662306a36Sopenharmony_ci		.gpiomute       = 10,
263762306a36Sopenharmony_ci		.pll            = PLL_28,
263862306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL_I,
263962306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
264062306a36Sopenharmony_ci	},
264162306a36Sopenharmony_ci	[BTTV_BOARD_GEOVISION_GV600] = {
264262306a36Sopenharmony_ci		/* emhn@usb.ve */
264362306a36Sopenharmony_ci		.name		= "Geovision GV-600",
264462306a36Sopenharmony_ci		.video_inputs	= 16,
264562306a36Sopenharmony_ci		/* .audio_inputs= 0, */
264662306a36Sopenharmony_ci		.svhs		= NO_SVHS,
264762306a36Sopenharmony_ci		.gpiomask	= 0x0,
264862306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
264962306a36Sopenharmony_ci		.muxsel_hook	= geovision_muxsel,
265062306a36Sopenharmony_ci		.gpiomux	= { 0 },
265162306a36Sopenharmony_ci		.no_msp34xx	= 1,
265262306a36Sopenharmony_ci		.pll		= PLL_28,
265362306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
265462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
265562306a36Sopenharmony_ci	},
265662306a36Sopenharmony_ci	[BTTV_BOARD_KOZUMI_KTV_01C] = {
265762306a36Sopenharmony_ci		/* Mauro Lacy <mauro@lacy.com.ar>
265862306a36Sopenharmony_ci		 * Based on MagicTV and Conceptronic CONTVFMi */
265962306a36Sopenharmony_ci
266062306a36Sopenharmony_ci		.name           = "Kozumi KTV-01C",
266162306a36Sopenharmony_ci		.video_inputs   = 3,
266262306a36Sopenharmony_ci		/* .audio_inputs= 1, */
266362306a36Sopenharmony_ci		.svhs           = 2,
266462306a36Sopenharmony_ci		.gpiomask       = 0x008007,
266562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
266662306a36Sopenharmony_ci		.gpiomux        = { 0, 1, 2, 2 }, /* CONTVFMi */
266762306a36Sopenharmony_ci		.gpiomute	= 3, /* CONTVFMi */
266862306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3, /* TCL MK3 */
266962306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
267062306a36Sopenharmony_ci		.pll            = PLL_28,
267162306a36Sopenharmony_ci		.has_radio      = 1,
267262306a36Sopenharmony_ci		.has_remote     = 1,
267362306a36Sopenharmony_ci	},
267462306a36Sopenharmony_ci	[BTTV_BOARD_ENLTV_FM_2] = {
267562306a36Sopenharmony_ci		/* Encore TV Tuner Pro ENL TV-FM-2
267662306a36Sopenharmony_ci		   Mauro Carvalho Chehab <mchehab@kernel.org> */
267762306a36Sopenharmony_ci		.name           = "Encore ENL TV-FM-2",
267862306a36Sopenharmony_ci		.video_inputs   = 3,
267962306a36Sopenharmony_ci		/* .audio_inputs= 1, */
268062306a36Sopenharmony_ci		.svhs           = 2,
268162306a36Sopenharmony_ci		/* bit 6          -> IR disabled
268262306a36Sopenharmony_ci		   bit 18/17 = 00 -> mute
268362306a36Sopenharmony_ci			       01 -> enable external audio input
268462306a36Sopenharmony_ci			       10 -> internal audio input (mono?)
268562306a36Sopenharmony_ci			       11 -> internal audio input
268662306a36Sopenharmony_ci		 */
268762306a36Sopenharmony_ci		.gpiomask       = 0x060040,
268862306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 3),
268962306a36Sopenharmony_ci		.gpiomux        = { 0x60000, 0x60000, 0x20000, 0x20000 },
269062306a36Sopenharmony_ci		.gpiomute	= 0,
269162306a36Sopenharmony_ci		.tuner_type	= TUNER_TCL_MF02GIP_5N,
269262306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
269362306a36Sopenharmony_ci		.pll            = PLL_28,
269462306a36Sopenharmony_ci		.has_radio      = 1,
269562306a36Sopenharmony_ci		.has_remote     = 1,
269662306a36Sopenharmony_ci	},
269762306a36Sopenharmony_ci	[BTTV_BOARD_VD012] = {
269862306a36Sopenharmony_ci		/* D.Heer@Phytec.de */
269962306a36Sopenharmony_ci		.name           = "PHYTEC VD-012 (bt878)",
270062306a36Sopenharmony_ci		.video_inputs   = 4,
270162306a36Sopenharmony_ci		/* .audio_inputs= 0, */
270262306a36Sopenharmony_ci		.svhs           = NO_SVHS,
270362306a36Sopenharmony_ci		.gpiomask       = 0x00,
270462306a36Sopenharmony_ci		.muxsel         = MUXSEL(0, 2, 3, 1),
270562306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
270662306a36Sopenharmony_ci		.pll            = PLL_28,
270762306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
270862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
270962306a36Sopenharmony_ci	},
271062306a36Sopenharmony_ci	[BTTV_BOARD_VD012_X1] = {
271162306a36Sopenharmony_ci		/* D.Heer@Phytec.de */
271262306a36Sopenharmony_ci		.name           = "PHYTEC VD-012-X1 (bt878)",
271362306a36Sopenharmony_ci		.video_inputs   = 4,
271462306a36Sopenharmony_ci		/* .audio_inputs= 0, */
271562306a36Sopenharmony_ci		.svhs           = 3,
271662306a36Sopenharmony_ci		.gpiomask       = 0x00,
271762306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1),
271862306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
271962306a36Sopenharmony_ci		.pll            = PLL_28,
272062306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
272162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
272262306a36Sopenharmony_ci	},
272362306a36Sopenharmony_ci	[BTTV_BOARD_VD012_X2] = {
272462306a36Sopenharmony_ci		/* D.Heer@Phytec.de */
272562306a36Sopenharmony_ci		.name           = "PHYTEC VD-012-X2 (bt878)",
272662306a36Sopenharmony_ci		.video_inputs   = 4,
272762306a36Sopenharmony_ci		/* .audio_inputs= 0, */
272862306a36Sopenharmony_ci		.svhs           = 3,
272962306a36Sopenharmony_ci		.gpiomask       = 0x00,
273062306a36Sopenharmony_ci		.muxsel         = MUXSEL(3, 2, 1),
273162306a36Sopenharmony_ci		.gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
273262306a36Sopenharmony_ci		.pll            = PLL_28,
273362306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
273462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
273562306a36Sopenharmony_ci	},
273662306a36Sopenharmony_ci	[BTTV_BOARD_GEOVISION_GV800S] = {
273762306a36Sopenharmony_ci		/* Bruno Christo <bchristo@inf.ufsm.br>
273862306a36Sopenharmony_ci		 *
273962306a36Sopenharmony_ci		 * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
274062306a36Sopenharmony_ci		 *	1 audio input  per BT878A = 4 audio inputs
274162306a36Sopenharmony_ci		 *	4 video inputs per BT878A = 16 video inputs
274262306a36Sopenharmony_ci		 * This is the first BT878A chip of the GV-800(S). It's the
274362306a36Sopenharmony_ci		 * "master" chip and it controls the video inputs through an
274462306a36Sopenharmony_ci		 * analog multiplexer (a CD22M3494) via some GPIO pins. The
274562306a36Sopenharmony_ci		 * slaves should use card type 0x9e (following this one).
274662306a36Sopenharmony_ci		 * There is a EEPROM on the card which is currently not handled.
274762306a36Sopenharmony_ci		 * The audio input is not working yet.
274862306a36Sopenharmony_ci		 */
274962306a36Sopenharmony_ci		.name           = "Geovision GV-800(S) (master)",
275062306a36Sopenharmony_ci		.video_inputs   = 4,
275162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
275262306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
275362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
275462306a36Sopenharmony_ci		.svhs           = NO_SVHS,
275562306a36Sopenharmony_ci		.gpiomask	= 0xf107f,
275662306a36Sopenharmony_ci		.no_gpioirq     = 1,
275762306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 2, 2, 2),
275862306a36Sopenharmony_ci		.pll		= PLL_28,
275962306a36Sopenharmony_ci		.no_msp34xx	= 1,
276062306a36Sopenharmony_ci		.no_tda7432	= 1,
276162306a36Sopenharmony_ci		.muxsel_hook    = gv800s_muxsel,
276262306a36Sopenharmony_ci	},
276362306a36Sopenharmony_ci	[BTTV_BOARD_GEOVISION_GV800S_SL] = {
276462306a36Sopenharmony_ci		/* Bruno Christo <bchristo@inf.ufsm.br>
276562306a36Sopenharmony_ci		 *
276662306a36Sopenharmony_ci		 * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
276762306a36Sopenharmony_ci		 *	1 audio input  per BT878A = 4 audio inputs
276862306a36Sopenharmony_ci		 *	4 video inputs per BT878A = 16 video inputs
276962306a36Sopenharmony_ci		 * The 3 other BT878A chips are "slave" chips of the GV-800(S)
277062306a36Sopenharmony_ci		 * and should use this card type.
277162306a36Sopenharmony_ci		 * The audio input is not working yet.
277262306a36Sopenharmony_ci		 */
277362306a36Sopenharmony_ci		.name           = "Geovision GV-800(S) (slave)",
277462306a36Sopenharmony_ci		.video_inputs   = 4,
277562306a36Sopenharmony_ci		/* .audio_inputs= 1, */
277662306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
277762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
277862306a36Sopenharmony_ci		.svhs           = NO_SVHS,
277962306a36Sopenharmony_ci		.gpiomask	= 0x00,
278062306a36Sopenharmony_ci		.no_gpioirq     = 1,
278162306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 2, 2, 2),
278262306a36Sopenharmony_ci		.pll		= PLL_28,
278362306a36Sopenharmony_ci		.no_msp34xx	= 1,
278462306a36Sopenharmony_ci		.no_tda7432	= 1,
278562306a36Sopenharmony_ci		.muxsel_hook    = gv800s_muxsel,
278662306a36Sopenharmony_ci	},
278762306a36Sopenharmony_ci	[BTTV_BOARD_PV183] = {
278862306a36Sopenharmony_ci		.name           = "ProVideo PV183", /* 0x9f */
278962306a36Sopenharmony_ci		.video_inputs   = 2,
279062306a36Sopenharmony_ci		/* .audio_inputs= 0, */
279162306a36Sopenharmony_ci		.svhs           = NO_SVHS,
279262306a36Sopenharmony_ci		.gpiomask       = 0,
279362306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3),
279462306a36Sopenharmony_ci		.gpiomux        = { 0 },
279562306a36Sopenharmony_ci		.no_msp34xx     = 1,
279662306a36Sopenharmony_ci		.pll            = PLL_28,
279762306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
279862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
279962306a36Sopenharmony_ci	},
280062306a36Sopenharmony_ci	/* ---- card 0xa0---------------------------------- */
280162306a36Sopenharmony_ci	[BTTV_BOARD_TVT_TD3116] = {
280262306a36Sopenharmony_ci		.name           = "Tongwei Video Technology TD-3116",
280362306a36Sopenharmony_ci		.video_inputs   = 16,
280462306a36Sopenharmony_ci		.gpiomask       = 0xc00ff,
280562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
280662306a36Sopenharmony_ci		.muxsel_hook    = td3116_muxsel,
280762306a36Sopenharmony_ci		.svhs           = NO_SVHS,
280862306a36Sopenharmony_ci		.pll		= PLL_28,
280962306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
281062306a36Sopenharmony_ci	},
281162306a36Sopenharmony_ci	[BTTV_BOARD_APOSONIC_WDVR] = {
281262306a36Sopenharmony_ci		.name           = "Aposonic W-DVR",
281362306a36Sopenharmony_ci		.video_inputs   = 4,
281462306a36Sopenharmony_ci		.svhs           = NO_SVHS,
281562306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 0),
281662306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
281762306a36Sopenharmony_ci	},
281862306a36Sopenharmony_ci	[BTTV_BOARD_ADLINK_MPG24] = {
281962306a36Sopenharmony_ci		/* Adlink MPG24 */
282062306a36Sopenharmony_ci		.name           = "Adlink MPG24",
282162306a36Sopenharmony_ci		.video_inputs   = 1,
282262306a36Sopenharmony_ci		/* .audio_inputs= 1, */
282362306a36Sopenharmony_ci		.svhs           = NO_SVHS,
282462306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 2, 2, 2),
282562306a36Sopenharmony_ci		.tuner_type     = UNSET,
282662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
282762306a36Sopenharmony_ci		.pll            = PLL_28,
282862306a36Sopenharmony_ci	},
282962306a36Sopenharmony_ci	[BTTV_BOARD_BT848_CAP_14] = {
283062306a36Sopenharmony_ci		.name		= "Bt848 Capture 14MHz",
283162306a36Sopenharmony_ci		.video_inputs	= 4,
283262306a36Sopenharmony_ci		.svhs		= 2,
283362306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0),
283462306a36Sopenharmony_ci		.pll		= PLL_14,
283562306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
283662306a36Sopenharmony_ci	},
283762306a36Sopenharmony_ci	[BTTV_BOARD_CYBERVISION_CV06] = {
283862306a36Sopenharmony_ci		.name		= "CyberVision CV06 (SV)",
283962306a36Sopenharmony_ci		.video_inputs	= 4,
284062306a36Sopenharmony_ci		/* .audio_inputs= 0, */
284162306a36Sopenharmony_ci		.svhs		= NO_SVHS,
284262306a36Sopenharmony_ci		.muxsel		= MUXSEL(2, 3, 1, 0),
284362306a36Sopenharmony_ci		.pll		= PLL_28,
284462306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
284562306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
284662306a36Sopenharmony_ci	},
284762306a36Sopenharmony_ci	[BTTV_BOARD_KWORLD_VSTREAM_XPERT] = {
284862306a36Sopenharmony_ci		/* Pojar George <geoubuntu@gmail.com> */
284962306a36Sopenharmony_ci		.name           = "Kworld V-Stream Xpert TV PVR878",
285062306a36Sopenharmony_ci		.video_inputs   = 3,
285162306a36Sopenharmony_ci		/* .audio_inputs= 1, */
285262306a36Sopenharmony_ci		.svhs           = 2,
285362306a36Sopenharmony_ci		.gpiomask       = 0x001c0007,
285462306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3, 1, 1),
285562306a36Sopenharmony_ci		.gpiomux        = { 0, 1, 2, 2 },
285662306a36Sopenharmony_ci		.gpiomute       = 3,
285762306a36Sopenharmony_ci		.pll            = PLL_28,
285862306a36Sopenharmony_ci		.tuner_type     = TUNER_TENA_9533_DI,
285962306a36Sopenharmony_ci		.tuner_addr    = ADDR_UNSET,
286062306a36Sopenharmony_ci		.has_remote     = 1,
286162306a36Sopenharmony_ci		.has_radio      = 1,
286262306a36Sopenharmony_ci	},
286362306a36Sopenharmony_ci	/* ---- card 0xa6---------------------------------- */
286462306a36Sopenharmony_ci	[BTTV_BOARD_PCI_8604PW] = {
286562306a36Sopenharmony_ci		/* PCI-8604PW with special unlock sequence */
286662306a36Sopenharmony_ci		.name           = "PCI-8604PW",
286762306a36Sopenharmony_ci		.video_inputs   = 2,
286862306a36Sopenharmony_ci		/* .audio_inputs= 0, */
286962306a36Sopenharmony_ci		.svhs           = NO_SVHS,
287062306a36Sopenharmony_ci		/* The second input is available on CN4, if populated.
287162306a36Sopenharmony_ci		 * The other 5x2 header (CN2?) connects to the same inputs
287262306a36Sopenharmony_ci		 * as the on-board BNCs */
287362306a36Sopenharmony_ci		.muxsel         = MUXSEL(2, 3),
287462306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
287562306a36Sopenharmony_ci		.no_msp34xx	= 1,
287662306a36Sopenharmony_ci		.no_tda7432	= 1,
287762306a36Sopenharmony_ci		.pll            = PLL_35,
287862306a36Sopenharmony_ci	},
287962306a36Sopenharmony_ci};
288062306a36Sopenharmony_ci
288162306a36Sopenharmony_cistatic const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
288262306a36Sopenharmony_ci
288362306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
288462306a36Sopenharmony_ci
288562306a36Sopenharmony_cistatic unsigned char eeprom_data[256];
288662306a36Sopenharmony_ci
288762306a36Sopenharmony_ci/*
288862306a36Sopenharmony_ci * identify card
288962306a36Sopenharmony_ci */
289062306a36Sopenharmony_civoid bttv_idcard(struct bttv *btv)
289162306a36Sopenharmony_ci{
289262306a36Sopenharmony_ci	unsigned int gpiobits;
289362306a36Sopenharmony_ci	int i,type;
289462306a36Sopenharmony_ci
289562306a36Sopenharmony_ci	/* read PCI subsystem ID */
289662306a36Sopenharmony_ci	btv->cardid  = btv->c.pci->subsystem_device << 16;
289762306a36Sopenharmony_ci	btv->cardid |= btv->c.pci->subsystem_vendor;
289862306a36Sopenharmony_ci
289962306a36Sopenharmony_ci	if (0 != btv->cardid && 0xffffffff != btv->cardid) {
290062306a36Sopenharmony_ci		/* look for the card */
290162306a36Sopenharmony_ci		for (type = -1, i = 0; cards[i].id != 0; i++)
290262306a36Sopenharmony_ci			if (cards[i].id  == btv->cardid)
290362306a36Sopenharmony_ci				type = i;
290462306a36Sopenharmony_ci
290562306a36Sopenharmony_ci		if (type != -1) {
290662306a36Sopenharmony_ci			/* found it */
290762306a36Sopenharmony_ci			pr_info("%d: detected: %s [card=%d], PCI subsystem ID is %04x:%04x\n",
290862306a36Sopenharmony_ci				btv->c.nr, cards[type].name, cards[type].cardnr,
290962306a36Sopenharmony_ci				btv->cardid & 0xffff,
291062306a36Sopenharmony_ci				(btv->cardid >> 16) & 0xffff);
291162306a36Sopenharmony_ci			btv->c.type = cards[type].cardnr;
291262306a36Sopenharmony_ci		} else {
291362306a36Sopenharmony_ci			/* 404 */
291462306a36Sopenharmony_ci			pr_info("%d: subsystem: %04x:%04x (UNKNOWN)\n",
291562306a36Sopenharmony_ci				btv->c.nr, btv->cardid & 0xffff,
291662306a36Sopenharmony_ci				(btv->cardid >> 16) & 0xffff);
291762306a36Sopenharmony_ci			pr_debug("please mail id, board name and the correct card= insmod option to linux-media@vger.kernel.org\n");
291862306a36Sopenharmony_ci		}
291962306a36Sopenharmony_ci	}
292062306a36Sopenharmony_ci
292162306a36Sopenharmony_ci	/* let the user override the autodetected type */
292262306a36Sopenharmony_ci	if (card[btv->c.nr] < bttv_num_tvcards)
292362306a36Sopenharmony_ci		btv->c.type=card[btv->c.nr];
292462306a36Sopenharmony_ci
292562306a36Sopenharmony_ci	/* print which card config we are using */
292662306a36Sopenharmony_ci	pr_info("%d: using: %s [card=%d,%s]\n",
292762306a36Sopenharmony_ci		btv->c.nr, bttv_tvcards[btv->c.type].name, btv->c.type,
292862306a36Sopenharmony_ci		card[btv->c.nr] < bttv_num_tvcards
292962306a36Sopenharmony_ci		? "insmod option" : "autodetected");
293062306a36Sopenharmony_ci
293162306a36Sopenharmony_ci	/* overwrite gpio stuff ?? */
293262306a36Sopenharmony_ci	if (UNSET == audioall && UNSET == audiomux[0])
293362306a36Sopenharmony_ci		return;
293462306a36Sopenharmony_ci
293562306a36Sopenharmony_ci	if (UNSET != audiomux[0]) {
293662306a36Sopenharmony_ci		gpiobits = 0;
293762306a36Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) {
293862306a36Sopenharmony_ci			bttv_tvcards[btv->c.type].gpiomux[i] = audiomux[i];
293962306a36Sopenharmony_ci			gpiobits |= audiomux[i];
294062306a36Sopenharmony_ci		}
294162306a36Sopenharmony_ci	} else {
294262306a36Sopenharmony_ci		gpiobits = audioall;
294362306a36Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) {
294462306a36Sopenharmony_ci			bttv_tvcards[btv->c.type].gpiomux[i] = audioall;
294562306a36Sopenharmony_ci		}
294662306a36Sopenharmony_ci	}
294762306a36Sopenharmony_ci	bttv_tvcards[btv->c.type].gpiomask = (UNSET != gpiomask) ? gpiomask : gpiobits;
294862306a36Sopenharmony_ci	pr_info("%d: gpio config override: mask=0x%x, mux=",
294962306a36Sopenharmony_ci		btv->c.nr, bttv_tvcards[btv->c.type].gpiomask);
295062306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) {
295162306a36Sopenharmony_ci		pr_cont("%s0x%x",
295262306a36Sopenharmony_ci			i ? "," : "", bttv_tvcards[btv->c.type].gpiomux[i]);
295362306a36Sopenharmony_ci	}
295462306a36Sopenharmony_ci	pr_cont("\n");
295562306a36Sopenharmony_ci}
295662306a36Sopenharmony_ci
295762306a36Sopenharmony_ci/*
295862306a36Sopenharmony_ci * (most) board specific initialisations goes here
295962306a36Sopenharmony_ci */
296062306a36Sopenharmony_ci
296162306a36Sopenharmony_ci/* Some Modular Technology cards have an eeprom, but no subsystem ID */
296262306a36Sopenharmony_cistatic void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256])
296362306a36Sopenharmony_ci{
296462306a36Sopenharmony_ci	int type = -1;
296562306a36Sopenharmony_ci
296662306a36Sopenharmony_ci	if (0 == strncmp(eeprom_data,"GET MM20xPCTV",13))
296762306a36Sopenharmony_ci		type = BTTV_BOARD_MODTEC_205;
296862306a36Sopenharmony_ci	else if (0 == strncmp(eeprom_data+20,"Picolo",7))
296962306a36Sopenharmony_ci		type = BTTV_BOARD_EURESYS_PICOLO;
297062306a36Sopenharmony_ci	else if (eeprom_data[0] == 0x84 && eeprom_data[2]== 0)
297162306a36Sopenharmony_ci		type = BTTV_BOARD_HAUPPAUGE; /* old bt848 */
297262306a36Sopenharmony_ci
297362306a36Sopenharmony_ci	if (-1 != type) {
297462306a36Sopenharmony_ci		btv->c.type = type;
297562306a36Sopenharmony_ci		pr_info("%d: detected by eeprom: %s [card=%d]\n",
297662306a36Sopenharmony_ci			btv->c.nr, bttv_tvcards[btv->c.type].name, btv->c.type);
297762306a36Sopenharmony_ci	}
297862306a36Sopenharmony_ci}
297962306a36Sopenharmony_ci
298062306a36Sopenharmony_cistatic void flyvideo_gpio(struct bttv *btv)
298162306a36Sopenharmony_ci{
298262306a36Sopenharmony_ci	int gpio, has_remote, has_radio, is_capture_only;
298362306a36Sopenharmony_ci	int is_lr90, has_tda9820_tda9821;
298462306a36Sopenharmony_ci	int tuner_type = UNSET, ttype;
298562306a36Sopenharmony_ci
298662306a36Sopenharmony_ci	gpio_inout(0xffffff, 0);
298762306a36Sopenharmony_ci	udelay(8);  /* without this we would see the 0x1800 mask */
298862306a36Sopenharmony_ci	gpio = gpio_read();
298962306a36Sopenharmony_ci	/* FIXME: must restore OUR_EN ??? */
299062306a36Sopenharmony_ci
299162306a36Sopenharmony_ci	/* all cards provide GPIO info, some have an additional eeprom
299262306a36Sopenharmony_ci	 * LR50: GPIO coding can be found lower right CP1 .. CP9
299362306a36Sopenharmony_ci	 *       CP9=GPIO23 .. CP1=GPIO15; when OPEN, the corresponding GPIO reads 1.
299462306a36Sopenharmony_ci	 *       GPIO14-12: n.c.
299562306a36Sopenharmony_ci	 * LR90: GP9=GPIO23 .. GP1=GPIO15 (right above the bt878)
299662306a36Sopenharmony_ci
299762306a36Sopenharmony_ci	 * lowest 3 bytes are remote control codes (no handshake needed)
299862306a36Sopenharmony_ci	 * xxxFFF: No remote control chip soldered
299962306a36Sopenharmony_ci	 * xxxF00(LR26/LR50), xxxFE0(LR90): Remote control chip (LVA001 or CF45) soldered
300062306a36Sopenharmony_ci	 * Note: Some bits are Audio_Mask !
300162306a36Sopenharmony_ci	 */
300262306a36Sopenharmony_ci	ttype = (gpio & 0x0f0000) >> 16;
300362306a36Sopenharmony_ci	switch (ttype) {
300462306a36Sopenharmony_ci	case 0x0:
300562306a36Sopenharmony_ci		tuner_type = 2;  /* NTSC, e.g. TPI8NSR11P */
300662306a36Sopenharmony_ci		break;
300762306a36Sopenharmony_ci	case 0x2:
300862306a36Sopenharmony_ci		tuner_type = 39; /* LG NTSC (newer TAPC series) TAPC-H701P */
300962306a36Sopenharmony_ci		break;
301062306a36Sopenharmony_ci	case 0x4:
301162306a36Sopenharmony_ci		tuner_type = 5;  /* Philips PAL TPI8PSB02P, TPI8PSB12P, TPI8PSB12D or FI1216, FM1216 */
301262306a36Sopenharmony_ci		break;
301362306a36Sopenharmony_ci	case 0x6:
301462306a36Sopenharmony_ci		tuner_type = 37; /* LG PAL (newer TAPC series) TAPC-G702P */
301562306a36Sopenharmony_ci		break;
301662306a36Sopenharmony_ci	case 0xC:
301762306a36Sopenharmony_ci		tuner_type = 3;  /* Philips SECAM(+PAL) FQ1216ME or FI1216MF */
301862306a36Sopenharmony_ci		break;
301962306a36Sopenharmony_ci	default:
302062306a36Sopenharmony_ci		pr_info("%d: FlyVideo_gpio: unknown tuner type\n", btv->c.nr);
302162306a36Sopenharmony_ci		break;
302262306a36Sopenharmony_ci	}
302362306a36Sopenharmony_ci
302462306a36Sopenharmony_ci	has_remote          =   gpio & 0x800000;
302562306a36Sopenharmony_ci	has_radio	    =   gpio & 0x400000;
302662306a36Sopenharmony_ci	/*   unknown                   0x200000;
302762306a36Sopenharmony_ci	 *   unknown2                  0x100000; */
302862306a36Sopenharmony_ci	is_capture_only     = !(gpio & 0x008000); /* GPIO15 */
302962306a36Sopenharmony_ci	has_tda9820_tda9821 = !(gpio & 0x004000);
303062306a36Sopenharmony_ci	is_lr90             = !(gpio & 0x002000); /* else LR26/LR50 (LR38/LR51 f. capture only) */
303162306a36Sopenharmony_ci	/*
303262306a36Sopenharmony_ci	 * gpio & 0x001000    output bit for audio routing */
303362306a36Sopenharmony_ci
303462306a36Sopenharmony_ci	if (is_capture_only)
303562306a36Sopenharmony_ci		tuner_type = TUNER_ABSENT; /* No tuner present */
303662306a36Sopenharmony_ci
303762306a36Sopenharmony_ci	pr_info("%d: FlyVideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n",
303862306a36Sopenharmony_ci		btv->c.nr, has_radio ? "yes" : "no",
303962306a36Sopenharmony_ci		has_remote ? "yes" : "no", tuner_type, gpio);
304062306a36Sopenharmony_ci	pr_info("%d: FlyVideo  LR90=%s tda9821/tda9820=%s capture_only=%s\n",
304162306a36Sopenharmony_ci		btv->c.nr, is_lr90 ? "yes" : "no",
304262306a36Sopenharmony_ci		has_tda9820_tda9821 ? "yes" : "no",
304362306a36Sopenharmony_ci		is_capture_only ? "yes" : "no");
304462306a36Sopenharmony_ci
304562306a36Sopenharmony_ci	if (tuner_type != UNSET) /* only set if known tuner autodetected, else let insmod option through */
304662306a36Sopenharmony_ci		btv->tuner_type = tuner_type;
304762306a36Sopenharmony_ci	btv->has_radio = has_radio;
304862306a36Sopenharmony_ci
304962306a36Sopenharmony_ci	/* LR90 Audio Routing is done by 2 hef4052, so Audio_Mask has 4 bits: 0x001c80
305062306a36Sopenharmony_ci	 * LR26/LR50 only has 1 hef4052, Audio_Mask 0x000c00
305162306a36Sopenharmony_ci	 * Audio options: from tuner, from tda9821/tda9821(mono,stereo,sap), from tda9874, ext., mute */
305262306a36Sopenharmony_ci	if (has_tda9820_tda9821)
305362306a36Sopenharmony_ci		btv->audio_mode_gpio = lt9415_audio;
305462306a36Sopenharmony_ci	/* todo: if(has_tda9874) btv->audio_mode_gpio = fv2000s_audio; */
305562306a36Sopenharmony_ci}
305662306a36Sopenharmony_ci
305762306a36Sopenharmony_cistatic int miro_tunermap[] = { 0,6,2,3,   4,5,6,0,  3,0,4,5,  5,2,16,1,
305862306a36Sopenharmony_ci			       14,2,17,1, 4,1,4,3,  1,2,16,1, 4,4,4,4 };
305962306a36Sopenharmony_cistatic int miro_fmtuner[]  = { 0,0,0,0,   0,0,0,0,  0,0,0,0,  0,0,0,1,
306062306a36Sopenharmony_ci			       1,1,1,1,   1,1,1,0,  0,0,0,0,  0,1,0,0 };
306162306a36Sopenharmony_ci
306262306a36Sopenharmony_cistatic void miro_pinnacle_gpio(struct bttv *btv)
306362306a36Sopenharmony_ci{
306462306a36Sopenharmony_ci	int id,msp,gpio;
306562306a36Sopenharmony_ci	char *info;
306662306a36Sopenharmony_ci
306762306a36Sopenharmony_ci	gpio_inout(0xffffff, 0);
306862306a36Sopenharmony_ci	gpio = gpio_read();
306962306a36Sopenharmony_ci	id   = ((gpio>>10) & 63) -1;
307062306a36Sopenharmony_ci	msp  = bttv_I2CRead(btv, I2C_ADDR_MSP3400, "MSP34xx");
307162306a36Sopenharmony_ci	if (id < 32) {
307262306a36Sopenharmony_ci		btv->tuner_type = miro_tunermap[id];
307362306a36Sopenharmony_ci		if (0 == (gpio & 0x20)) {
307462306a36Sopenharmony_ci			btv->has_radio = 1;
307562306a36Sopenharmony_ci			if (!miro_fmtuner[id]) {
307662306a36Sopenharmony_ci				btv->has_tea575x = 1;
307762306a36Sopenharmony_ci				btv->tea_gpio.wren = 6;
307862306a36Sopenharmony_ci				btv->tea_gpio.most = 7;
307962306a36Sopenharmony_ci				btv->tea_gpio.clk  = 8;
308062306a36Sopenharmony_ci				btv->tea_gpio.data = 9;
308162306a36Sopenharmony_ci				tea575x_init(btv);
308262306a36Sopenharmony_ci			}
308362306a36Sopenharmony_ci		} else {
308462306a36Sopenharmony_ci			btv->has_radio = 0;
308562306a36Sopenharmony_ci		}
308662306a36Sopenharmony_ci		if (-1 != msp) {
308762306a36Sopenharmony_ci			if (btv->c.type == BTTV_BOARD_MIRO)
308862306a36Sopenharmony_ci				btv->c.type = BTTV_BOARD_MIROPRO;
308962306a36Sopenharmony_ci			if (btv->c.type == BTTV_BOARD_PINNACLE)
309062306a36Sopenharmony_ci				btv->c.type = BTTV_BOARD_PINNACLEPRO;
309162306a36Sopenharmony_ci		}
309262306a36Sopenharmony_ci		pr_info("%d: miro: id=%d tuner=%d radio=%s stereo=%s\n",
309362306a36Sopenharmony_ci			btv->c.nr, id+1, btv->tuner_type,
309462306a36Sopenharmony_ci			!btv->has_radio ? "no" :
309562306a36Sopenharmony_ci			(btv->has_tea575x ? "tea575x" : "fmtuner"),
309662306a36Sopenharmony_ci			(-1 == msp) ? "no" : "yes");
309762306a36Sopenharmony_ci	} else {
309862306a36Sopenharmony_ci		/* new cards with microtune tuner */
309962306a36Sopenharmony_ci		id = 63 - id;
310062306a36Sopenharmony_ci		btv->has_radio = 0;
310162306a36Sopenharmony_ci		switch (id) {
310262306a36Sopenharmony_ci		case 1:
310362306a36Sopenharmony_ci			info = "PAL / mono";
310462306a36Sopenharmony_ci			btv->tda9887_conf = TDA9887_INTERCARRIER;
310562306a36Sopenharmony_ci			break;
310662306a36Sopenharmony_ci		case 2:
310762306a36Sopenharmony_ci			info = "PAL+SECAM / stereo";
310862306a36Sopenharmony_ci			btv->has_radio = 1;
310962306a36Sopenharmony_ci			btv->tda9887_conf = TDA9887_QSS;
311062306a36Sopenharmony_ci			break;
311162306a36Sopenharmony_ci		case 3:
311262306a36Sopenharmony_ci			info = "NTSC / stereo";
311362306a36Sopenharmony_ci			btv->has_radio = 1;
311462306a36Sopenharmony_ci			btv->tda9887_conf = TDA9887_QSS;
311562306a36Sopenharmony_ci			break;
311662306a36Sopenharmony_ci		case 4:
311762306a36Sopenharmony_ci			info = "PAL+SECAM / mono";
311862306a36Sopenharmony_ci			btv->tda9887_conf = TDA9887_QSS;
311962306a36Sopenharmony_ci			break;
312062306a36Sopenharmony_ci		case 5:
312162306a36Sopenharmony_ci			info = "NTSC / mono";
312262306a36Sopenharmony_ci			btv->tda9887_conf = TDA9887_INTERCARRIER;
312362306a36Sopenharmony_ci			break;
312462306a36Sopenharmony_ci		case 6:
312562306a36Sopenharmony_ci			info = "NTSC / stereo";
312662306a36Sopenharmony_ci			btv->tda9887_conf = TDA9887_INTERCARRIER;
312762306a36Sopenharmony_ci			break;
312862306a36Sopenharmony_ci		case 7:
312962306a36Sopenharmony_ci			info = "PAL / stereo";
313062306a36Sopenharmony_ci			btv->tda9887_conf = TDA9887_INTERCARRIER;
313162306a36Sopenharmony_ci			break;
313262306a36Sopenharmony_ci		default:
313362306a36Sopenharmony_ci			info = "oops: unknown card";
313462306a36Sopenharmony_ci			break;
313562306a36Sopenharmony_ci		}
313662306a36Sopenharmony_ci		if (-1 != msp)
313762306a36Sopenharmony_ci			btv->c.type = BTTV_BOARD_PINNACLEPRO;
313862306a36Sopenharmony_ci		pr_info("%d: pinnacle/mt: id=%d info=\"%s\" radio=%s\n",
313962306a36Sopenharmony_ci			btv->c.nr, id, info, btv->has_radio ? "yes" : "no");
314062306a36Sopenharmony_ci		btv->tuner_type = TUNER_MT2032;
314162306a36Sopenharmony_ci	}
314262306a36Sopenharmony_ci}
314362306a36Sopenharmony_ci
314462306a36Sopenharmony_ci/* GPIO21   L: Buffer aktiv, H: Buffer inaktiv */
314562306a36Sopenharmony_ci#define LM1882_SYNC_DRIVE     0x200000L
314662306a36Sopenharmony_ci
314762306a36Sopenharmony_cistatic void init_ids_eagle(struct bttv *btv)
314862306a36Sopenharmony_ci{
314962306a36Sopenharmony_ci	gpio_inout(0xffffff,0xFFFF37);
315062306a36Sopenharmony_ci	gpio_write(0x200020);
315162306a36Sopenharmony_ci
315262306a36Sopenharmony_ci	/* flash strobe inverter ?! */
315362306a36Sopenharmony_ci	gpio_write(0x200024);
315462306a36Sopenharmony_ci
315562306a36Sopenharmony_ci	/* switch sync drive off */
315662306a36Sopenharmony_ci	gpio_bits(LM1882_SYNC_DRIVE,LM1882_SYNC_DRIVE);
315762306a36Sopenharmony_ci
315862306a36Sopenharmony_ci	/* set BT848 muxel to 2 */
315962306a36Sopenharmony_ci	btaor((2)<<5, ~(2<<5), BT848_IFORM);
316062306a36Sopenharmony_ci}
316162306a36Sopenharmony_ci
316262306a36Sopenharmony_ci/* Muxsel helper for the IDS Eagle.
316362306a36Sopenharmony_ci * the eagles does not use the standard muxsel-bits but
316462306a36Sopenharmony_ci * has its own multiplexer */
316562306a36Sopenharmony_cistatic void eagle_muxsel(struct bttv *btv, unsigned int input)
316662306a36Sopenharmony_ci{
316762306a36Sopenharmony_ci	gpio_bits(3, input & 3);
316862306a36Sopenharmony_ci
316962306a36Sopenharmony_ci	/* composite */
317062306a36Sopenharmony_ci	/* set chroma ADC to sleep */
317162306a36Sopenharmony_ci	btor(BT848_ADC_C_SLEEP, BT848_ADC);
317262306a36Sopenharmony_ci	/* set to composite video */
317362306a36Sopenharmony_ci	btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
317462306a36Sopenharmony_ci	btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
317562306a36Sopenharmony_ci
317662306a36Sopenharmony_ci	/* switch sync drive off */
317762306a36Sopenharmony_ci	gpio_bits(LM1882_SYNC_DRIVE,LM1882_SYNC_DRIVE);
317862306a36Sopenharmony_ci}
317962306a36Sopenharmony_ci
318062306a36Sopenharmony_cistatic void gvc1100_muxsel(struct bttv *btv, unsigned int input)
318162306a36Sopenharmony_ci{
318262306a36Sopenharmony_ci	static const int masks[] = {0x30, 0x01, 0x12, 0x23};
318362306a36Sopenharmony_ci	gpio_write(masks[input%4]);
318462306a36Sopenharmony_ci}
318562306a36Sopenharmony_ci
318662306a36Sopenharmony_ci/* LMLBT4x initialization - to allow access to GPIO bits for sensors input and
318762306a36Sopenharmony_ci   alarms output
318862306a36Sopenharmony_ci
318962306a36Sopenharmony_ci   GPIObit    | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
319062306a36Sopenharmony_ci   assignment | TI | O3|INx| O2| O1|IN4|IN3|IN2|IN1|   |   |
319162306a36Sopenharmony_ci
319262306a36Sopenharmony_ci   IN - sensor inputs, INx - sensor inputs and TI XORed together
319362306a36Sopenharmony_ci   O1,O2,O3 - alarm outputs (relays)
319462306a36Sopenharmony_ci
319562306a36Sopenharmony_ci   OUT ENABLE   1    1   0  . 1  1   0   0 . 0   0   0    0   = 0x6C0
319662306a36Sopenharmony_ci
319762306a36Sopenharmony_ci*/
319862306a36Sopenharmony_ci
319962306a36Sopenharmony_cistatic void init_lmlbt4x(struct bttv *btv)
320062306a36Sopenharmony_ci{
320162306a36Sopenharmony_ci	pr_debug("LMLBT4x init\n");
320262306a36Sopenharmony_ci	btwrite(0x000000, BT848_GPIO_REG_INP);
320362306a36Sopenharmony_ci	gpio_inout(0xffffff, 0x0006C0);
320462306a36Sopenharmony_ci	gpio_write(0x000000);
320562306a36Sopenharmony_ci}
320662306a36Sopenharmony_ci
320762306a36Sopenharmony_cistatic void sigmaSQ_muxsel(struct bttv *btv, unsigned int input)
320862306a36Sopenharmony_ci{
320962306a36Sopenharmony_ci	unsigned int inmux = input % 8;
321062306a36Sopenharmony_ci	gpio_inout( 0xf, 0xf );
321162306a36Sopenharmony_ci	gpio_bits( 0xf, inmux );
321262306a36Sopenharmony_ci}
321362306a36Sopenharmony_ci
321462306a36Sopenharmony_cistatic void sigmaSLC_muxsel(struct bttv *btv, unsigned int input)
321562306a36Sopenharmony_ci{
321662306a36Sopenharmony_ci	unsigned int inmux = input % 4;
321762306a36Sopenharmony_ci	gpio_inout( 3<<9, 3<<9 );
321862306a36Sopenharmony_ci	gpio_bits( 3<<9, inmux<<9 );
321962306a36Sopenharmony_ci}
322062306a36Sopenharmony_ci
322162306a36Sopenharmony_cistatic void geovision_muxsel(struct bttv *btv, unsigned int input)
322262306a36Sopenharmony_ci{
322362306a36Sopenharmony_ci	unsigned int inmux = input % 16;
322462306a36Sopenharmony_ci	gpio_inout(0xf, 0xf);
322562306a36Sopenharmony_ci	gpio_bits(0xf, inmux);
322662306a36Sopenharmony_ci}
322762306a36Sopenharmony_ci
322862306a36Sopenharmony_ci/*
322962306a36Sopenharmony_ci * The TD3116 has 2 74HC4051 muxes wired to the MUX0 input of a bt878.
323062306a36Sopenharmony_ci * The first 74HC4051 has the lower 8 inputs, the second one the higher 8.
323162306a36Sopenharmony_ci * The muxes are controlled via a 74HC373 latch which is connected to
323262306a36Sopenharmony_ci * GPIOs 0-7. GPIO 18 is connected to the LE signal of the latch.
323362306a36Sopenharmony_ci * Q0 of the latch is connected to the Enable (~E) input of the first
323462306a36Sopenharmony_ci * 74HC4051. Q1 - Q3 are connected to S0 - S2 of the same 74HC4051.
323562306a36Sopenharmony_ci * Q4 - Q7 are connected to the second 74HC4051 in the same way.
323662306a36Sopenharmony_ci */
323762306a36Sopenharmony_ci
323862306a36Sopenharmony_cistatic void td3116_latch_value(struct bttv *btv, u32 value)
323962306a36Sopenharmony_ci{
324062306a36Sopenharmony_ci	gpio_bits((1<<18) | 0xff, value);
324162306a36Sopenharmony_ci	gpio_bits((1<<18) | 0xff, (1<<18) | value);
324262306a36Sopenharmony_ci	udelay(1);
324362306a36Sopenharmony_ci	gpio_bits((1<<18) | 0xff, value);
324462306a36Sopenharmony_ci}
324562306a36Sopenharmony_ci
324662306a36Sopenharmony_cistatic void td3116_muxsel(struct bttv *btv, unsigned int input)
324762306a36Sopenharmony_ci{
324862306a36Sopenharmony_ci	u32 value;
324962306a36Sopenharmony_ci	u32 highbit;
325062306a36Sopenharmony_ci
325162306a36Sopenharmony_ci	highbit = (input & 0x8) >> 3 ;
325262306a36Sopenharmony_ci
325362306a36Sopenharmony_ci	/* Disable outputs and set value in the mux */
325462306a36Sopenharmony_ci	value = 0x11; /* Disable outputs */
325562306a36Sopenharmony_ci	value |= ((input & 0x7) << 1)  << (4 * highbit);
325662306a36Sopenharmony_ci	td3116_latch_value(btv, value);
325762306a36Sopenharmony_ci
325862306a36Sopenharmony_ci	/* Enable the correct output */
325962306a36Sopenharmony_ci	value &= ~0x11;
326062306a36Sopenharmony_ci	value |= ((highbit ^ 0x1) << 4) | highbit;
326162306a36Sopenharmony_ci	td3116_latch_value(btv, value);
326262306a36Sopenharmony_ci}
326362306a36Sopenharmony_ci
326462306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
326562306a36Sopenharmony_ci
326662306a36Sopenharmony_cistatic void bttv_reset_audio(struct bttv *btv)
326762306a36Sopenharmony_ci{
326862306a36Sopenharmony_ci	/*
326962306a36Sopenharmony_ci	 * BT878A has a audio-reset register.
327062306a36Sopenharmony_ci	 * 1. This register is an audio reset function but it is in
327162306a36Sopenharmony_ci	 *    function-0 (video capture) address space.
327262306a36Sopenharmony_ci	 * 2. It is enough to do this once per power-up of the card.
327362306a36Sopenharmony_ci	 * 3. There is a typo in the Conexant doc -- it is not at
327462306a36Sopenharmony_ci	 *    0x5B, but at 0x058. (B is an odd-number, obviously a typo!).
327562306a36Sopenharmony_ci	 * --//Shrikumar 030609
327662306a36Sopenharmony_ci	 */
327762306a36Sopenharmony_ci	if (btv->id != 878)
327862306a36Sopenharmony_ci		return;
327962306a36Sopenharmony_ci
328062306a36Sopenharmony_ci	if (bttv_debug)
328162306a36Sopenharmony_ci		pr_debug("%d: BT878A ARESET\n", btv->c.nr);
328262306a36Sopenharmony_ci	btwrite((1<<7), 0x058);
328362306a36Sopenharmony_ci	udelay(10);
328462306a36Sopenharmony_ci	btwrite(     0, 0x058);
328562306a36Sopenharmony_ci}
328662306a36Sopenharmony_ci
328762306a36Sopenharmony_ci/* initialization part one -- before registering i2c bus */
328862306a36Sopenharmony_civoid bttv_init_card1(struct bttv *btv)
328962306a36Sopenharmony_ci{
329062306a36Sopenharmony_ci	switch (btv->c.type) {
329162306a36Sopenharmony_ci	case BTTV_BOARD_HAUPPAUGE:
329262306a36Sopenharmony_ci	case BTTV_BOARD_HAUPPAUGE878:
329362306a36Sopenharmony_ci		boot_msp34xx(btv,5);
329462306a36Sopenharmony_ci		break;
329562306a36Sopenharmony_ci	case BTTV_BOARD_VOODOOTV_200:
329662306a36Sopenharmony_ci	case BTTV_BOARD_VOODOOTV_FM:
329762306a36Sopenharmony_ci		boot_msp34xx(btv,20);
329862306a36Sopenharmony_ci		break;
329962306a36Sopenharmony_ci	case BTTV_BOARD_AVERMEDIA98:
330062306a36Sopenharmony_ci		boot_msp34xx(btv,11);
330162306a36Sopenharmony_ci		break;
330262306a36Sopenharmony_ci	case BTTV_BOARD_HAUPPAUGEPVR:
330362306a36Sopenharmony_ci		pvr_boot(btv);
330462306a36Sopenharmony_ci		break;
330562306a36Sopenharmony_ci	case BTTV_BOARD_TWINHAN_DST:
330662306a36Sopenharmony_ci	case BTTV_BOARD_AVDVBT_771:
330762306a36Sopenharmony_ci	case BTTV_BOARD_PINNACLESAT:
330862306a36Sopenharmony_ci		btv->use_i2c_hw = 1;
330962306a36Sopenharmony_ci		break;
331062306a36Sopenharmony_ci	case BTTV_BOARD_ADLINK_RTV24:
331162306a36Sopenharmony_ci		init_RTV24( btv );
331262306a36Sopenharmony_ci		break;
331362306a36Sopenharmony_ci	case BTTV_BOARD_PCI_8604PW:
331462306a36Sopenharmony_ci		init_PCI8604PW(btv);
331562306a36Sopenharmony_ci		break;
331662306a36Sopenharmony_ci
331762306a36Sopenharmony_ci	}
331862306a36Sopenharmony_ci	if (!bttv_tvcards[btv->c.type].has_dvb)
331962306a36Sopenharmony_ci		bttv_reset_audio(btv);
332062306a36Sopenharmony_ci}
332162306a36Sopenharmony_ci
332262306a36Sopenharmony_ci/* initialization part two -- after registering i2c bus */
332362306a36Sopenharmony_civoid bttv_init_card2(struct bttv *btv)
332462306a36Sopenharmony_ci{
332562306a36Sopenharmony_ci	btv->tuner_type = UNSET;
332662306a36Sopenharmony_ci
332762306a36Sopenharmony_ci	if (BTTV_BOARD_UNKNOWN == btv->c.type) {
332862306a36Sopenharmony_ci		bttv_readee(btv,eeprom_data,0xa0);
332962306a36Sopenharmony_ci		identify_by_eeprom(btv,eeprom_data);
333062306a36Sopenharmony_ci	}
333162306a36Sopenharmony_ci
333262306a36Sopenharmony_ci	switch (btv->c.type) {
333362306a36Sopenharmony_ci	case BTTV_BOARD_MIRO:
333462306a36Sopenharmony_ci	case BTTV_BOARD_MIROPRO:
333562306a36Sopenharmony_ci	case BTTV_BOARD_PINNACLE:
333662306a36Sopenharmony_ci	case BTTV_BOARD_PINNACLEPRO:
333762306a36Sopenharmony_ci		/* miro/pinnacle */
333862306a36Sopenharmony_ci		miro_pinnacle_gpio(btv);
333962306a36Sopenharmony_ci		break;
334062306a36Sopenharmony_ci	case BTTV_BOARD_FLYVIDEO_98:
334162306a36Sopenharmony_ci	case BTTV_BOARD_MAXI:
334262306a36Sopenharmony_ci	case BTTV_BOARD_LIFE_FLYKIT:
334362306a36Sopenharmony_ci	case BTTV_BOARD_FLYVIDEO:
334462306a36Sopenharmony_ci	case BTTV_BOARD_TYPHOON_TVIEW:
334562306a36Sopenharmony_ci	case BTTV_BOARD_CHRONOS_VS2:
334662306a36Sopenharmony_ci	case BTTV_BOARD_FLYVIDEO_98FM:
334762306a36Sopenharmony_ci	case BTTV_BOARD_FLYVIDEO2000:
334862306a36Sopenharmony_ci	case BTTV_BOARD_FLYVIDEO98EZ:
334962306a36Sopenharmony_ci	case BTTV_BOARD_CONFERENCETV:
335062306a36Sopenharmony_ci	case BTTV_BOARD_LIFETEC_9415:
335162306a36Sopenharmony_ci		flyvideo_gpio(btv);
335262306a36Sopenharmony_ci		break;
335362306a36Sopenharmony_ci	case BTTV_BOARD_HAUPPAUGE:
335462306a36Sopenharmony_ci	case BTTV_BOARD_HAUPPAUGE878:
335562306a36Sopenharmony_ci	case BTTV_BOARD_HAUPPAUGEPVR:
335662306a36Sopenharmony_ci		/* pick up some config infos from the eeprom */
335762306a36Sopenharmony_ci		bttv_readee(btv,eeprom_data,0xa0);
335862306a36Sopenharmony_ci		hauppauge_eeprom(btv);
335962306a36Sopenharmony_ci		break;
336062306a36Sopenharmony_ci	case BTTV_BOARD_AVERMEDIA98:
336162306a36Sopenharmony_ci	case BTTV_BOARD_AVPHONE98:
336262306a36Sopenharmony_ci		bttv_readee(btv,eeprom_data,0xa0);
336362306a36Sopenharmony_ci		avermedia_eeprom(btv);
336462306a36Sopenharmony_ci		break;
336562306a36Sopenharmony_ci	case BTTV_BOARD_PXC200:
336662306a36Sopenharmony_ci		init_PXC200(btv);
336762306a36Sopenharmony_ci		break;
336862306a36Sopenharmony_ci	case BTTV_BOARD_PICOLO_TETRA_CHIP:
336962306a36Sopenharmony_ci		picolo_tetra_init(btv);
337062306a36Sopenharmony_ci		break;
337162306a36Sopenharmony_ci	case BTTV_BOARD_VHX:
337262306a36Sopenharmony_ci		btv->has_radio    = 1;
337362306a36Sopenharmony_ci		btv->has_tea575x  = 1;
337462306a36Sopenharmony_ci		btv->tea_gpio.wren = 5;
337562306a36Sopenharmony_ci		btv->tea_gpio.most = 6;
337662306a36Sopenharmony_ci		btv->tea_gpio.clk  = 3;
337762306a36Sopenharmony_ci		btv->tea_gpio.data = 4;
337862306a36Sopenharmony_ci		tea575x_init(btv);
337962306a36Sopenharmony_ci		break;
338062306a36Sopenharmony_ci	case BTTV_BOARD_VOBIS_BOOSTAR:
338162306a36Sopenharmony_ci	case BTTV_BOARD_TERRATV:
338262306a36Sopenharmony_ci		terratec_active_radio_upgrade(btv);
338362306a36Sopenharmony_ci		break;
338462306a36Sopenharmony_ci	case BTTV_BOARD_MAGICTVIEW061:
338562306a36Sopenharmony_ci		if (btv->cardid == 0x3002144f) {
338662306a36Sopenharmony_ci			btv->has_radio=1;
338762306a36Sopenharmony_ci			pr_info("%d: radio detected by subsystem id (CPH05x)\n",
338862306a36Sopenharmony_ci				btv->c.nr);
338962306a36Sopenharmony_ci		}
339062306a36Sopenharmony_ci		break;
339162306a36Sopenharmony_ci	case BTTV_BOARD_STB2:
339262306a36Sopenharmony_ci		if (btv->cardid == 0x3060121a) {
339362306a36Sopenharmony_ci			/* Fix up entry for 3DFX VoodooTV 100,
339462306a36Sopenharmony_ci			   which is an OEM STB card variant. */
339562306a36Sopenharmony_ci			btv->has_radio=0;
339662306a36Sopenharmony_ci			btv->tuner_type=TUNER_TEMIC_NTSC;
339762306a36Sopenharmony_ci		}
339862306a36Sopenharmony_ci		break;
339962306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY1x0:
340062306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY1x0_848:
340162306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY101_848:
340262306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY1x1:
340362306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY1x1_SVID:
340462306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY2xx:
340562306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY2x0_SVID:
340662306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY2x0:
340762306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY440:
340862306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY500:
340962306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY540:
341062306a36Sopenharmony_ci	case BTTV_BOARD_OSPREY2000:
341162306a36Sopenharmony_ci		bttv_readee(btv,eeprom_data,0xa0);
341262306a36Sopenharmony_ci		osprey_eeprom(btv, eeprom_data);
341362306a36Sopenharmony_ci		break;
341462306a36Sopenharmony_ci	case BTTV_BOARD_IDS_EAGLE:
341562306a36Sopenharmony_ci		init_ids_eagle(btv);
341662306a36Sopenharmony_ci		break;
341762306a36Sopenharmony_ci	case BTTV_BOARD_MODTEC_205:
341862306a36Sopenharmony_ci		bttv_readee(btv,eeprom_data,0xa0);
341962306a36Sopenharmony_ci		modtec_eeprom(btv);
342062306a36Sopenharmony_ci		break;
342162306a36Sopenharmony_ci	case BTTV_BOARD_LMLBT4:
342262306a36Sopenharmony_ci		init_lmlbt4x(btv);
342362306a36Sopenharmony_ci		break;
342462306a36Sopenharmony_ci	case BTTV_BOARD_TIBET_CS16:
342562306a36Sopenharmony_ci		tibetCS16_init(btv);
342662306a36Sopenharmony_ci		break;
342762306a36Sopenharmony_ci	case BTTV_BOARD_KODICOM_4400R:
342862306a36Sopenharmony_ci		kodicom4400r_init(btv);
342962306a36Sopenharmony_ci		break;
343062306a36Sopenharmony_ci	case BTTV_BOARD_GEOVISION_GV800S:
343162306a36Sopenharmony_ci		gv800s_init(btv);
343262306a36Sopenharmony_ci		break;
343362306a36Sopenharmony_ci	}
343462306a36Sopenharmony_ci
343562306a36Sopenharmony_ci	/* pll configuration */
343662306a36Sopenharmony_ci	if (!(btv->id==848 && btv->revision==0x11)) {
343762306a36Sopenharmony_ci		/* defaults from card list */
343862306a36Sopenharmony_ci		if (PLL_28 == bttv_tvcards[btv->c.type].pll) {
343962306a36Sopenharmony_ci			btv->pll.pll_ifreq=28636363;
344062306a36Sopenharmony_ci			btv->pll.pll_crystal=BT848_IFORM_XT0;
344162306a36Sopenharmony_ci		}
344262306a36Sopenharmony_ci		if (PLL_35 == bttv_tvcards[btv->c.type].pll) {
344362306a36Sopenharmony_ci			btv->pll.pll_ifreq=35468950;
344462306a36Sopenharmony_ci			btv->pll.pll_crystal=BT848_IFORM_XT1;
344562306a36Sopenharmony_ci		}
344662306a36Sopenharmony_ci		if (PLL_14 == bttv_tvcards[btv->c.type].pll) {
344762306a36Sopenharmony_ci			btv->pll.pll_ifreq = 14318181;
344862306a36Sopenharmony_ci			btv->pll.pll_crystal = BT848_IFORM_XT0;
344962306a36Sopenharmony_ci		}
345062306a36Sopenharmony_ci		/* insmod options can override */
345162306a36Sopenharmony_ci		switch (pll[btv->c.nr]) {
345262306a36Sopenharmony_ci		case 0: /* none */
345362306a36Sopenharmony_ci			btv->pll.pll_crystal = 0;
345462306a36Sopenharmony_ci			btv->pll.pll_ifreq   = 0;
345562306a36Sopenharmony_ci			btv->pll.pll_ofreq   = 0;
345662306a36Sopenharmony_ci			break;
345762306a36Sopenharmony_ci		case 1: /* 28 MHz */
345862306a36Sopenharmony_ci		case 28:
345962306a36Sopenharmony_ci			btv->pll.pll_ifreq   = 28636363;
346062306a36Sopenharmony_ci			btv->pll.pll_ofreq   = 0;
346162306a36Sopenharmony_ci			btv->pll.pll_crystal = BT848_IFORM_XT0;
346262306a36Sopenharmony_ci			break;
346362306a36Sopenharmony_ci		case 2: /* 35 MHz */
346462306a36Sopenharmony_ci		case 35:
346562306a36Sopenharmony_ci			btv->pll.pll_ifreq   = 35468950;
346662306a36Sopenharmony_ci			btv->pll.pll_ofreq   = 0;
346762306a36Sopenharmony_ci			btv->pll.pll_crystal = BT848_IFORM_XT1;
346862306a36Sopenharmony_ci			break;
346962306a36Sopenharmony_ci		case 3: /* 14 MHz */
347062306a36Sopenharmony_ci		case 14:
347162306a36Sopenharmony_ci			btv->pll.pll_ifreq   = 14318181;
347262306a36Sopenharmony_ci			btv->pll.pll_ofreq   = 0;
347362306a36Sopenharmony_ci			btv->pll.pll_crystal = BT848_IFORM_XT0;
347462306a36Sopenharmony_ci			break;
347562306a36Sopenharmony_ci		}
347662306a36Sopenharmony_ci	}
347762306a36Sopenharmony_ci	btv->pll.pll_current = -1;
347862306a36Sopenharmony_ci
347962306a36Sopenharmony_ci	/* tuner configuration (from card list / autodetect / insmod option) */
348062306a36Sopenharmony_ci	if (UNSET != bttv_tvcards[btv->c.type].tuner_type)
348162306a36Sopenharmony_ci		if (UNSET == btv->tuner_type)
348262306a36Sopenharmony_ci			btv->tuner_type = bttv_tvcards[btv->c.type].tuner_type;
348362306a36Sopenharmony_ci	if (UNSET != tuner[btv->c.nr])
348462306a36Sopenharmony_ci		btv->tuner_type = tuner[btv->c.nr];
348562306a36Sopenharmony_ci
348662306a36Sopenharmony_ci	if (btv->tuner_type == TUNER_ABSENT)
348762306a36Sopenharmony_ci		pr_info("%d: tuner absent\n", btv->c.nr);
348862306a36Sopenharmony_ci	else if (btv->tuner_type == UNSET)
348962306a36Sopenharmony_ci		pr_warn("%d: tuner type unset\n", btv->c.nr);
349062306a36Sopenharmony_ci	else
349162306a36Sopenharmony_ci		pr_info("%d: tuner type=%d\n", btv->c.nr, btv->tuner_type);
349262306a36Sopenharmony_ci
349362306a36Sopenharmony_ci	if (autoload != UNSET) {
349462306a36Sopenharmony_ci		pr_warn("%d: the autoload option is obsolete\n", btv->c.nr);
349562306a36Sopenharmony_ci		pr_warn("%d: use option msp3400, tda7432 or tvaudio to override which audio module should be used\n",
349662306a36Sopenharmony_ci			btv->c.nr);
349762306a36Sopenharmony_ci	}
349862306a36Sopenharmony_ci
349962306a36Sopenharmony_ci	if (UNSET == btv->tuner_type)
350062306a36Sopenharmony_ci		btv->tuner_type = TUNER_ABSENT;
350162306a36Sopenharmony_ci
350262306a36Sopenharmony_ci	btv->dig = bttv_tvcards[btv->c.type].has_dig_in ?
350362306a36Sopenharmony_ci		   bttv_tvcards[btv->c.type].video_inputs - 1 : UNSET;
350462306a36Sopenharmony_ci	btv->svhs = bttv_tvcards[btv->c.type].svhs == NO_SVHS ?
350562306a36Sopenharmony_ci		    UNSET : bttv_tvcards[btv->c.type].svhs;
350662306a36Sopenharmony_ci	if (svhs[btv->c.nr] != UNSET)
350762306a36Sopenharmony_ci		btv->svhs = svhs[btv->c.nr];
350862306a36Sopenharmony_ci	if (remote[btv->c.nr] != UNSET)
350962306a36Sopenharmony_ci		btv->has_remote = remote[btv->c.nr];
351062306a36Sopenharmony_ci
351162306a36Sopenharmony_ci	if (bttv_tvcards[btv->c.type].has_radio)
351262306a36Sopenharmony_ci		btv->has_radio = 1;
351362306a36Sopenharmony_ci	if (bttv_tvcards[btv->c.type].has_remote)
351462306a36Sopenharmony_ci		btv->has_remote = 1;
351562306a36Sopenharmony_ci	if (!bttv_tvcards[btv->c.type].no_gpioirq)
351662306a36Sopenharmony_ci		btv->gpioirq = 1;
351762306a36Sopenharmony_ci	if (bttv_tvcards[btv->c.type].volume_gpio)
351862306a36Sopenharmony_ci		btv->volume_gpio = bttv_tvcards[btv->c.type].volume_gpio;
351962306a36Sopenharmony_ci	if (bttv_tvcards[btv->c.type].audio_mode_gpio)
352062306a36Sopenharmony_ci		btv->audio_mode_gpio = bttv_tvcards[btv->c.type].audio_mode_gpio;
352162306a36Sopenharmony_ci
352262306a36Sopenharmony_ci	if (btv->tuner_type == TUNER_ABSENT)
352362306a36Sopenharmony_ci		return;  /* no tuner or related drivers to load */
352462306a36Sopenharmony_ci
352562306a36Sopenharmony_ci	if (btv->has_saa6588 || saa6588[btv->c.nr]) {
352662306a36Sopenharmony_ci		/* Probe for RDS receiver chip */
352762306a36Sopenharmony_ci		static const unsigned short addrs[] = {
352862306a36Sopenharmony_ci			0x20 >> 1,
352962306a36Sopenharmony_ci			0x22 >> 1,
353062306a36Sopenharmony_ci			I2C_CLIENT_END
353162306a36Sopenharmony_ci		};
353262306a36Sopenharmony_ci		struct v4l2_subdev *sd;
353362306a36Sopenharmony_ci
353462306a36Sopenharmony_ci		sd = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
353562306a36Sopenharmony_ci			&btv->c.i2c_adap, "saa6588", 0, addrs);
353662306a36Sopenharmony_ci		btv->has_saa6588 = (sd != NULL);
353762306a36Sopenharmony_ci	}
353862306a36Sopenharmony_ci
353962306a36Sopenharmony_ci	/* try to detect audio/fader chips */
354062306a36Sopenharmony_ci
354162306a36Sopenharmony_ci	/* First check if the user specified the audio chip via a module
354262306a36Sopenharmony_ci	   option. */
354362306a36Sopenharmony_ci
354462306a36Sopenharmony_ci	switch (audiodev[btv->c.nr]) {
354562306a36Sopenharmony_ci	case -1:
354662306a36Sopenharmony_ci		return;	/* do not load any audio module */
354762306a36Sopenharmony_ci
354862306a36Sopenharmony_ci	case 0: /* autodetect */
354962306a36Sopenharmony_ci		break;
355062306a36Sopenharmony_ci
355162306a36Sopenharmony_ci	case 1: {
355262306a36Sopenharmony_ci		/* The user specified that we should probe for msp3400 */
355362306a36Sopenharmony_ci		static const unsigned short addrs[] = {
355462306a36Sopenharmony_ci			I2C_ADDR_MSP3400 >> 1,
355562306a36Sopenharmony_ci			I2C_ADDR_MSP3400_ALT >> 1,
355662306a36Sopenharmony_ci			I2C_CLIENT_END
355762306a36Sopenharmony_ci		};
355862306a36Sopenharmony_ci
355962306a36Sopenharmony_ci		btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
356062306a36Sopenharmony_ci			&btv->c.i2c_adap, "msp3400", 0, addrs);
356162306a36Sopenharmony_ci		if (btv->sd_msp34xx)
356262306a36Sopenharmony_ci			return;
356362306a36Sopenharmony_ci		goto no_audio;
356462306a36Sopenharmony_ci	}
356562306a36Sopenharmony_ci
356662306a36Sopenharmony_ci	case 2: {
356762306a36Sopenharmony_ci		/* The user specified that we should probe for tda7432 */
356862306a36Sopenharmony_ci		static const unsigned short addrs[] = {
356962306a36Sopenharmony_ci			I2C_ADDR_TDA7432 >> 1,
357062306a36Sopenharmony_ci			I2C_CLIENT_END
357162306a36Sopenharmony_ci		};
357262306a36Sopenharmony_ci
357362306a36Sopenharmony_ci		if (v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
357462306a36Sopenharmony_ci				&btv->c.i2c_adap, "tda7432", 0, addrs))
357562306a36Sopenharmony_ci			return;
357662306a36Sopenharmony_ci		goto no_audio;
357762306a36Sopenharmony_ci	}
357862306a36Sopenharmony_ci
357962306a36Sopenharmony_ci	case 3: {
358062306a36Sopenharmony_ci		/* The user specified that we should probe for tvaudio */
358162306a36Sopenharmony_ci		btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
358262306a36Sopenharmony_ci			&btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs());
358362306a36Sopenharmony_ci		if (btv->sd_tvaudio)
358462306a36Sopenharmony_ci			return;
358562306a36Sopenharmony_ci		goto no_audio;
358662306a36Sopenharmony_ci	}
358762306a36Sopenharmony_ci
358862306a36Sopenharmony_ci	default:
358962306a36Sopenharmony_ci		pr_warn("%d: unknown audiodev value!\n", btv->c.nr);
359062306a36Sopenharmony_ci		return;
359162306a36Sopenharmony_ci	}
359262306a36Sopenharmony_ci
359362306a36Sopenharmony_ci	/* There were no overrides, so now we try to discover this through the
359462306a36Sopenharmony_ci	   card definition */
359562306a36Sopenharmony_ci
359662306a36Sopenharmony_ci	/* probe for msp3400 first: this driver can detect whether or not
359762306a36Sopenharmony_ci	   it really is a msp3400, so it will return NULL when the device
359862306a36Sopenharmony_ci	   found is really something else (e.g. a tea6300). */
359962306a36Sopenharmony_ci	if (!bttv_tvcards[btv->c.type].no_msp34xx) {
360062306a36Sopenharmony_ci		btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
360162306a36Sopenharmony_ci			&btv->c.i2c_adap, "msp3400",
360262306a36Sopenharmony_ci			0, I2C_ADDRS(I2C_ADDR_MSP3400 >> 1));
360362306a36Sopenharmony_ci	} else if (bttv_tvcards[btv->c.type].msp34xx_alt) {
360462306a36Sopenharmony_ci		btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
360562306a36Sopenharmony_ci			&btv->c.i2c_adap, "msp3400",
360662306a36Sopenharmony_ci			0, I2C_ADDRS(I2C_ADDR_MSP3400_ALT >> 1));
360762306a36Sopenharmony_ci	}
360862306a36Sopenharmony_ci
360962306a36Sopenharmony_ci	/* If we found a msp34xx, then we're done. */
361062306a36Sopenharmony_ci	if (btv->sd_msp34xx)
361162306a36Sopenharmony_ci		return;
361262306a36Sopenharmony_ci
361362306a36Sopenharmony_ci	/* Now see if we can find one of the tvaudio devices. */
361462306a36Sopenharmony_ci	btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
361562306a36Sopenharmony_ci		&btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs());
361662306a36Sopenharmony_ci	if (btv->sd_tvaudio) {
361762306a36Sopenharmony_ci		/* There may be two tvaudio chips on the card, so try to
361862306a36Sopenharmony_ci		   find another. */
361962306a36Sopenharmony_ci		v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
362062306a36Sopenharmony_ci			&btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs());
362162306a36Sopenharmony_ci	}
362262306a36Sopenharmony_ci
362362306a36Sopenharmony_ci	/* it might also be a tda7432. */
362462306a36Sopenharmony_ci	if (!bttv_tvcards[btv->c.type].no_tda7432) {
362562306a36Sopenharmony_ci		static const unsigned short addrs[] = {
362662306a36Sopenharmony_ci			I2C_ADDR_TDA7432 >> 1,
362762306a36Sopenharmony_ci			I2C_CLIENT_END
362862306a36Sopenharmony_ci		};
362962306a36Sopenharmony_ci
363062306a36Sopenharmony_ci		btv->sd_tda7432 = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
363162306a36Sopenharmony_ci				&btv->c.i2c_adap, "tda7432", 0, addrs);
363262306a36Sopenharmony_ci		if (btv->sd_tda7432)
363362306a36Sopenharmony_ci			return;
363462306a36Sopenharmony_ci	}
363562306a36Sopenharmony_ci	if (btv->sd_tvaudio)
363662306a36Sopenharmony_ci		return;
363762306a36Sopenharmony_ci
363862306a36Sopenharmony_cino_audio:
363962306a36Sopenharmony_ci	pr_warn("%d: audio absent, no audio device found!\n", btv->c.nr);
364062306a36Sopenharmony_ci}
364162306a36Sopenharmony_ci
364262306a36Sopenharmony_ci
364362306a36Sopenharmony_ci/* initialize the tuner */
364462306a36Sopenharmony_civoid bttv_init_tuner(struct bttv *btv)
364562306a36Sopenharmony_ci{
364662306a36Sopenharmony_ci	int addr = ADDR_UNSET;
364762306a36Sopenharmony_ci
364862306a36Sopenharmony_ci	if (ADDR_UNSET != bttv_tvcards[btv->c.type].tuner_addr)
364962306a36Sopenharmony_ci		addr = bttv_tvcards[btv->c.type].tuner_addr;
365062306a36Sopenharmony_ci
365162306a36Sopenharmony_ci	if (btv->tuner_type != TUNER_ABSENT) {
365262306a36Sopenharmony_ci		struct tuner_setup tun_setup;
365362306a36Sopenharmony_ci
365462306a36Sopenharmony_ci		/* Load tuner module before issuing tuner config call! */
365562306a36Sopenharmony_ci		if (btv->has_radio)
365662306a36Sopenharmony_ci			v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
365762306a36Sopenharmony_ci				&btv->c.i2c_adap, "tuner",
365862306a36Sopenharmony_ci				0, v4l2_i2c_tuner_addrs(ADDRS_RADIO));
365962306a36Sopenharmony_ci		v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
366062306a36Sopenharmony_ci				&btv->c.i2c_adap, "tuner",
366162306a36Sopenharmony_ci				0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
366262306a36Sopenharmony_ci		v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
366362306a36Sopenharmony_ci				&btv->c.i2c_adap, "tuner",
366462306a36Sopenharmony_ci				0, v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD));
366562306a36Sopenharmony_ci
366662306a36Sopenharmony_ci		tun_setup.mode_mask = T_ANALOG_TV;
366762306a36Sopenharmony_ci		tun_setup.type = btv->tuner_type;
366862306a36Sopenharmony_ci		tun_setup.addr = addr;
366962306a36Sopenharmony_ci
367062306a36Sopenharmony_ci		if (btv->has_radio)
367162306a36Sopenharmony_ci			tun_setup.mode_mask |= T_RADIO;
367262306a36Sopenharmony_ci
367362306a36Sopenharmony_ci		bttv_call_all(btv, tuner, s_type_addr, &tun_setup);
367462306a36Sopenharmony_ci	}
367562306a36Sopenharmony_ci
367662306a36Sopenharmony_ci	if (btv->tda9887_conf) {
367762306a36Sopenharmony_ci		struct v4l2_priv_tun_config tda9887_cfg;
367862306a36Sopenharmony_ci
367962306a36Sopenharmony_ci		tda9887_cfg.tuner = TUNER_TDA9887;
368062306a36Sopenharmony_ci		tda9887_cfg.priv = &btv->tda9887_conf;
368162306a36Sopenharmony_ci
368262306a36Sopenharmony_ci		bttv_call_all(btv, tuner, s_config, &tda9887_cfg);
368362306a36Sopenharmony_ci	}
368462306a36Sopenharmony_ci}
368562306a36Sopenharmony_ci
368662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
368762306a36Sopenharmony_ci
368862306a36Sopenharmony_cistatic void modtec_eeprom(struct bttv *btv)
368962306a36Sopenharmony_ci{
369062306a36Sopenharmony_ci	if( strncmp(&(eeprom_data[0x1e]),"Temic 4066 FY5",14) ==0) {
369162306a36Sopenharmony_ci		btv->tuner_type=TUNER_TEMIC_4066FY5_PAL_I;
369262306a36Sopenharmony_ci		pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",
369362306a36Sopenharmony_ci			btv->c.nr, &eeprom_data[0x1e]);
369462306a36Sopenharmony_ci	} else if (strncmp(&(eeprom_data[0x1e]),"Alps TSBB5",10) ==0) {
369562306a36Sopenharmony_ci		btv->tuner_type=TUNER_ALPS_TSBB5_PAL_I;
369662306a36Sopenharmony_ci		pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",
369762306a36Sopenharmony_ci			btv->c.nr, &eeprom_data[0x1e]);
369862306a36Sopenharmony_ci	} else if (strncmp(&(eeprom_data[0x1e]),"Philips FM1246",14) ==0) {
369962306a36Sopenharmony_ci		btv->tuner_type=TUNER_PHILIPS_NTSC;
370062306a36Sopenharmony_ci		pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",
370162306a36Sopenharmony_ci			btv->c.nr, &eeprom_data[0x1e]);
370262306a36Sopenharmony_ci	} else {
370362306a36Sopenharmony_ci		pr_info("%d: Modtec: Unknown TunerString: %s\n",
370462306a36Sopenharmony_ci			btv->c.nr, &eeprom_data[0x1e]);
370562306a36Sopenharmony_ci	}
370662306a36Sopenharmony_ci}
370762306a36Sopenharmony_ci
370862306a36Sopenharmony_cistatic void hauppauge_eeprom(struct bttv *btv)
370962306a36Sopenharmony_ci{
371062306a36Sopenharmony_ci	struct tveeprom tv;
371162306a36Sopenharmony_ci
371262306a36Sopenharmony_ci	tveeprom_hauppauge_analog(&tv, eeprom_data);
371362306a36Sopenharmony_ci	btv->tuner_type = tv.tuner_type;
371462306a36Sopenharmony_ci	btv->has_radio  = tv.has_radio;
371562306a36Sopenharmony_ci
371662306a36Sopenharmony_ci	pr_info("%d: Hauppauge eeprom indicates model#%d\n",
371762306a36Sopenharmony_ci		btv->c.nr, tv.model);
371862306a36Sopenharmony_ci
371962306a36Sopenharmony_ci	/*
372062306a36Sopenharmony_ci	 * Some of the 878 boards have duplicate PCI IDs. Switch the board
372162306a36Sopenharmony_ci	 * type based on model #.
372262306a36Sopenharmony_ci	 */
372362306a36Sopenharmony_ci	if(tv.model == 64900) {
372462306a36Sopenharmony_ci		pr_info("%d: Switching board type from %s to %s\n",
372562306a36Sopenharmony_ci			btv->c.nr,
372662306a36Sopenharmony_ci			bttv_tvcards[btv->c.type].name,
372762306a36Sopenharmony_ci			bttv_tvcards[BTTV_BOARD_HAUPPAUGE_IMPACTVCB].name);
372862306a36Sopenharmony_ci		btv->c.type = BTTV_BOARD_HAUPPAUGE_IMPACTVCB;
372962306a36Sopenharmony_ci	}
373062306a36Sopenharmony_ci
373162306a36Sopenharmony_ci	/* The 61334 needs the msp3410 to do the radio demod to get sound */
373262306a36Sopenharmony_ci	if (tv.model == 61334)
373362306a36Sopenharmony_ci		btv->radio_uses_msp_demodulator = 1;
373462306a36Sopenharmony_ci}
373562306a36Sopenharmony_ci
373662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
373762306a36Sopenharmony_ci
373862306a36Sopenharmony_cistatic void bttv_tea575x_set_pins(struct snd_tea575x *tea, u8 pins)
373962306a36Sopenharmony_ci{
374062306a36Sopenharmony_ci	struct bttv *btv = tea->private_data;
374162306a36Sopenharmony_ci	struct bttv_tea575x_gpio gpio = btv->tea_gpio;
374262306a36Sopenharmony_ci	u16 val = 0;
374362306a36Sopenharmony_ci
374462306a36Sopenharmony_ci	val |= (pins & TEA575X_DATA) ? (1 << gpio.data) : 0;
374562306a36Sopenharmony_ci	val |= (pins & TEA575X_CLK)  ? (1 << gpio.clk)  : 0;
374662306a36Sopenharmony_ci	val |= (pins & TEA575X_WREN) ? (1 << gpio.wren) : 0;
374762306a36Sopenharmony_ci
374862306a36Sopenharmony_ci	gpio_bits((1 << gpio.data) | (1 << gpio.clk) | (1 << gpio.wren), val);
374962306a36Sopenharmony_ci	if (btv->mbox_ior) {
375062306a36Sopenharmony_ci		/* IOW and CSEL active */
375162306a36Sopenharmony_ci		gpio_bits(btv->mbox_iow | btv->mbox_csel, 0);
375262306a36Sopenharmony_ci		udelay(5);
375362306a36Sopenharmony_ci		/* all inactive */
375462306a36Sopenharmony_ci		gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel,
375562306a36Sopenharmony_ci			  btv->mbox_ior | btv->mbox_iow | btv->mbox_csel);
375662306a36Sopenharmony_ci	}
375762306a36Sopenharmony_ci}
375862306a36Sopenharmony_ci
375962306a36Sopenharmony_cistatic u8 bttv_tea575x_get_pins(struct snd_tea575x *tea)
376062306a36Sopenharmony_ci{
376162306a36Sopenharmony_ci	struct bttv *btv = tea->private_data;
376262306a36Sopenharmony_ci	struct bttv_tea575x_gpio gpio = btv->tea_gpio;
376362306a36Sopenharmony_ci	u8 ret = 0;
376462306a36Sopenharmony_ci	u16 val;
376562306a36Sopenharmony_ci
376662306a36Sopenharmony_ci	if (btv->mbox_ior) {
376762306a36Sopenharmony_ci		/* IOR and CSEL active */
376862306a36Sopenharmony_ci		gpio_bits(btv->mbox_ior | btv->mbox_csel, 0);
376962306a36Sopenharmony_ci		udelay(5);
377062306a36Sopenharmony_ci	}
377162306a36Sopenharmony_ci	val = gpio_read();
377262306a36Sopenharmony_ci	if (btv->mbox_ior) {
377362306a36Sopenharmony_ci		/* all inactive */
377462306a36Sopenharmony_ci		gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel,
377562306a36Sopenharmony_ci			  btv->mbox_ior | btv->mbox_iow | btv->mbox_csel);
377662306a36Sopenharmony_ci	}
377762306a36Sopenharmony_ci
377862306a36Sopenharmony_ci	if (val & (1 << gpio.data))
377962306a36Sopenharmony_ci		ret |= TEA575X_DATA;
378062306a36Sopenharmony_ci	if (val & (1 << gpio.most))
378162306a36Sopenharmony_ci		ret |= TEA575X_MOST;
378262306a36Sopenharmony_ci
378362306a36Sopenharmony_ci	return ret;
378462306a36Sopenharmony_ci}
378562306a36Sopenharmony_ci
378662306a36Sopenharmony_cistatic void bttv_tea575x_set_direction(struct snd_tea575x *tea, bool output)
378762306a36Sopenharmony_ci{
378862306a36Sopenharmony_ci	struct bttv *btv = tea->private_data;
378962306a36Sopenharmony_ci	struct bttv_tea575x_gpio gpio = btv->tea_gpio;
379062306a36Sopenharmony_ci	u32 mask = (1 << gpio.clk) | (1 << gpio.wren) | (1 << gpio.data) |
379162306a36Sopenharmony_ci		   (1 << gpio.most);
379262306a36Sopenharmony_ci
379362306a36Sopenharmony_ci	if (output)
379462306a36Sopenharmony_ci		gpio_inout(mask, (1 << gpio.data) | (1 << gpio.clk) |
379562306a36Sopenharmony_ci				 (1 << gpio.wren));
379662306a36Sopenharmony_ci	else
379762306a36Sopenharmony_ci		gpio_inout(mask, (1 << gpio.clk) | (1 << gpio.wren));
379862306a36Sopenharmony_ci}
379962306a36Sopenharmony_ci
380062306a36Sopenharmony_cistatic const struct snd_tea575x_ops bttv_tea_ops = {
380162306a36Sopenharmony_ci	.set_pins = bttv_tea575x_set_pins,
380262306a36Sopenharmony_ci	.get_pins = bttv_tea575x_get_pins,
380362306a36Sopenharmony_ci	.set_direction = bttv_tea575x_set_direction,
380462306a36Sopenharmony_ci};
380562306a36Sopenharmony_ci
380662306a36Sopenharmony_cistatic int tea575x_init(struct bttv *btv)
380762306a36Sopenharmony_ci{
380862306a36Sopenharmony_ci	btv->tea.private_data = btv;
380962306a36Sopenharmony_ci	btv->tea.ops = &bttv_tea_ops;
381062306a36Sopenharmony_ci	if (!snd_tea575x_hw_init(&btv->tea)) {
381162306a36Sopenharmony_ci		pr_info("%d: detected TEA575x radio\n", btv->c.nr);
381262306a36Sopenharmony_ci		btv->tea.mute = false;
381362306a36Sopenharmony_ci		return 0;
381462306a36Sopenharmony_ci	}
381562306a36Sopenharmony_ci
381662306a36Sopenharmony_ci	btv->has_tea575x = 0;
381762306a36Sopenharmony_ci	btv->has_radio = 0;
381862306a36Sopenharmony_ci
381962306a36Sopenharmony_ci	return -ENODEV;
382062306a36Sopenharmony_ci}
382162306a36Sopenharmony_ci
382262306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
382362306a36Sopenharmony_ci
382462306a36Sopenharmony_cistatic int terratec_active_radio_upgrade(struct bttv *btv)
382562306a36Sopenharmony_ci{
382662306a36Sopenharmony_ci	btv->has_radio    = 1;
382762306a36Sopenharmony_ci	btv->has_tea575x  = 1;
382862306a36Sopenharmony_ci	btv->tea_gpio.wren = 4;
382962306a36Sopenharmony_ci	btv->tea_gpio.most = 5;
383062306a36Sopenharmony_ci	btv->tea_gpio.clk  = 3;
383162306a36Sopenharmony_ci	btv->tea_gpio.data = 2;
383262306a36Sopenharmony_ci
383362306a36Sopenharmony_ci	btv->mbox_iow     = 1 <<  8;
383462306a36Sopenharmony_ci	btv->mbox_ior     = 1 <<  9;
383562306a36Sopenharmony_ci	btv->mbox_csel    = 1 << 10;
383662306a36Sopenharmony_ci
383762306a36Sopenharmony_ci	if (!tea575x_init(btv)) {
383862306a36Sopenharmony_ci		pr_info("%d: Terratec Active Radio Upgrade found\n", btv->c.nr);
383962306a36Sopenharmony_ci		btv->has_saa6588 = 1;
384062306a36Sopenharmony_ci	}
384162306a36Sopenharmony_ci
384262306a36Sopenharmony_ci	return 0;
384362306a36Sopenharmony_ci}
384462306a36Sopenharmony_ci
384562306a36Sopenharmony_ci
384662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
384762306a36Sopenharmony_ci
384862306a36Sopenharmony_ci/*
384962306a36Sopenharmony_ci * minimal bootstrap for the WinTV/PVR -- upload altera firmware.
385062306a36Sopenharmony_ci *
385162306a36Sopenharmony_ci * The hcwamc.rbf firmware file is on the Hauppauge driver CD.  Have
385262306a36Sopenharmony_ci * a look at Pvr/pvr45xxx.EXE (self-extracting zip archive, can be
385362306a36Sopenharmony_ci * unpacked with unzip).
385462306a36Sopenharmony_ci */
385562306a36Sopenharmony_ci#define PVR_GPIO_DELAY		10
385662306a36Sopenharmony_ci
385762306a36Sopenharmony_ci#define BTTV_ALT_DATA		0x000001
385862306a36Sopenharmony_ci#define BTTV_ALT_DCLK		0x100000
385962306a36Sopenharmony_ci#define BTTV_ALT_NCONFIG	0x800000
386062306a36Sopenharmony_ci
386162306a36Sopenharmony_cistatic int pvr_altera_load(struct bttv *btv, const u8 *micro, u32 microlen)
386262306a36Sopenharmony_ci{
386362306a36Sopenharmony_ci	u32 n;
386462306a36Sopenharmony_ci	u8 bits;
386562306a36Sopenharmony_ci	int i;
386662306a36Sopenharmony_ci
386762306a36Sopenharmony_ci	gpio_inout(0xffffff,BTTV_ALT_DATA|BTTV_ALT_DCLK|BTTV_ALT_NCONFIG);
386862306a36Sopenharmony_ci	gpio_write(0);
386962306a36Sopenharmony_ci	udelay(PVR_GPIO_DELAY);
387062306a36Sopenharmony_ci
387162306a36Sopenharmony_ci	gpio_write(BTTV_ALT_NCONFIG);
387262306a36Sopenharmony_ci	udelay(PVR_GPIO_DELAY);
387362306a36Sopenharmony_ci
387462306a36Sopenharmony_ci	for (n = 0; n < microlen; n++) {
387562306a36Sopenharmony_ci		bits = micro[n];
387662306a36Sopenharmony_ci		for (i = 0 ; i < 8 ; i++) {
387762306a36Sopenharmony_ci			gpio_bits(BTTV_ALT_DCLK,0);
387862306a36Sopenharmony_ci			if (bits & 0x01)
387962306a36Sopenharmony_ci				gpio_bits(BTTV_ALT_DATA,BTTV_ALT_DATA);
388062306a36Sopenharmony_ci			else
388162306a36Sopenharmony_ci				gpio_bits(BTTV_ALT_DATA,0);
388262306a36Sopenharmony_ci			gpio_bits(BTTV_ALT_DCLK,BTTV_ALT_DCLK);
388362306a36Sopenharmony_ci			bits >>= 1;
388462306a36Sopenharmony_ci		}
388562306a36Sopenharmony_ci	}
388662306a36Sopenharmony_ci	gpio_bits(BTTV_ALT_DCLK,0);
388762306a36Sopenharmony_ci	udelay(PVR_GPIO_DELAY);
388862306a36Sopenharmony_ci
388962306a36Sopenharmony_ci	/* begin Altera init loop (Not necessary,but doesn't hurt) */
389062306a36Sopenharmony_ci	for (i = 0 ; i < 30 ; i++) {
389162306a36Sopenharmony_ci		gpio_bits(BTTV_ALT_DCLK,0);
389262306a36Sopenharmony_ci		gpio_bits(BTTV_ALT_DCLK,BTTV_ALT_DCLK);
389362306a36Sopenharmony_ci	}
389462306a36Sopenharmony_ci	gpio_bits(BTTV_ALT_DCLK,0);
389562306a36Sopenharmony_ci	return 0;
389662306a36Sopenharmony_ci}
389762306a36Sopenharmony_ci
389862306a36Sopenharmony_cistatic int pvr_boot(struct bttv *btv)
389962306a36Sopenharmony_ci{
390062306a36Sopenharmony_ci	const struct firmware *fw_entry;
390162306a36Sopenharmony_ci	int rc;
390262306a36Sopenharmony_ci
390362306a36Sopenharmony_ci	rc = request_firmware(&fw_entry, "hcwamc.rbf", &btv->c.pci->dev);
390462306a36Sopenharmony_ci	if (rc != 0) {
390562306a36Sopenharmony_ci		pr_warn("%d: no altera firmware [via hotplug]\n", btv->c.nr);
390662306a36Sopenharmony_ci		return rc;
390762306a36Sopenharmony_ci	}
390862306a36Sopenharmony_ci	rc = pvr_altera_load(btv, fw_entry->data, fw_entry->size);
390962306a36Sopenharmony_ci	pr_info("%d: altera firmware upload %s\n",
391062306a36Sopenharmony_ci		btv->c.nr, (rc < 0) ? "failed" : "ok");
391162306a36Sopenharmony_ci	release_firmware(fw_entry);
391262306a36Sopenharmony_ci	return rc;
391362306a36Sopenharmony_ci}
391462306a36Sopenharmony_ci
391562306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
391662306a36Sopenharmony_ci/* some osprey specific stuff                                              */
391762306a36Sopenharmony_ci
391862306a36Sopenharmony_cistatic void osprey_eeprom(struct bttv *btv, const u8 ee[256])
391962306a36Sopenharmony_ci{
392062306a36Sopenharmony_ci	int i;
392162306a36Sopenharmony_ci	u32 serial = 0;
392262306a36Sopenharmony_ci	int cardid = -1;
392362306a36Sopenharmony_ci
392462306a36Sopenharmony_ci	/* This code will never actually get called in this case.... */
392562306a36Sopenharmony_ci	if (btv->c.type == BTTV_BOARD_UNKNOWN) {
392662306a36Sopenharmony_ci		/* this might be an antique... check for MMAC label in eeprom */
392762306a36Sopenharmony_ci		if (!strncmp(ee, "MMAC", 4)) {
392862306a36Sopenharmony_ci			u8 checksum = 0;
392962306a36Sopenharmony_ci			for (i = 0; i < 21; i++)
393062306a36Sopenharmony_ci				checksum += ee[i];
393162306a36Sopenharmony_ci			if (checksum != ee[21])
393262306a36Sopenharmony_ci				return;
393362306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY1x0_848;
393462306a36Sopenharmony_ci			for (i = 12; i < 21; i++) {
393562306a36Sopenharmony_ci				serial *= 10;
393662306a36Sopenharmony_ci				serial += ee[i] - '0';
393762306a36Sopenharmony_ci			}
393862306a36Sopenharmony_ci		}
393962306a36Sopenharmony_ci	} else {
394062306a36Sopenharmony_ci		unsigned short type;
394162306a36Sopenharmony_ci
394262306a36Sopenharmony_ci		for (i = 4 * 16; i < 8 * 16; i += 16) {
394362306a36Sopenharmony_ci			u16 checksum = (__force u16)ip_compute_csum(ee + i, 16);
394462306a36Sopenharmony_ci
394562306a36Sopenharmony_ci			if ((checksum & 0xff) + (checksum >> 8) == 0xff)
394662306a36Sopenharmony_ci				break;
394762306a36Sopenharmony_ci		}
394862306a36Sopenharmony_ci		if (i >= 8*16)
394962306a36Sopenharmony_ci			return;
395062306a36Sopenharmony_ci		ee += i;
395162306a36Sopenharmony_ci
395262306a36Sopenharmony_ci		/* found a valid descriptor */
395362306a36Sopenharmony_ci		type = get_unaligned_be16((__be16 *)(ee+4));
395462306a36Sopenharmony_ci
395562306a36Sopenharmony_ci		switch(type) {
395662306a36Sopenharmony_ci		/* 848 based */
395762306a36Sopenharmony_ci		case 0x0004:
395862306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY1x0_848;
395962306a36Sopenharmony_ci			break;
396062306a36Sopenharmony_ci		case 0x0005:
396162306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY101_848;
396262306a36Sopenharmony_ci			break;
396362306a36Sopenharmony_ci
396462306a36Sopenharmony_ci		/* 878 based */
396562306a36Sopenharmony_ci		case 0x0012:
396662306a36Sopenharmony_ci		case 0x0013:
396762306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY1x0;
396862306a36Sopenharmony_ci			break;
396962306a36Sopenharmony_ci		case 0x0014:
397062306a36Sopenharmony_ci		case 0x0015:
397162306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY1x1;
397262306a36Sopenharmony_ci			break;
397362306a36Sopenharmony_ci		case 0x0016:
397462306a36Sopenharmony_ci		case 0x0017:
397562306a36Sopenharmony_ci		case 0x0020:
397662306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY1x1_SVID;
397762306a36Sopenharmony_ci			break;
397862306a36Sopenharmony_ci		case 0x0018:
397962306a36Sopenharmony_ci		case 0x0019:
398062306a36Sopenharmony_ci		case 0x001E:
398162306a36Sopenharmony_ci		case 0x001F:
398262306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY2xx;
398362306a36Sopenharmony_ci			break;
398462306a36Sopenharmony_ci		case 0x001A:
398562306a36Sopenharmony_ci		case 0x001B:
398662306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY2x0_SVID;
398762306a36Sopenharmony_ci			break;
398862306a36Sopenharmony_ci		case 0x0040:
398962306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY500;
399062306a36Sopenharmony_ci			break;
399162306a36Sopenharmony_ci		case 0x0050:
399262306a36Sopenharmony_ci		case 0x0056:
399362306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY540;
399462306a36Sopenharmony_ci			/* bttv_osprey_540_init(btv); */
399562306a36Sopenharmony_ci			break;
399662306a36Sopenharmony_ci		case 0x0060:
399762306a36Sopenharmony_ci		case 0x0070:
399862306a36Sopenharmony_ci		case 0x00A0:
399962306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY2x0;
400062306a36Sopenharmony_ci			/* enable output on select control lines */
400162306a36Sopenharmony_ci			gpio_inout(0xffffff,0x000303);
400262306a36Sopenharmony_ci			break;
400362306a36Sopenharmony_ci		case 0x00D8:
400462306a36Sopenharmony_ci			cardid = BTTV_BOARD_OSPREY440;
400562306a36Sopenharmony_ci			break;
400662306a36Sopenharmony_ci		default:
400762306a36Sopenharmony_ci			/* unknown...leave generic, but get serial # */
400862306a36Sopenharmony_ci			pr_info("%d: osprey eeprom: unknown card type 0x%04x\n",
400962306a36Sopenharmony_ci				btv->c.nr, type);
401062306a36Sopenharmony_ci			break;
401162306a36Sopenharmony_ci		}
401262306a36Sopenharmony_ci		serial = get_unaligned_be32((__be32 *)(ee+6));
401362306a36Sopenharmony_ci	}
401462306a36Sopenharmony_ci
401562306a36Sopenharmony_ci	pr_info("%d: osprey eeprom: card=%d '%s' serial=%u\n",
401662306a36Sopenharmony_ci		btv->c.nr, cardid,
401762306a36Sopenharmony_ci		cardid > 0 ? bttv_tvcards[cardid].name : "Unknown", serial);
401862306a36Sopenharmony_ci
401962306a36Sopenharmony_ci	if (cardid<0 || btv->c.type == cardid)
402062306a36Sopenharmony_ci		return;
402162306a36Sopenharmony_ci
402262306a36Sopenharmony_ci	/* card type isn't set correctly */
402362306a36Sopenharmony_ci	if (card[btv->c.nr] < bttv_num_tvcards) {
402462306a36Sopenharmony_ci		pr_warn("%d: osprey eeprom: Not overriding user specified card type\n",
402562306a36Sopenharmony_ci			btv->c.nr);
402662306a36Sopenharmony_ci	} else {
402762306a36Sopenharmony_ci		pr_info("%d: osprey eeprom: Changing card type from %d to %d\n",
402862306a36Sopenharmony_ci			btv->c.nr, btv->c.type, cardid);
402962306a36Sopenharmony_ci		btv->c.type = cardid;
403062306a36Sopenharmony_ci	}
403162306a36Sopenharmony_ci}
403262306a36Sopenharmony_ci
403362306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
403462306a36Sopenharmony_ci/* AVermedia specific stuff, from  bktr_card.c                             */
403562306a36Sopenharmony_ci
403662306a36Sopenharmony_cistatic int tuner_0_table[] = {
403762306a36Sopenharmony_ci	TUNER_PHILIPS_NTSC,  TUNER_PHILIPS_PAL /* PAL-BG*/,
403862306a36Sopenharmony_ci	TUNER_PHILIPS_PAL,   TUNER_PHILIPS_PAL /* PAL-I*/,
403962306a36Sopenharmony_ci	TUNER_PHILIPS_PAL,   TUNER_PHILIPS_PAL,
404062306a36Sopenharmony_ci	TUNER_PHILIPS_SECAM, TUNER_PHILIPS_SECAM,
404162306a36Sopenharmony_ci	TUNER_PHILIPS_SECAM, TUNER_PHILIPS_PAL,
404262306a36Sopenharmony_ci	TUNER_PHILIPS_FM1216ME_MK3 };
404362306a36Sopenharmony_ci
404462306a36Sopenharmony_cistatic int tuner_1_table[] = {
404562306a36Sopenharmony_ci	TUNER_TEMIC_NTSC,  TUNER_TEMIC_PAL,
404662306a36Sopenharmony_ci	TUNER_TEMIC_PAL,   TUNER_TEMIC_PAL,
404762306a36Sopenharmony_ci	TUNER_TEMIC_PAL,   TUNER_TEMIC_PAL,
404862306a36Sopenharmony_ci	TUNER_TEMIC_4012FY5, TUNER_TEMIC_4012FY5, /* TUNER_TEMIC_SECAM */
404962306a36Sopenharmony_ci	TUNER_TEMIC_4012FY5, TUNER_TEMIC_PAL};
405062306a36Sopenharmony_ci
405162306a36Sopenharmony_cistatic void avermedia_eeprom(struct bttv *btv)
405262306a36Sopenharmony_ci{
405362306a36Sopenharmony_ci	int tuner_make, tuner_tv_fm, tuner_format, tuner_type = 0;
405462306a36Sopenharmony_ci
405562306a36Sopenharmony_ci	tuner_make      = (eeprom_data[0x41] & 0x7);
405662306a36Sopenharmony_ci	tuner_tv_fm     = (eeprom_data[0x41] & 0x18) >> 3;
405762306a36Sopenharmony_ci	tuner_format    = (eeprom_data[0x42] & 0xf0) >> 4;
405862306a36Sopenharmony_ci	btv->has_remote = (eeprom_data[0x42] & 0x01);
405962306a36Sopenharmony_ci
406062306a36Sopenharmony_ci	if (tuner_make == 0 || tuner_make == 2)
406162306a36Sopenharmony_ci		if (tuner_format <= 0x0a)
406262306a36Sopenharmony_ci			tuner_type = tuner_0_table[tuner_format];
406362306a36Sopenharmony_ci	if (tuner_make == 1)
406462306a36Sopenharmony_ci		if (tuner_format <= 9)
406562306a36Sopenharmony_ci			tuner_type = tuner_1_table[tuner_format];
406662306a36Sopenharmony_ci
406762306a36Sopenharmony_ci	if (tuner_make == 4)
406862306a36Sopenharmony_ci		if (tuner_format == 0x09)
406962306a36Sopenharmony_ci			tuner_type = TUNER_LG_NTSC_NEW_TAPC; /* TAPC-G702P */
407062306a36Sopenharmony_ci
407162306a36Sopenharmony_ci	pr_info("%d: Avermedia eeprom[0x%02x%02x]: tuner=",
407262306a36Sopenharmony_ci		btv->c.nr, eeprom_data[0x41], eeprom_data[0x42]);
407362306a36Sopenharmony_ci	if (tuner_type) {
407462306a36Sopenharmony_ci		btv->tuner_type = tuner_type;
407562306a36Sopenharmony_ci		pr_cont("%d", tuner_type);
407662306a36Sopenharmony_ci	} else
407762306a36Sopenharmony_ci		pr_cont("Unknown type");
407862306a36Sopenharmony_ci	pr_cont(" radio:%s remote control:%s\n",
407962306a36Sopenharmony_ci	       tuner_tv_fm     ? "yes" : "no",
408062306a36Sopenharmony_ci	       btv->has_remote ? "yes" : "no");
408162306a36Sopenharmony_ci}
408262306a36Sopenharmony_ci
408362306a36Sopenharmony_ci/*
408462306a36Sopenharmony_ci * For Voodoo TV/FM and Voodoo 200.  These cards' tuners use a TDA9880
408562306a36Sopenharmony_ci * analog demod, which is not I2C controlled like the newer and more common
408662306a36Sopenharmony_ci * TDA9887 series.  Instead it has two tri-state input pins, S0 and S1,
408762306a36Sopenharmony_ci * that control the IF for the video and audio.  Apparently, bttv GPIO
408862306a36Sopenharmony_ci * 0x10000 is connected to S0.  S0 low selects a 38.9 MHz VIF for B/G/D/K/I
408962306a36Sopenharmony_ci * (i.e., PAL) while high selects 45.75 MHz for M/N (i.e., NTSC).
409062306a36Sopenharmony_ci */
409162306a36Sopenharmony_ciu32 bttv_tda9880_setnorm(struct bttv *btv, u32 gpiobits)
409262306a36Sopenharmony_ci{
409362306a36Sopenharmony_ci
409462306a36Sopenharmony_ci	if (btv->audio_input == TVAUDIO_INPUT_TUNER) {
409562306a36Sopenharmony_ci		if (bttv_tvnorms[btv->tvnorm].v4l2_id & V4L2_STD_MN)
409662306a36Sopenharmony_ci			gpiobits |= 0x10000;
409762306a36Sopenharmony_ci		else
409862306a36Sopenharmony_ci			gpiobits &= ~0x10000;
409962306a36Sopenharmony_ci	}
410062306a36Sopenharmony_ci
410162306a36Sopenharmony_ci	gpio_bits(bttv_tvcards[btv->c.type].gpiomask, gpiobits);
410262306a36Sopenharmony_ci	return gpiobits;
410362306a36Sopenharmony_ci}
410462306a36Sopenharmony_ci
410562306a36Sopenharmony_ci
410662306a36Sopenharmony_ci/*
410762306a36Sopenharmony_ci * reset/enable the MSP on some Hauppauge cards
410862306a36Sopenharmony_ci * Thanks to Kyösti Mälkki (kmalkki@cc.hut.fi)!
410962306a36Sopenharmony_ci *
411062306a36Sopenharmony_ci * Hauppauge:  pin  5
411162306a36Sopenharmony_ci * Voodoo:     pin 20
411262306a36Sopenharmony_ci */
411362306a36Sopenharmony_cistatic void boot_msp34xx(struct bttv *btv, int pin)
411462306a36Sopenharmony_ci{
411562306a36Sopenharmony_ci	int mask = (1 << pin);
411662306a36Sopenharmony_ci
411762306a36Sopenharmony_ci	gpio_inout(mask,mask);
411862306a36Sopenharmony_ci	gpio_bits(mask,0);
411962306a36Sopenharmony_ci	mdelay(2);
412062306a36Sopenharmony_ci	udelay(500);
412162306a36Sopenharmony_ci	gpio_bits(mask,mask);
412262306a36Sopenharmony_ci
412362306a36Sopenharmony_ci	if (bttv_gpio)
412462306a36Sopenharmony_ci		bttv_gpio_tracking(btv,"msp34xx");
412562306a36Sopenharmony_ci	if (bttv_verbose)
412662306a36Sopenharmony_ci		pr_info("%d: Hauppauge/Voodoo msp34xx: reset line init [%d]\n",
412762306a36Sopenharmony_ci			btv->c.nr, pin);
412862306a36Sopenharmony_ci}
412962306a36Sopenharmony_ci
413062306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
413162306a36Sopenharmony_ci/*  Imagenation L-Model PXC200 Framegrabber */
413262306a36Sopenharmony_ci/*  This is basically the same procedure as
413362306a36Sopenharmony_ci *  used by Alessandro Rubini in his pxc200
413462306a36Sopenharmony_ci *  driver, but using BTTV functions */
413562306a36Sopenharmony_ci
413662306a36Sopenharmony_cistatic void init_PXC200(struct bttv *btv)
413762306a36Sopenharmony_ci{
413862306a36Sopenharmony_ci	static int vals[] = { 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0d, 0x01, 0x02,
413962306a36Sopenharmony_ci			      0x03, 0x04, 0x05, 0x06, 0x00 };
414062306a36Sopenharmony_ci	unsigned int i;
414162306a36Sopenharmony_ci	int tmp;
414262306a36Sopenharmony_ci	u32 val;
414362306a36Sopenharmony_ci
414462306a36Sopenharmony_ci	/* Initialise GPIO-connected stuff */
414562306a36Sopenharmony_ci	gpio_inout(0xffffff, (1<<13));
414662306a36Sopenharmony_ci	gpio_write(0);
414762306a36Sopenharmony_ci	udelay(3);
414862306a36Sopenharmony_ci	gpio_write(1<<13);
414962306a36Sopenharmony_ci	/* GPIO inputs are pulled up, so no need to drive
415062306a36Sopenharmony_ci	 * reset pin any longer */
415162306a36Sopenharmony_ci	gpio_bits(0xffffff, 0);
415262306a36Sopenharmony_ci	if (bttv_gpio)
415362306a36Sopenharmony_ci		bttv_gpio_tracking(btv,"pxc200");
415462306a36Sopenharmony_ci
415562306a36Sopenharmony_ci	/*  we could/should try and reset/control the AD pots? but
415662306a36Sopenharmony_ci	    right now  we simply  turned off the crushing.  Without
415762306a36Sopenharmony_ci	    this the AGC drifts drifts
415862306a36Sopenharmony_ci	    remember the EN is reverse logic -->
415962306a36Sopenharmony_ci	    setting BT848_ADC_AGC_EN disable the AGC
416062306a36Sopenharmony_ci	    tboult@eecs.lehigh.edu
416162306a36Sopenharmony_ci	*/
416262306a36Sopenharmony_ci
416362306a36Sopenharmony_ci	btwrite(BT848_ADC_RESERVED|BT848_ADC_AGC_EN, BT848_ADC);
416462306a36Sopenharmony_ci
416562306a36Sopenharmony_ci	/*	Initialise MAX517 DAC */
416662306a36Sopenharmony_ci	pr_info("Setting DAC reference voltage level ...\n");
416762306a36Sopenharmony_ci	bttv_I2CWrite(btv,0x5E,0,0x80,1);
416862306a36Sopenharmony_ci
416962306a36Sopenharmony_ci	/*	Initialise 12C508 PIC */
417062306a36Sopenharmony_ci	/*	The I2CWrite and I2CRead commands are actually to the
417162306a36Sopenharmony_ci	 *	same chips - but the R/W bit is included in the address
417262306a36Sopenharmony_ci	 *	argument so the numbers are different */
417362306a36Sopenharmony_ci
417462306a36Sopenharmony_ci
417562306a36Sopenharmony_ci	pr_info("Initialising 12C508 PIC chip ...\n");
417662306a36Sopenharmony_ci
417762306a36Sopenharmony_ci	/* First of all, enable the clock line. This is used in the PXC200-F */
417862306a36Sopenharmony_ci	val = btread(BT848_GPIO_DMA_CTL);
417962306a36Sopenharmony_ci	val |= BT848_GPIO_DMA_CTL_GPCLKMODE;
418062306a36Sopenharmony_ci	btwrite(val, BT848_GPIO_DMA_CTL);
418162306a36Sopenharmony_ci
418262306a36Sopenharmony_ci	/* Then, push to 0 the reset pin long enough to reset the *
418362306a36Sopenharmony_ci	 * device same as above for the reset line, but not the same
418462306a36Sopenharmony_ci	 * value sent to the GPIO-connected stuff
418562306a36Sopenharmony_ci	 * which one is the good one? */
418662306a36Sopenharmony_ci	gpio_inout(0xffffff,(1<<2));
418762306a36Sopenharmony_ci	gpio_write(0);
418862306a36Sopenharmony_ci	udelay(10);
418962306a36Sopenharmony_ci	gpio_write(1<<2);
419062306a36Sopenharmony_ci
419162306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(vals); i++) {
419262306a36Sopenharmony_ci		tmp=bttv_I2CWrite(btv,0x1E,0,vals[i],1);
419362306a36Sopenharmony_ci		if (tmp != -1) {
419462306a36Sopenharmony_ci			pr_info("I2C Write(%2.2x) = %i\nI2C Read () = %2.2x\n\n",
419562306a36Sopenharmony_ci			       vals[i],tmp,bttv_I2CRead(btv,0x1F,NULL));
419662306a36Sopenharmony_ci		}
419762306a36Sopenharmony_ci	}
419862306a36Sopenharmony_ci
419962306a36Sopenharmony_ci	pr_info("PXC200 Initialised\n");
420062306a36Sopenharmony_ci}
420162306a36Sopenharmony_ci
420262306a36Sopenharmony_ci
420362306a36Sopenharmony_ci
420462306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
420562306a36Sopenharmony_ci/*
420662306a36Sopenharmony_ci *  The Adlink RTV-24 (aka Angelo) has some special initialisation to unlock
420762306a36Sopenharmony_ci *  it. This apparently involves the following procedure for each 878 chip:
420862306a36Sopenharmony_ci *
420962306a36Sopenharmony_ci *  1) write 0x00C3FEFF to the GPIO_OUT_EN register
421062306a36Sopenharmony_ci *
421162306a36Sopenharmony_ci *  2)  write to GPIO_DATA
421262306a36Sopenharmony_ci *      - 0x0E
421362306a36Sopenharmony_ci *      - sleep 1ms
421462306a36Sopenharmony_ci *      - 0x10 + 0x0E
421562306a36Sopenharmony_ci *      - sleep 10ms
421662306a36Sopenharmony_ci *      - 0x0E
421762306a36Sopenharmony_ci *     read from GPIO_DATA into buf (uint_32)
421862306a36Sopenharmony_ci *      - if ( data>>18 & 0x01 != 0) || ( buf>>19 & 0x01 != 1 )
421962306a36Sopenharmony_ci *                 error. ERROR_CPLD_Check_Failed stop.
422062306a36Sopenharmony_ci *
422162306a36Sopenharmony_ci *  3) write to GPIO_DATA
422262306a36Sopenharmony_ci *      - write 0x4400 + 0x0E
422362306a36Sopenharmony_ci *      - sleep 10ms
422462306a36Sopenharmony_ci *      - write 0x4410 + 0x0E
422562306a36Sopenharmony_ci *      - sleep 1ms
422662306a36Sopenharmony_ci *      - write 0x0E
422762306a36Sopenharmony_ci *     read from GPIO_DATA into buf (uint_32)
422862306a36Sopenharmony_ci *      - if ( buf>>18 & 0x01 ) || ( buf>>19 & 0x01 != 0 )
422962306a36Sopenharmony_ci *                error. ERROR_CPLD_Check_Failed.
423062306a36Sopenharmony_ci */
423162306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
423262306a36Sopenharmony_cistatic void
423362306a36Sopenharmony_ciinit_RTV24 (struct bttv *btv)
423462306a36Sopenharmony_ci{
423562306a36Sopenharmony_ci	uint32_t dataRead = 0;
423662306a36Sopenharmony_ci	long watchdog_value = 0x0E;
423762306a36Sopenharmony_ci
423862306a36Sopenharmony_ci	pr_info("%d: Adlink RTV-24 initialisation in progress ...\n",
423962306a36Sopenharmony_ci		btv->c.nr);
424062306a36Sopenharmony_ci
424162306a36Sopenharmony_ci	btwrite (0x00c3feff, BT848_GPIO_OUT_EN);
424262306a36Sopenharmony_ci
424362306a36Sopenharmony_ci	btwrite (0 + watchdog_value, BT848_GPIO_DATA);
424462306a36Sopenharmony_ci	msleep (1);
424562306a36Sopenharmony_ci	btwrite (0x10 + watchdog_value, BT848_GPIO_DATA);
424662306a36Sopenharmony_ci	msleep (10);
424762306a36Sopenharmony_ci	btwrite (0 + watchdog_value, BT848_GPIO_DATA);
424862306a36Sopenharmony_ci
424962306a36Sopenharmony_ci	dataRead = btread (BT848_GPIO_DATA);
425062306a36Sopenharmony_ci
425162306a36Sopenharmony_ci	if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 1)) {
425262306a36Sopenharmony_ci		pr_info("%d: Adlink RTV-24 initialisation(1) ERROR_CPLD_Check_Failed (read %d)\n",
425362306a36Sopenharmony_ci			btv->c.nr, dataRead);
425462306a36Sopenharmony_ci	}
425562306a36Sopenharmony_ci
425662306a36Sopenharmony_ci	btwrite (0x4400 + watchdog_value, BT848_GPIO_DATA);
425762306a36Sopenharmony_ci	msleep (10);
425862306a36Sopenharmony_ci	btwrite (0x4410 + watchdog_value, BT848_GPIO_DATA);
425962306a36Sopenharmony_ci	msleep (1);
426062306a36Sopenharmony_ci	btwrite (watchdog_value, BT848_GPIO_DATA);
426162306a36Sopenharmony_ci	msleep (1);
426262306a36Sopenharmony_ci	dataRead = btread (BT848_GPIO_DATA);
426362306a36Sopenharmony_ci
426462306a36Sopenharmony_ci	if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 0)) {
426562306a36Sopenharmony_ci		pr_info("%d: Adlink RTV-24 initialisation(2) ERROR_CPLD_Check_Failed (read %d)\n",
426662306a36Sopenharmony_ci			btv->c.nr, dataRead);
426762306a36Sopenharmony_ci
426862306a36Sopenharmony_ci		return;
426962306a36Sopenharmony_ci	}
427062306a36Sopenharmony_ci
427162306a36Sopenharmony_ci	pr_info("%d: Adlink RTV-24 initialisation complete\n", btv->c.nr);
427262306a36Sopenharmony_ci}
427362306a36Sopenharmony_ci
427462306a36Sopenharmony_ci
427562306a36Sopenharmony_ci
427662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
427762306a36Sopenharmony_ci/*
427862306a36Sopenharmony_ci *  The PCI-8604PW contains a CPLD, probably an ispMACH 4A, that filters
427962306a36Sopenharmony_ci *  the PCI REQ signals coming from the four BT878 chips. After power
428062306a36Sopenharmony_ci *  up, the CPLD does not forward requests to the bus, which prevents
428162306a36Sopenharmony_ci *  the BT878 from fetching RISC instructions from memory. While the
428262306a36Sopenharmony_ci *  CPLD is connected to most of the GPIOs of PCI device 0xD, only
428362306a36Sopenharmony_ci *  five appear to play a role in unlocking the REQ signal. The following
428462306a36Sopenharmony_ci *  sequence has been determined by trial and error without access to the
428562306a36Sopenharmony_ci *  original driver.
428662306a36Sopenharmony_ci *
428762306a36Sopenharmony_ci *  Eight GPIOs of device 0xC are provided on connector CN4 (4 in, 4 out).
428862306a36Sopenharmony_ci *  Devices 0xE and 0xF do not appear to have anything connected to their
428962306a36Sopenharmony_ci *  GPIOs.
429062306a36Sopenharmony_ci *
429162306a36Sopenharmony_ci *  The correct GPIO_OUT_EN value might have some more bits set. It should
429262306a36Sopenharmony_ci *  be possible to derive it from a boundary scan of the CPLD. Its JTAG
429362306a36Sopenharmony_ci *  pins are routed to test points.
429462306a36Sopenharmony_ci *
429562306a36Sopenharmony_ci */
429662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
429762306a36Sopenharmony_cistatic void
429862306a36Sopenharmony_ciinit_PCI8604PW(struct bttv *btv)
429962306a36Sopenharmony_ci{
430062306a36Sopenharmony_ci	int state;
430162306a36Sopenharmony_ci
430262306a36Sopenharmony_ci	if ((PCI_SLOT(btv->c.pci->devfn) & ~3) != 0xC) {
430362306a36Sopenharmony_ci		pr_warn("This is not a PCI-8604PW\n");
430462306a36Sopenharmony_ci		return;
430562306a36Sopenharmony_ci	}
430662306a36Sopenharmony_ci
430762306a36Sopenharmony_ci	if (PCI_SLOT(btv->c.pci->devfn) != 0xD)
430862306a36Sopenharmony_ci		return;
430962306a36Sopenharmony_ci
431062306a36Sopenharmony_ci	btwrite(0x080002, BT848_GPIO_OUT_EN);
431162306a36Sopenharmony_ci
431262306a36Sopenharmony_ci	state = (btread(BT848_GPIO_DATA) >> 21) & 7;
431362306a36Sopenharmony_ci
431462306a36Sopenharmony_ci	for (;;) {
431562306a36Sopenharmony_ci		switch (state) {
431662306a36Sopenharmony_ci		case 1:
431762306a36Sopenharmony_ci		case 5:
431862306a36Sopenharmony_ci		case 6:
431962306a36Sopenharmony_ci		case 4:
432062306a36Sopenharmony_ci			pr_debug("PCI-8604PW in state %i, toggling pin\n",
432162306a36Sopenharmony_ci				 state);
432262306a36Sopenharmony_ci			btwrite(0x080000, BT848_GPIO_DATA);
432362306a36Sopenharmony_ci			msleep(1);
432462306a36Sopenharmony_ci			btwrite(0x000000, BT848_GPIO_DATA);
432562306a36Sopenharmony_ci			msleep(1);
432662306a36Sopenharmony_ci			break;
432762306a36Sopenharmony_ci		case 7:
432862306a36Sopenharmony_ci			pr_info("PCI-8604PW unlocked\n");
432962306a36Sopenharmony_ci			return;
433062306a36Sopenharmony_ci		case 0:
433162306a36Sopenharmony_ci			/* FIXME: If we are in state 7 and toggle GPIO[19] one
433262306a36Sopenharmony_ci			   more time, the CPLD goes into state 0, where PCI bus
433362306a36Sopenharmony_ci			   mastering is inhibited again. We have not managed to
433462306a36Sopenharmony_ci			   get out of that state. */
433562306a36Sopenharmony_ci
433662306a36Sopenharmony_ci			pr_err("PCI-8604PW locked until reset\n");
433762306a36Sopenharmony_ci			return;
433862306a36Sopenharmony_ci		default:
433962306a36Sopenharmony_ci			pr_err("PCI-8604PW in unknown state %i\n", state);
434062306a36Sopenharmony_ci			return;
434162306a36Sopenharmony_ci		}
434262306a36Sopenharmony_ci
434362306a36Sopenharmony_ci		state = (state << 4) | ((btread(BT848_GPIO_DATA) >> 21) & 7);
434462306a36Sopenharmony_ci
434562306a36Sopenharmony_ci		switch (state) {
434662306a36Sopenharmony_ci		case 0x15:
434762306a36Sopenharmony_ci		case 0x56:
434862306a36Sopenharmony_ci		case 0x64:
434962306a36Sopenharmony_ci		case 0x47:
435062306a36Sopenharmony_ci		/* The transition from state 7 to state 0 is, as explained
435162306a36Sopenharmony_ci		   above, valid but undesired and with this code impossible
435262306a36Sopenharmony_ci		   as we exit as soon as we are in state 7.
435362306a36Sopenharmony_ci		case 0x70: */
435462306a36Sopenharmony_ci			break;
435562306a36Sopenharmony_ci		default:
435662306a36Sopenharmony_ci			pr_err("PCI-8604PW invalid transition %i -> %i\n",
435762306a36Sopenharmony_ci			       state >> 4, state & 7);
435862306a36Sopenharmony_ci			return;
435962306a36Sopenharmony_ci		}
436062306a36Sopenharmony_ci		state &= 7;
436162306a36Sopenharmony_ci	}
436262306a36Sopenharmony_ci}
436362306a36Sopenharmony_ci
436462306a36Sopenharmony_ci/* RemoteVision MX (rv605) muxsel helper [Miguel Freitas]
436562306a36Sopenharmony_ci *
436662306a36Sopenharmony_ci * This is needed because rv605 don't use a normal multiplex, but a crosspoint
436762306a36Sopenharmony_ci * switch instead (CD22M3494E). This IC can have multiple active connections
436862306a36Sopenharmony_ci * between Xn (input) and Yn (output) pins. We need to clear any existing
436962306a36Sopenharmony_ci * connection prior to establish a new one, pulsing the STROBE pin.
437062306a36Sopenharmony_ci *
437162306a36Sopenharmony_ci * The board hardwire Y0 (xpoint) to MUX1 and MUXOUT to Yin.
437262306a36Sopenharmony_ci * GPIO pins are wired as:
437362306a36Sopenharmony_ci *  GPIO[0:3] - AX[0:3] (xpoint) - P1[0:3] (microcontroller)
437462306a36Sopenharmony_ci *  GPIO[4:6] - AY[0:2] (xpoint) - P1[4:6] (microcontroller)
437562306a36Sopenharmony_ci *  GPIO[7]   - DATA (xpoint)    - P1[7] (microcontroller)
437662306a36Sopenharmony_ci *  GPIO[8]   -                  - P3[5] (microcontroller)
437762306a36Sopenharmony_ci *  GPIO[9]   - RESET (xpoint)   - P3[6] (microcontroller)
437862306a36Sopenharmony_ci *  GPIO[10]  - STROBE (xpoint)  - P3[7] (microcontroller)
437962306a36Sopenharmony_ci *  GPINTR    -                  - P3[4] (microcontroller)
438062306a36Sopenharmony_ci *
438162306a36Sopenharmony_ci * The microcontroller is a 80C32 like. It should be possible to change xpoint
438262306a36Sopenharmony_ci * configuration either directly (as we are doing) or using the microcontroller
438362306a36Sopenharmony_ci * which is also wired to I2C interface. I have no further info on the
438462306a36Sopenharmony_ci * microcontroller features, one would need to disassembly the firmware.
438562306a36Sopenharmony_ci * note: the vendor refused to give any information on this product, all
438662306a36Sopenharmony_ci *       that stuff was found using a multimeter! :)
438762306a36Sopenharmony_ci */
438862306a36Sopenharmony_cistatic void rv605_muxsel(struct bttv *btv, unsigned int input)
438962306a36Sopenharmony_ci{
439062306a36Sopenharmony_ci	static const u8 muxgpio[] = { 0x3, 0x1, 0x2, 0x4, 0xf, 0x7, 0xe, 0x0,
439162306a36Sopenharmony_ci				      0xd, 0xb, 0xc, 0x6, 0x9, 0x5, 0x8, 0xa };
439262306a36Sopenharmony_ci
439362306a36Sopenharmony_ci	gpio_bits(0x07f, muxgpio[input]);
439462306a36Sopenharmony_ci
439562306a36Sopenharmony_ci	/* reset all connections */
439662306a36Sopenharmony_ci	gpio_bits(0x200,0x200);
439762306a36Sopenharmony_ci	mdelay(1);
439862306a36Sopenharmony_ci	gpio_bits(0x200,0x000);
439962306a36Sopenharmony_ci	mdelay(1);
440062306a36Sopenharmony_ci
440162306a36Sopenharmony_ci	/* create a new connection */
440262306a36Sopenharmony_ci	gpio_bits(0x480,0x480);
440362306a36Sopenharmony_ci	mdelay(1);
440462306a36Sopenharmony_ci	gpio_bits(0x480,0x080);
440562306a36Sopenharmony_ci	mdelay(1);
440662306a36Sopenharmony_ci}
440762306a36Sopenharmony_ci
440862306a36Sopenharmony_ci/* Tibet Systems 'Progress DVR' CS16 muxsel helper [Chris Fanning]
440962306a36Sopenharmony_ci *
441062306a36Sopenharmony_ci * The CS16 (available on eBay cheap) is a PCI board with four Fusion
441162306a36Sopenharmony_ci * 878A chips, a PCI bridge, an Atmel microcontroller, four sync separator
441262306a36Sopenharmony_ci * chips, ten eight input analog multiplexors, a not chip and a few
441362306a36Sopenharmony_ci * other components.
441462306a36Sopenharmony_ci *
441562306a36Sopenharmony_ci * 16 inputs on a secondary bracket are provided and can be selected
441662306a36Sopenharmony_ci * from each of the four capture chips.  Two of the eight input
441762306a36Sopenharmony_ci * multiplexors are used to select from any of the 16 input signals.
441862306a36Sopenharmony_ci *
441962306a36Sopenharmony_ci * Unsupported hardware capabilities:
442062306a36Sopenharmony_ci *  . A video output monitor on the secondary bracket can be selected from
442162306a36Sopenharmony_ci *    one of the 878A chips.
442262306a36Sopenharmony_ci *  . Another passthrough but I haven't spent any time investigating it.
442362306a36Sopenharmony_ci *  . Digital I/O (logic level connected to GPIO) is available from an
442462306a36Sopenharmony_ci *    onboard header.
442562306a36Sopenharmony_ci *
442662306a36Sopenharmony_ci * The on chip input mux should always be set to 2.
442762306a36Sopenharmony_ci * GPIO[16:19] - Video input selection
442862306a36Sopenharmony_ci * GPIO[0:3]   - Video output monitor select (only available from one 878A)
442962306a36Sopenharmony_ci * GPIO[?:?]   - Digital I/O.
443062306a36Sopenharmony_ci *
443162306a36Sopenharmony_ci * There is an ATMEL microcontroller with an 8031 core on board.  I have not
443262306a36Sopenharmony_ci * determined what function (if any) it provides.  With the microcontroller
443362306a36Sopenharmony_ci * and sync separator chips a guess is that it might have to do with video
443462306a36Sopenharmony_ci * switching and maybe some digital I/O.
443562306a36Sopenharmony_ci */
443662306a36Sopenharmony_cistatic void tibetCS16_muxsel(struct bttv *btv, unsigned int input)
443762306a36Sopenharmony_ci{
443862306a36Sopenharmony_ci	/* video mux */
443962306a36Sopenharmony_ci	gpio_bits(0x0f0000, input << 16);
444062306a36Sopenharmony_ci}
444162306a36Sopenharmony_ci
444262306a36Sopenharmony_cistatic void tibetCS16_init(struct bttv *btv)
444362306a36Sopenharmony_ci{
444462306a36Sopenharmony_ci	/* enable gpio bits, mask obtained via btSpy */
444562306a36Sopenharmony_ci	gpio_inout(0xffffff, 0x0f7fff);
444662306a36Sopenharmony_ci	gpio_write(0x0f7fff);
444762306a36Sopenharmony_ci}
444862306a36Sopenharmony_ci
444962306a36Sopenharmony_ci/*
445062306a36Sopenharmony_ci * The following routines for the Kodicom-4400r get a little mind-twisting.
445162306a36Sopenharmony_ci * There is a "master" controller and three "slave" controllers, together
445262306a36Sopenharmony_ci * an analog switch which connects any of 16 cameras to any of the BT87A's.
445362306a36Sopenharmony_ci * The analog switch is controlled by the "master", but the detection order
445462306a36Sopenharmony_ci * of the four BT878A chips is in an order which I just don't understand.
445562306a36Sopenharmony_ci * The "master" is actually the second controller to be detected.  The
445662306a36Sopenharmony_ci * logic on the board uses logical numbers for the 4 controllers, but
445762306a36Sopenharmony_ci * those numbers are different from the detection sequence.  When working
445862306a36Sopenharmony_ci * with the analog switch, we need to "map" from the detection sequence
445962306a36Sopenharmony_ci * over to the board's logical controller number.  This mapping sequence
446062306a36Sopenharmony_ci * is {3, 0, 2, 1}, i.e. the first controller to be detected is logical
446162306a36Sopenharmony_ci * unit 3, the second (which is the master) is logical unit 0, etc.
446262306a36Sopenharmony_ci * We need to maintain the status of the analog switch (which of the 16
446362306a36Sopenharmony_ci * cameras is connected to which of the 4 controllers) in sw_status array.
446462306a36Sopenharmony_ci */
446562306a36Sopenharmony_ci
446662306a36Sopenharmony_ci/*
446762306a36Sopenharmony_ci * First a routine to set the analog switch, which controls which camera
446862306a36Sopenharmony_ci * is routed to which controller.  The switch comprises an X-address
446962306a36Sopenharmony_ci * (gpio bits 0-3, representing the camera, ranging from 0-15), and a
447062306a36Sopenharmony_ci * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3).
447162306a36Sopenharmony_ci * A data value (gpio bit 7) of '1' enables the switch, and '0' disables
447262306a36Sopenharmony_ci * the switch.  A STROBE bit (gpio bit 8) latches the data value into the
447362306a36Sopenharmony_ci * specified address.  The idea is to set the address and data, then bring
447462306a36Sopenharmony_ci * STROBE high, and finally bring STROBE back to low.
447562306a36Sopenharmony_ci */
447662306a36Sopenharmony_cistatic void kodicom4400r_write(struct bttv *btv,
447762306a36Sopenharmony_ci			       unsigned char xaddr,
447862306a36Sopenharmony_ci			       unsigned char yaddr,
447962306a36Sopenharmony_ci			       unsigned char data) {
448062306a36Sopenharmony_ci	unsigned int udata;
448162306a36Sopenharmony_ci
448262306a36Sopenharmony_ci	udata = (data << 7) | ((yaddr&3) << 4) | (xaddr&0xf);
448362306a36Sopenharmony_ci	gpio_bits(0x1ff, udata);		/* write ADDR and DAT */
448462306a36Sopenharmony_ci	gpio_bits(0x1ff, udata | (1 << 8));	/* strobe high */
448562306a36Sopenharmony_ci	gpio_bits(0x1ff, udata);		/* strobe low */
448662306a36Sopenharmony_ci}
448762306a36Sopenharmony_ci
448862306a36Sopenharmony_ci/*
448962306a36Sopenharmony_ci * Next the mux select.  Both the "master" and "slave" 'cards' (controllers)
449062306a36Sopenharmony_ci * use this routine.  The routine finds the "master" for the card, maps
449162306a36Sopenharmony_ci * the controller number from the detected position over to the logical
449262306a36Sopenharmony_ci * number, writes the appropriate data to the analog switch, and housekeeps
449362306a36Sopenharmony_ci * the local copy of the switch information.  The parameter 'input' is the
449462306a36Sopenharmony_ci * requested camera number (0 - 15).
449562306a36Sopenharmony_ci */
449662306a36Sopenharmony_cistatic void kodicom4400r_muxsel(struct bttv *btv, unsigned int input)
449762306a36Sopenharmony_ci{
449862306a36Sopenharmony_ci	int xaddr, yaddr;
449962306a36Sopenharmony_ci	struct bttv *mctlr;
450062306a36Sopenharmony_ci	static unsigned char map[4] = {3, 0, 2, 1};
450162306a36Sopenharmony_ci
450262306a36Sopenharmony_ci	mctlr = master[btv->c.nr];
450362306a36Sopenharmony_ci	if (mctlr == NULL) {	/* ignore if master not yet detected */
450462306a36Sopenharmony_ci		return;
450562306a36Sopenharmony_ci	}
450662306a36Sopenharmony_ci	yaddr = (btv->c.nr - mctlr->c.nr + 1) & 3; /* the '&' is for safety */
450762306a36Sopenharmony_ci	yaddr = map[yaddr];
450862306a36Sopenharmony_ci	xaddr = input & 0xf;
450962306a36Sopenharmony_ci	/* Check if the controller/camera pair has changed, else ignore */
451062306a36Sopenharmony_ci	if (mctlr->sw_status[yaddr] != xaddr)
451162306a36Sopenharmony_ci	{
451262306a36Sopenharmony_ci		/* "open" the old switch, "close" the new one, save the new */
451362306a36Sopenharmony_ci		kodicom4400r_write(mctlr, mctlr->sw_status[yaddr], yaddr, 0);
451462306a36Sopenharmony_ci		mctlr->sw_status[yaddr] = xaddr;
451562306a36Sopenharmony_ci		kodicom4400r_write(mctlr, xaddr, yaddr, 1);
451662306a36Sopenharmony_ci	}
451762306a36Sopenharmony_ci}
451862306a36Sopenharmony_ci
451962306a36Sopenharmony_ci/*
452062306a36Sopenharmony_ci * During initialisation, we need to reset the analog switch.  We
452162306a36Sopenharmony_ci * also preset the switch to map the 4 connectors on the card to the
452262306a36Sopenharmony_ci * *user's* (see above description of kodicom4400r_muxsel) channels
452362306a36Sopenharmony_ci * 0 through 3
452462306a36Sopenharmony_ci */
452562306a36Sopenharmony_cistatic void kodicom4400r_init(struct bttv *btv)
452662306a36Sopenharmony_ci{
452762306a36Sopenharmony_ci	int ix;
452862306a36Sopenharmony_ci
452962306a36Sopenharmony_ci	gpio_inout(0x0003ff, 0x0003ff);
453062306a36Sopenharmony_ci	gpio_write(1 << 9);	/* reset MUX */
453162306a36Sopenharmony_ci	gpio_write(0);
453262306a36Sopenharmony_ci	/* Preset camera 0 to the 4 controllers */
453362306a36Sopenharmony_ci	for (ix = 0; ix < 4; ix++) {
453462306a36Sopenharmony_ci		btv->sw_status[ix] = ix;
453562306a36Sopenharmony_ci		kodicom4400r_write(btv, ix, ix, 1);
453662306a36Sopenharmony_ci	}
453762306a36Sopenharmony_ci	/*
453862306a36Sopenharmony_ci	 * Since this is the "master", we need to set up the
453962306a36Sopenharmony_ci	 * other three controller chips' pointers to this structure
454062306a36Sopenharmony_ci	 * for later use in the muxsel routine.
454162306a36Sopenharmony_ci	 */
454262306a36Sopenharmony_ci	if ((btv->c.nr<1) || (btv->c.nr>BTTV_MAX-3))
454362306a36Sopenharmony_ci	    return;
454462306a36Sopenharmony_ci	master[btv->c.nr-1] = btv;
454562306a36Sopenharmony_ci	master[btv->c.nr]   = btv;
454662306a36Sopenharmony_ci	master[btv->c.nr+1] = btv;
454762306a36Sopenharmony_ci	master[btv->c.nr+2] = btv;
454862306a36Sopenharmony_ci}
454962306a36Sopenharmony_ci
455062306a36Sopenharmony_ci/* The Grandtec X-Guard framegrabber card uses two Dual 4-channel
455162306a36Sopenharmony_ci * video multiplexers to provide up to 16 video inputs. These
455262306a36Sopenharmony_ci * multiplexers are controlled by the lower 8 GPIO pins of the
455362306a36Sopenharmony_ci * bt878. The multiplexers probably Pericom PI5V331Q or similar.
455462306a36Sopenharmony_ci
455562306a36Sopenharmony_ci * xxx0 is pin xxx of multiplexer U5,
455662306a36Sopenharmony_ci * yyy1 is pin yyy of multiplexer U2
455762306a36Sopenharmony_ci */
455862306a36Sopenharmony_ci#define ENA0    0x01
455962306a36Sopenharmony_ci#define ENB0    0x02
456062306a36Sopenharmony_ci#define ENA1    0x04
456162306a36Sopenharmony_ci#define ENB1    0x08
456262306a36Sopenharmony_ci
456362306a36Sopenharmony_ci#define IN10    0x10
456462306a36Sopenharmony_ci#define IN00    0x20
456562306a36Sopenharmony_ci#define IN11    0x40
456662306a36Sopenharmony_ci#define IN01    0x80
456762306a36Sopenharmony_ci
456862306a36Sopenharmony_cistatic void xguard_muxsel(struct bttv *btv, unsigned int input)
456962306a36Sopenharmony_ci{
457062306a36Sopenharmony_ci	static const int masks[] = {
457162306a36Sopenharmony_ci		ENB0, ENB0|IN00, ENB0|IN10, ENB0|IN00|IN10,
457262306a36Sopenharmony_ci		ENA0, ENA0|IN00, ENA0|IN10, ENA0|IN00|IN10,
457362306a36Sopenharmony_ci		ENB1, ENB1|IN01, ENB1|IN11, ENB1|IN01|IN11,
457462306a36Sopenharmony_ci		ENA1, ENA1|IN01, ENA1|IN11, ENA1|IN01|IN11,
457562306a36Sopenharmony_ci	};
457662306a36Sopenharmony_ci	gpio_write(masks[input%16]);
457762306a36Sopenharmony_ci}
457862306a36Sopenharmony_cistatic void picolo_tetra_init(struct bttv *btv)
457962306a36Sopenharmony_ci{
458062306a36Sopenharmony_ci	/*This is the video input redirection functionality : I DID NOT USE IT. */
458162306a36Sopenharmony_ci	btwrite (0x08<<16,BT848_GPIO_DATA);/*GPIO[19] [==> 4053 B+C] set to 1 */
458262306a36Sopenharmony_ci	btwrite (0x04<<16,BT848_GPIO_DATA);/*GPIO[18] [==> 4053 A]  set to 1*/
458362306a36Sopenharmony_ci}
458462306a36Sopenharmony_cistatic void picolo_tetra_muxsel (struct bttv* btv, unsigned int input)
458562306a36Sopenharmony_ci{
458662306a36Sopenharmony_ci
458762306a36Sopenharmony_ci	dprintk("%d : picolo_tetra_muxsel =>  input = %d\n", btv->c.nr, input);
458862306a36Sopenharmony_ci	/*Just set the right path in the analog multiplexers : channel 1 -> 4 ==> Analog Mux ==> MUX0*/
458962306a36Sopenharmony_ci	/*GPIO[20]&GPIO[21] used to choose the right input*/
459062306a36Sopenharmony_ci	btwrite (input<<20,BT848_GPIO_DATA);
459162306a36Sopenharmony_ci
459262306a36Sopenharmony_ci}
459362306a36Sopenharmony_ci
459462306a36Sopenharmony_ci/*
459562306a36Sopenharmony_ci * ivc120_muxsel [Added by Alan Garfield <alan@fromorbit.com>]
459662306a36Sopenharmony_ci *
459762306a36Sopenharmony_ci * The IVC120G security card has 4 i2c controlled TDA8540 matrix
459862306a36Sopenharmony_ci * switchers to provide 16 channels to MUX0. The TDA8540's have
459962306a36Sopenharmony_ci * 4 independent outputs and as such the IVC120G also has the
460062306a36Sopenharmony_ci * optional "Monitor Out" bus. This allows the card to be looking
460162306a36Sopenharmony_ci * at one input while the monitor is looking at another.
460262306a36Sopenharmony_ci *
460362306a36Sopenharmony_ci * Since I've couldn't be bothered figuring out how to add an
460462306a36Sopenharmony_ci * independent muxsel for the monitor bus, I've just set it to
460562306a36Sopenharmony_ci * whatever the card is looking at.
460662306a36Sopenharmony_ci *
460762306a36Sopenharmony_ci *  OUT0 of the TDA8540's is connected to MUX0         (0x03)
460862306a36Sopenharmony_ci *  OUT1 of the TDA8540's is connected to "Monitor Out"        (0x0C)
460962306a36Sopenharmony_ci *
461062306a36Sopenharmony_ci *  TDA8540_ALT3 IN0-3 = Channel 13 - 16       (0x03)
461162306a36Sopenharmony_ci *  TDA8540_ALT4 IN0-3 = Channel 1 - 4         (0x03)
461262306a36Sopenharmony_ci *  TDA8540_ALT5 IN0-3 = Channel 5 - 8         (0x03)
461362306a36Sopenharmony_ci *  TDA8540_ALT6 IN0-3 = Channel 9 - 12                (0x03)
461462306a36Sopenharmony_ci *
461562306a36Sopenharmony_ci */
461662306a36Sopenharmony_ci
461762306a36Sopenharmony_ci/* All 7 possible sub-ids for the TDA8540 Matrix Switcher */
461862306a36Sopenharmony_ci#define I2C_TDA8540        0x90
461962306a36Sopenharmony_ci#define I2C_TDA8540_ALT1   0x92
462062306a36Sopenharmony_ci#define I2C_TDA8540_ALT2   0x94
462162306a36Sopenharmony_ci#define I2C_TDA8540_ALT3   0x96
462262306a36Sopenharmony_ci#define I2C_TDA8540_ALT4   0x98
462362306a36Sopenharmony_ci#define I2C_TDA8540_ALT5   0x9a
462462306a36Sopenharmony_ci#define I2C_TDA8540_ALT6   0x9c
462562306a36Sopenharmony_ci
462662306a36Sopenharmony_cistatic void ivc120_muxsel(struct bttv *btv, unsigned int input)
462762306a36Sopenharmony_ci{
462862306a36Sopenharmony_ci	/* Simple maths */
462962306a36Sopenharmony_ci	int key = input % 4;
463062306a36Sopenharmony_ci	int matrix = input / 4;
463162306a36Sopenharmony_ci
463262306a36Sopenharmony_ci	dprintk("%d: ivc120_muxsel: Input - %02d | TDA - %02d | In - %02d\n",
463362306a36Sopenharmony_ci		btv->c.nr, input, matrix, key);
463462306a36Sopenharmony_ci
463562306a36Sopenharmony_ci	/* Handles the input selection on the TDA8540's */
463662306a36Sopenharmony_ci	bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x00,
463762306a36Sopenharmony_ci		      ((matrix == 3) ? (key | key << 2) : 0x00), 1);
463862306a36Sopenharmony_ci	bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x00,
463962306a36Sopenharmony_ci		      ((matrix == 0) ? (key | key << 2) : 0x00), 1);
464062306a36Sopenharmony_ci	bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x00,
464162306a36Sopenharmony_ci		      ((matrix == 1) ? (key | key << 2) : 0x00), 1);
464262306a36Sopenharmony_ci	bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x00,
464362306a36Sopenharmony_ci		      ((matrix == 2) ? (key | key << 2) : 0x00), 1);
464462306a36Sopenharmony_ci
464562306a36Sopenharmony_ci	/* Handles the output enables on the TDA8540's */
464662306a36Sopenharmony_ci	bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x02,
464762306a36Sopenharmony_ci		      ((matrix == 3) ? 0x03 : 0x00), 1);  /* 13 - 16 */
464862306a36Sopenharmony_ci	bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x02,
464962306a36Sopenharmony_ci		      ((matrix == 0) ? 0x03 : 0x00), 1);  /* 1-4 */
465062306a36Sopenharmony_ci	bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x02,
465162306a36Sopenharmony_ci		      ((matrix == 1) ? 0x03 : 0x00), 1);  /* 5-8 */
465262306a36Sopenharmony_ci	bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x02,
465362306a36Sopenharmony_ci		      ((matrix == 2) ? 0x03 : 0x00), 1);  /* 9-12 */
465462306a36Sopenharmony_ci
465562306a36Sopenharmony_ci	/* 878's MUX0 is already selected for input via muxsel values */
465662306a36Sopenharmony_ci}
465762306a36Sopenharmony_ci
465862306a36Sopenharmony_ci
465962306a36Sopenharmony_ci/* PXC200 muxsel helper
466062306a36Sopenharmony_ci * luke@syseng.anu.edu.au
466162306a36Sopenharmony_ci * another transplant
466262306a36Sopenharmony_ci * from Alessandro Rubini (rubini@linux.it)
466362306a36Sopenharmony_ci *
466462306a36Sopenharmony_ci * There are 4 kinds of cards:
466562306a36Sopenharmony_ci * PXC200L which is bt848
466662306a36Sopenharmony_ci * PXC200F which is bt848 with PIC controlling mux
466762306a36Sopenharmony_ci * PXC200AL which is bt878
466862306a36Sopenharmony_ci * PXC200AF which is bt878 with PIC controlling mux
466962306a36Sopenharmony_ci */
467062306a36Sopenharmony_ci#define PX_CFG_PXC200F 0x01
467162306a36Sopenharmony_ci#define PX_FLAG_PXC200A  0x00001000 /* a pxc200A is bt-878 based */
467262306a36Sopenharmony_ci#define PX_I2C_PIC       0x0f
467362306a36Sopenharmony_ci#define PX_PXC200A_CARDID 0x200a1295
467462306a36Sopenharmony_ci#define PX_I2C_CMD_CFG   0x00
467562306a36Sopenharmony_ci
467662306a36Sopenharmony_cistatic void PXC200_muxsel(struct bttv *btv, unsigned int input)
467762306a36Sopenharmony_ci{
467862306a36Sopenharmony_ci	int rc;
467962306a36Sopenharmony_ci	long mux;
468062306a36Sopenharmony_ci	int bitmask;
468162306a36Sopenharmony_ci	unsigned char buf[2];
468262306a36Sopenharmony_ci
468362306a36Sopenharmony_ci	/* Read PIC config to determine if this is a PXC200F */
468462306a36Sopenharmony_ci	/* PX_I2C_CMD_CFG*/
468562306a36Sopenharmony_ci	buf[0]=0;
468662306a36Sopenharmony_ci	buf[1]=0;
468762306a36Sopenharmony_ci	rc=bttv_I2CWrite(btv,(PX_I2C_PIC<<1),buf[0],buf[1],1);
468862306a36Sopenharmony_ci	if (rc) {
468962306a36Sopenharmony_ci		pr_debug("%d: PXC200_muxsel: pic cfg write failed:%d\n",
469062306a36Sopenharmony_ci			 btv->c.nr, rc);
469162306a36Sopenharmony_ci	  /* not PXC ? do nothing */
469262306a36Sopenharmony_ci		return;
469362306a36Sopenharmony_ci	}
469462306a36Sopenharmony_ci
469562306a36Sopenharmony_ci	rc=bttv_I2CRead(btv,(PX_I2C_PIC<<1),NULL);
469662306a36Sopenharmony_ci	if (!(rc & PX_CFG_PXC200F)) {
469762306a36Sopenharmony_ci		pr_debug("%d: PXC200_muxsel: not PXC200F rc:%d\n",
469862306a36Sopenharmony_ci			 btv->c.nr, rc);
469962306a36Sopenharmony_ci		return;
470062306a36Sopenharmony_ci	}
470162306a36Sopenharmony_ci
470262306a36Sopenharmony_ci
470362306a36Sopenharmony_ci	/* The multiplexer in the 200F is handled by the GPIO port */
470462306a36Sopenharmony_ci	/* get correct mapping between inputs  */
470562306a36Sopenharmony_ci	/*  mux = bttv_tvcards[btv->type].muxsel[input] & 3; */
470662306a36Sopenharmony_ci	/* ** not needed!?   */
470762306a36Sopenharmony_ci	mux = input;
470862306a36Sopenharmony_ci
470962306a36Sopenharmony_ci	/* make sure output pins are enabled */
471062306a36Sopenharmony_ci	/* bitmask=0x30f; */
471162306a36Sopenharmony_ci	bitmask=0x302;
471262306a36Sopenharmony_ci	/* check whether we have a PXC200A */
471362306a36Sopenharmony_ci	if (btv->cardid == PX_PXC200A_CARDID)  {
471462306a36Sopenharmony_ci	   bitmask ^= 0x180; /* use 7 and 9, not 8 and 9 */
471562306a36Sopenharmony_ci	   bitmask |= 7<<4; /* the DAC */
471662306a36Sopenharmony_ci	}
471762306a36Sopenharmony_ci	btwrite(bitmask, BT848_GPIO_OUT_EN);
471862306a36Sopenharmony_ci
471962306a36Sopenharmony_ci	bitmask = btread(BT848_GPIO_DATA);
472062306a36Sopenharmony_ci	if (btv->cardid == PX_PXC200A_CARDID)
472162306a36Sopenharmony_ci	  bitmask = (bitmask & ~0x280) | ((mux & 2) << 8) | ((mux & 1) << 7);
472262306a36Sopenharmony_ci	else /* older device */
472362306a36Sopenharmony_ci	  bitmask = (bitmask & ~0x300) | ((mux & 3) << 8);
472462306a36Sopenharmony_ci	btwrite(bitmask,BT848_GPIO_DATA);
472562306a36Sopenharmony_ci
472662306a36Sopenharmony_ci	/*
472762306a36Sopenharmony_ci	 * Was "to be safe, set the bt848 to input 0"
472862306a36Sopenharmony_ci	 * Actually, since it's ok at load time, better not messing
472962306a36Sopenharmony_ci	 * with these bits (on PXC200AF you need to set mux 2 here)
473062306a36Sopenharmony_ci	 *
473162306a36Sopenharmony_ci	 * needed because bttv-driver sets mux before calling this function
473262306a36Sopenharmony_ci	 */
473362306a36Sopenharmony_ci	if (btv->cardid == PX_PXC200A_CARDID)
473462306a36Sopenharmony_ci	  btaor(2<<5, ~BT848_IFORM_MUXSEL, BT848_IFORM);
473562306a36Sopenharmony_ci	else /* older device */
473662306a36Sopenharmony_ci	  btand(~BT848_IFORM_MUXSEL,BT848_IFORM);
473762306a36Sopenharmony_ci
473862306a36Sopenharmony_ci	pr_debug("%d: setting input channel to:%d\n", btv->c.nr, (int)mux);
473962306a36Sopenharmony_ci}
474062306a36Sopenharmony_ci
474162306a36Sopenharmony_cistatic void phytec_muxsel(struct bttv *btv, unsigned int input)
474262306a36Sopenharmony_ci{
474362306a36Sopenharmony_ci	unsigned int mux = input % 4;
474462306a36Sopenharmony_ci
474562306a36Sopenharmony_ci	if (input == btv->svhs)
474662306a36Sopenharmony_ci		mux = 0;
474762306a36Sopenharmony_ci
474862306a36Sopenharmony_ci	gpio_bits(0x3, mux);
474962306a36Sopenharmony_ci}
475062306a36Sopenharmony_ci
475162306a36Sopenharmony_ci/*
475262306a36Sopenharmony_ci * GeoVision GV-800(S) functions
475362306a36Sopenharmony_ci * Bruno Christo <bchristo@inf.ufsm.br>
475462306a36Sopenharmony_ci*/
475562306a36Sopenharmony_ci
475662306a36Sopenharmony_ci/* This is a function to control the analog switch, which determines which
475762306a36Sopenharmony_ci * camera is routed to which controller.  The switch comprises an X-address
475862306a36Sopenharmony_ci * (gpio bits 0-3, representing the camera, ranging from 0-15), and a
475962306a36Sopenharmony_ci * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3).
476062306a36Sopenharmony_ci * A data value (gpio bit 18) of '1' enables the switch, and '0' disables
476162306a36Sopenharmony_ci * the switch.  A STROBE bit (gpio bit 17) latches the data value into the
476262306a36Sopenharmony_ci * specified address. There is also a chip select (gpio bit 16).
476362306a36Sopenharmony_ci * The idea is to set the address and chip select together, bring
476462306a36Sopenharmony_ci * STROBE high, write the data, and finally bring STROBE back to low.
476562306a36Sopenharmony_ci */
476662306a36Sopenharmony_cistatic void gv800s_write(struct bttv *btv,
476762306a36Sopenharmony_ci			 unsigned char xaddr,
476862306a36Sopenharmony_ci			 unsigned char yaddr,
476962306a36Sopenharmony_ci			 unsigned char data) {
477062306a36Sopenharmony_ci	/* On the "master" 878A:
477162306a36Sopenharmony_ci	* GPIO bits 0-9 are used for the analog switch:
477262306a36Sopenharmony_ci	*   00 - 03:	camera selector
477362306a36Sopenharmony_ci	*   04 - 06:	878A (controller) selector
477462306a36Sopenharmony_ci	*   16:		cselect
477562306a36Sopenharmony_ci	*   17:		strobe
477662306a36Sopenharmony_ci	*   18:		data (1->on, 0->off)
477762306a36Sopenharmony_ci	*   19:		reset
477862306a36Sopenharmony_ci	*/
477962306a36Sopenharmony_ci	const u32 ADDRESS = ((xaddr&0xf) | (yaddr&3)<<4);
478062306a36Sopenharmony_ci	const u32 CSELECT = 1<<16;
478162306a36Sopenharmony_ci	const u32 STROBE = 1<<17;
478262306a36Sopenharmony_ci	const u32 DATA = data<<18;
478362306a36Sopenharmony_ci
478462306a36Sopenharmony_ci	gpio_bits(0x1007f, ADDRESS | CSELECT);	/* write ADDRESS and CSELECT */
478562306a36Sopenharmony_ci	gpio_bits(0x20000, STROBE);		/* STROBE high */
478662306a36Sopenharmony_ci	gpio_bits(0x40000, DATA);		/* write DATA */
478762306a36Sopenharmony_ci	gpio_bits(0x20000, ~STROBE);		/* STROBE low */
478862306a36Sopenharmony_ci}
478962306a36Sopenharmony_ci
479062306a36Sopenharmony_ci/*
479162306a36Sopenharmony_ci * GeoVision GV-800(S) muxsel
479262306a36Sopenharmony_ci *
479362306a36Sopenharmony_ci * Each of the 4 cards (controllers) use this function.
479462306a36Sopenharmony_ci * The controller using this function selects the input through the GPIO pins
479562306a36Sopenharmony_ci * of the "master" card. A pointer to this card is stored in master[btv->c.nr].
479662306a36Sopenharmony_ci *
479762306a36Sopenharmony_ci * The parameter 'input' is the requested camera number (0-4) on the controller.
479862306a36Sopenharmony_ci * The map array has the address of each input. Note that the addresses in the
479962306a36Sopenharmony_ci * array are in the sequence the original GeoVision driver uses, that is, set
480062306a36Sopenharmony_ci * every controller to input 0, then to input 1, 2, 3, repeat. This means that
480162306a36Sopenharmony_ci * the physical "camera 1" connector corresponds to controller 0 input 0,
480262306a36Sopenharmony_ci * "camera 2" corresponds to controller 1 input 0, and so on.
480362306a36Sopenharmony_ci *
480462306a36Sopenharmony_ci * After getting the input address, the function then writes the appropriate
480562306a36Sopenharmony_ci * data to the analog switch, and housekeeps the local copy of the switch
480662306a36Sopenharmony_ci * information.
480762306a36Sopenharmony_ci */
480862306a36Sopenharmony_cistatic void gv800s_muxsel(struct bttv *btv, unsigned int input)
480962306a36Sopenharmony_ci{
481062306a36Sopenharmony_ci	struct bttv *mctlr;
481162306a36Sopenharmony_ci	int xaddr, yaddr;
481262306a36Sopenharmony_ci	static unsigned int map[4][4] = { { 0x0, 0x4, 0xa, 0x6 },
481362306a36Sopenharmony_ci					  { 0x1, 0x5, 0xb, 0x7 },
481462306a36Sopenharmony_ci					  { 0x2, 0x8, 0xc, 0xe },
481562306a36Sopenharmony_ci					  { 0x3, 0x9, 0xd, 0xf } };
481662306a36Sopenharmony_ci	input = input%4;
481762306a36Sopenharmony_ci	mctlr = master[btv->c.nr];
481862306a36Sopenharmony_ci	if (mctlr == NULL) {
481962306a36Sopenharmony_ci		/* do nothing until the "master" is detected */
482062306a36Sopenharmony_ci		return;
482162306a36Sopenharmony_ci	}
482262306a36Sopenharmony_ci	yaddr = (btv->c.nr - mctlr->c.nr) & 3;
482362306a36Sopenharmony_ci	xaddr = map[yaddr][input] & 0xf;
482462306a36Sopenharmony_ci
482562306a36Sopenharmony_ci	/* Check if the controller/camera pair has changed, ignore otherwise */
482662306a36Sopenharmony_ci	if (mctlr->sw_status[yaddr] != xaddr) {
482762306a36Sopenharmony_ci		/* disable the old switch, enable the new one and save status */
482862306a36Sopenharmony_ci		gv800s_write(mctlr, mctlr->sw_status[yaddr], yaddr, 0);
482962306a36Sopenharmony_ci		mctlr->sw_status[yaddr] = xaddr;
483062306a36Sopenharmony_ci		gv800s_write(mctlr, xaddr, yaddr, 1);
483162306a36Sopenharmony_ci	}
483262306a36Sopenharmony_ci}
483362306a36Sopenharmony_ci
483462306a36Sopenharmony_ci/* GeoVision GV-800(S) "master" chip init */
483562306a36Sopenharmony_cistatic void gv800s_init(struct bttv *btv)
483662306a36Sopenharmony_ci{
483762306a36Sopenharmony_ci	int ix;
483862306a36Sopenharmony_ci
483962306a36Sopenharmony_ci	gpio_inout(0xf107f, 0xf107f);
484062306a36Sopenharmony_ci	gpio_write(1<<19); /* reset the analog MUX */
484162306a36Sopenharmony_ci	gpio_write(0);
484262306a36Sopenharmony_ci
484362306a36Sopenharmony_ci	/* Preset camera 0 to the 4 controllers */
484462306a36Sopenharmony_ci	for (ix = 0; ix < 4; ix++) {
484562306a36Sopenharmony_ci		btv->sw_status[ix] = ix;
484662306a36Sopenharmony_ci		gv800s_write(btv, ix, ix, 1);
484762306a36Sopenharmony_ci	}
484862306a36Sopenharmony_ci
484962306a36Sopenharmony_ci	/* Inputs on the "master" controller need this brightness fix */
485062306a36Sopenharmony_ci	bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1);
485162306a36Sopenharmony_ci
485262306a36Sopenharmony_ci	if (btv->c.nr > BTTV_MAX-4)
485362306a36Sopenharmony_ci		return;
485462306a36Sopenharmony_ci	/*
485562306a36Sopenharmony_ci	 * Store the "master" controller pointer in the master
485662306a36Sopenharmony_ci	 * array for later use in the muxsel function.
485762306a36Sopenharmony_ci	 */
485862306a36Sopenharmony_ci	master[btv->c.nr]   = btv;
485962306a36Sopenharmony_ci	master[btv->c.nr+1] = btv;
486062306a36Sopenharmony_ci	master[btv->c.nr+2] = btv;
486162306a36Sopenharmony_ci	master[btv->c.nr+3] = btv;
486262306a36Sopenharmony_ci}
486362306a36Sopenharmony_ci
486462306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
486562306a36Sopenharmony_ci/* motherboard chipset specific stuff                                      */
486662306a36Sopenharmony_ci
486762306a36Sopenharmony_civoid __init bttv_check_chipset(void)
486862306a36Sopenharmony_ci{
486962306a36Sopenharmony_ci	struct pci_dev *dev = NULL;
487062306a36Sopenharmony_ci
487162306a36Sopenharmony_ci	if (pci_pci_problems & (PCIPCI_TRITON|PCIPCI_NATOMA|PCIPCI_VIAETBF))
487262306a36Sopenharmony_ci		triton1 = 1;
487362306a36Sopenharmony_ci	if (pci_pci_problems & PCIPCI_VSFX)
487462306a36Sopenharmony_ci		vsfx = 1;
487562306a36Sopenharmony_ci#ifdef PCIPCI_ALIMAGIK
487662306a36Sopenharmony_ci	if (pci_pci_problems & PCIPCI_ALIMAGIK)
487762306a36Sopenharmony_ci		latency = 0x0A;
487862306a36Sopenharmony_ci#endif
487962306a36Sopenharmony_ci
488062306a36Sopenharmony_ci
488162306a36Sopenharmony_ci	/* print warnings about any quirks found */
488262306a36Sopenharmony_ci	if (triton1)
488362306a36Sopenharmony_ci		pr_info("Host bridge needs ETBF enabled\n");
488462306a36Sopenharmony_ci	if (vsfx)
488562306a36Sopenharmony_ci		pr_info("Host bridge needs VSFX enabled\n");
488662306a36Sopenharmony_ci	if (UNSET != latency)
488762306a36Sopenharmony_ci		pr_info("pci latency fixup [%d]\n", latency);
488862306a36Sopenharmony_ci	while ((dev = pci_get_device(PCI_VENDOR_ID_INTEL,
488962306a36Sopenharmony_ci				      PCI_DEVICE_ID_INTEL_82441, dev))) {
489062306a36Sopenharmony_ci		unsigned char b;
489162306a36Sopenharmony_ci		pci_read_config_byte(dev, 0x53, &b);
489262306a36Sopenharmony_ci		if (bttv_debug)
489362306a36Sopenharmony_ci			pr_info("Host bridge: 82441FX Natoma, bufcon=0x%02x\n",
489462306a36Sopenharmony_ci				b);
489562306a36Sopenharmony_ci	}
489662306a36Sopenharmony_ci}
489762306a36Sopenharmony_ci
489862306a36Sopenharmony_ciint bttv_handle_chipset(struct bttv *btv)
489962306a36Sopenharmony_ci{
490062306a36Sopenharmony_ci	unsigned char command;
490162306a36Sopenharmony_ci
490262306a36Sopenharmony_ci	if (!triton1 && !vsfx && UNSET == latency)
490362306a36Sopenharmony_ci		return 0;
490462306a36Sopenharmony_ci
490562306a36Sopenharmony_ci	if (bttv_verbose) {
490662306a36Sopenharmony_ci		if (triton1)
490762306a36Sopenharmony_ci			pr_info("%d: enabling ETBF (430FX/VP3 compatibility)\n",
490862306a36Sopenharmony_ci				btv->c.nr);
490962306a36Sopenharmony_ci		if (vsfx && btv->id >= 878)
491062306a36Sopenharmony_ci			pr_info("%d: enabling VSFX\n", btv->c.nr);
491162306a36Sopenharmony_ci		if (UNSET != latency)
491262306a36Sopenharmony_ci			pr_info("%d: setting pci timer to %d\n",
491362306a36Sopenharmony_ci				btv->c.nr, latency);
491462306a36Sopenharmony_ci	}
491562306a36Sopenharmony_ci
491662306a36Sopenharmony_ci	if (btv->id < 878) {
491762306a36Sopenharmony_ci		/* bt848 (mis)uses a bit in the irq mask for etbf */
491862306a36Sopenharmony_ci		if (triton1)
491962306a36Sopenharmony_ci			btv->triton1 = BT848_INT_ETBF;
492062306a36Sopenharmony_ci	} else {
492162306a36Sopenharmony_ci		/* bt878 has a bit in the pci config space for it */
492262306a36Sopenharmony_ci		pci_read_config_byte(btv->c.pci, BT878_DEVCTRL, &command);
492362306a36Sopenharmony_ci		if (triton1)
492462306a36Sopenharmony_ci			command |= BT878_EN_TBFX;
492562306a36Sopenharmony_ci		if (vsfx)
492662306a36Sopenharmony_ci			command |= BT878_EN_VSFX;
492762306a36Sopenharmony_ci		pci_write_config_byte(btv->c.pci, BT878_DEVCTRL, command);
492862306a36Sopenharmony_ci	}
492962306a36Sopenharmony_ci	if (UNSET != latency)
493062306a36Sopenharmony_ci		pci_write_config_byte(btv->c.pci, PCI_LATENCY_TIMER, latency);
493162306a36Sopenharmony_ci	return 0;
493262306a36Sopenharmony_ci}
4933