Merge to kernel-2.6.20-1.2949.fc6.vs2.2.0.1
[linux-2.6.git] / drivers / media / video / bt8xx / bttv-cards.c
similarity index 94%
rename from drivers/media/video/bttv-cards.c
rename to drivers/media/video/bt8xx/bttv-cards.c
index 9749d6e..21ebe8f 100644 (file)
@@ -25,7 +25,6 @@
 
 */
 
-#include <linux/config.h>
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
@@ -39,6 +38,7 @@
 
 #include "bttvp.h"
 #include <media/v4l2-common.h>
+#include <media/tvaudio.h>
 
 /* fwd decl */
 static void boot_msp34xx(struct bttv *btv, int pin);
@@ -137,6 +137,8 @@ MODULE_PARM_DESC(card,"specify TV/grabber card model, see CARDLIST file for a li
 MODULE_PARM_DESC(pll,"specify installed crystal (0=none, 28=28 MHz, 35=35 MHz)");
 MODULE_PARM_DESC(tuner,"specify installed tuner type");
 MODULE_PARM_DESC(autoload,"automatically load i2c modules like tuner.o, default is 1 (yes)");
+MODULE_PARM_DESC(no_overlay,"allow override overlay default (0 disables, 1 enables)"
+               " [some VIA/SIS chipsets are known to have problem with overlay]");
 
 /* ----------------------------------------------------------------------- */
 /* list of card IDs for bt878+ cards                                       */
@@ -266,7 +268,7 @@ static struct CARD {
        { 0x41a0a051, BTTV_BOARD_FLYVIDEO_98FM, "Lifeview FlyVideo 98 LR50 Rev Q" },
        { 0x18501f7f, BTTV_BOARD_FLYVIDEO_98,   "Lifeview Flyvideo 98" },
 
-       { 0x010115cb, BTTV_BOARD_GMV1,          "AG GMV1" },
+       { 0x010115cb, BTTV_BOARD_GMV1,          "AG GMV1" },
        { 0x010114c7, BTTV_BOARD_MODTEC_205,    "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV" },
 
        { 0x10b42636, BTTV_BOARD_HAUPPAUGE878,  "STB ???" },
@@ -275,7 +277,6 @@ static struct CARD {
        { 0x03116000, BTTV_BOARD_SENSORAY311,   "Sensoray 311" },
        { 0x00790e11, BTTV_BOARD_WINDVR,        "Canopus WinDVR PCI" },
        { 0xa0fca1a0, BTTV_BOARD_ZOLTRIX,       "Face to Face Tvmax" },
-       { 0x20007063, BTTV_BOARD_PC_HDTV,       "pcHDTV HD-2000 TV"},
        { 0x82b2aa6a, BTTV_BOARD_SIMUS_GVC1100, "SIMUS GVC1100" },
        { 0x146caa0c, BTTV_BOARD_PV951,         "ituner spectra8" },
        { 0x200a1295, BTTV_BOARD_PXC200,        "ImageNation PXC200A" },
@@ -297,15 +298,17 @@ static struct CARD {
        * { 0x13eb0070, BTTV_BOARD_HAUPPAUGE_IMPACTVCB,  "Hauppauge ImpactVCB" }, */
 
        /* DVB cards (using pci function .1 for mpeg data xfer) */
-       { 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" },
-       { 0x07611461, BTTV_BOARD_AVDVBT_761,    "AverMedia AverTV DVB-T 761" },
        { 0x001c11bd, BTTV_BOARD_PINNACLESAT,   "Pinnacle PCTV Sat" },
+       { 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" },
+       { 0x20007063, BTTV_BOARD_PC_HDTV,       "pcHDTV HD-2000 TV"},
        { 0x002611bd, BTTV_BOARD_TWINHAN_DST,   "Pinnacle PCTV SAT CI" },
        { 0x00011822, BTTV_BOARD_TWINHAN_DST,   "Twinhan VisionPlus DVB" },
        { 0xfc00270f, BTTV_BOARD_TWINHAN_DST,   "ChainTech digitop DST-1000 DVB-S" },
        { 0x07711461, BTTV_BOARD_AVDVBT_771,    "AVermedia AverTV DVB-T 771" },
+       { 0x07611461, BTTV_BOARD_AVDVBT_761,    "AverMedia AverTV DVB-T 761" },
        { 0xdb1018ac, BTTV_BOARD_DVICO_DVBT_LITE,    "DViCO FusionHDTV DVB-T Lite" },
        { 0xd50018ac, BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE,    "DViCO FusionHDTV 5 Lite" },
+       { 0x00261822, BTTV_BOARD_TWINHAN_DST,   "DNTV Live! Mini "},
 
        { 0, -1, NULL }
 };
@@ -334,7 +337,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 15,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 2, 0, 0, 0, 10 },
+               .gpiomux        = { 2, 0, 0, 0 },
+               .gpiomute       = 10,
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -348,7 +352,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 7,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 1, 2, 3, 4 },
+               .gpiomux        = { 0, 1, 2, 3 },
+               .gpiomute       = 4,
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -362,7 +367,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 7,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 4, 0, 2, 3, 1 },
+               .gpiomux        = { 4, 0, 2, 3 },
+               .gpiomute       = 1,
                .no_msp34xx     = 1,
                .needs_tvaudio  = 1,
                .tuner_type     = TUNER_PHILIPS_NTSC,
@@ -381,7 +387,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .needs_tvaudio  = 0,
                .tuner_type     = 4,
                .tuner_addr     = ADDR_UNSET,
@@ -395,7 +401,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 3,
                .muxsel         = { 2, 3, 1, 0 },
-               .audiomux       = { 0, 1, 0, 1, 3 },
+               .gpiomux        = { 0, 1, 0, 1 },
+               .gpiomute       = 3,
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -409,7 +416,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 3,
                .muxsel         = { 2, 3, 1, 1 },
                .gpiomask       = 0x0f,
-               .audiomux       = { 0x0c, 0x04, 0x08, 0x04, 0 },
+               .gpiomux        = { 0x0c, 0x04, 0x08, 0x04 },
                /*                0x04 for some cards ?? */
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
@@ -426,7 +433,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 3,
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 0, 0 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -442,7 +449,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xc00,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0xc00, 0x800, 0x400, 0xc00, 0 },
+               .gpiomux        = { 0, 0xc00, 0x800, 0x400 },
+               .gpiomute       = 0xc00,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -457,7 +465,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 3,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 1, 1, 2, 3, 0 },
+               .gpiomux        = { 1, 1, 2, 3 },
                .needs_tvaudio  = 0,
                .pll            = PLL_28,
                .tuner_type     = TUNER_TEMIC_PAL,
@@ -472,7 +480,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x0f, /* old: 7 */
                .muxsel         = { 2, 0, 1, 1 },
-               .audiomux       = { 0, 1, 2, 3, 4 },
+               .gpiomux        = { 0, 1, 2, 3 },
+               .gpiomute       = 4,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -487,7 +496,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x3014f,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x20001,0x10001, 0, 0,10 },
+               .gpiomux        = { 0x20001,0x10001, 0, 0 },
+               .gpiomute       = 10,
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -503,7 +513,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 15,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 13, 14, 11, 7, 0, 0 },
+               .gpiomux        = { 13, 14, 11, 7 },
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -517,7 +527,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 15,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 13, 14, 11, 7, 0, 0 },
+               .gpiomux        = { 13, 14, 11, 7 },
                .needs_tvaudio  = 1,
                .msp34xx_alt    = 1,
                .pll            = PLL_28,
@@ -535,7 +545,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 7,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 2, 1, 3, 4 }, /* old: {0, 1, 2, 3, 4} */
+               .gpiomux        = { 0, 2, 1, 3 }, /* old: {0, 1, 2, 3, 4} */
+               .gpiomute       = 4,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -550,7 +561,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 15,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0 , 0, 1 , 0, 10 },
+               .gpiomux        = { 0, 0, 1, 0 },
+               .gpiomute       = 10,
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -568,10 +580,11 @@ struct tvcard bttv_tvcards[] = {
                .muxsel         = { 2, 3, 1, 1 },
        #if 0
                /* old */
-               .audiomux       = { 0x01c000, 0, 0x018000, 0x014000, 0x002000, 0 },
+               .gpiomux        = { 0x01c000, 0, 0x018000, 0x014000, 0x002000 },
        #else
                /* 2003-10-20 by "Anton A. Arapov" <arapov@mail.ru> */
-               .audiomux       = { 0x001e00, 0, 0x018000, 0x014000, 0x002000, 0 },
+               .gpiomux        = { 0x001e00, 0, 0x018000, 0x014000 },
+               .gpiomute       = 0x002000,
        #endif
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
@@ -585,7 +598,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x8300f8,
                .muxsel         = { 2, 3, 1, 1,0 },
-               .audiomux       = { 0x4fa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007 },
+               .gpiomux        = { 0x4fa007,0xcfa007,0xcfa007,0xcfa007 },
+               .gpiomute       = 0xcfa007,
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -601,7 +615,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 1, 0, 0, 0, 0 },
+               .gpiomux        = { 1, 0, 0, 0 },
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -615,7 +629,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = -1,
                .gpiomask       = 0x8dff00,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .no_msp34xx     = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -642,7 +656,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1800,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0x800, 0x1000, 0x1000, 0x1800 },
+               .gpiomux        = { 0, 0x800, 0x1000, 0x1000 },
+               .gpiomute       = 0x1800,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL_I,
                .tuner_addr     = ADDR_UNSET,
@@ -656,7 +671,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xc00,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 1, 0x800, 0x400, 0xc00, 0 },
+               .gpiomux        = { 0, 1, 0x800, 0x400 },
+               .gpiomute       = 0xc00,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -672,7 +688,7 @@ struct tvcard bttv_tvcards[] = {
                .gpiomask       = 7,
                .muxsel         = { 2, 3, -1 },
                .digital_mode   = DIGITAL_MODE_CAMERA,
-               .audiomux       = { 0, 0, 0, 0, 0 },
+               .gpiomux        = { 0, 0, 0, 0 },
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_ALPS_TSBB5_PAL_I,
@@ -689,7 +705,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xe00,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = {0x400, 0x400, 0x400, 0x400, 0xc00 },
+               .gpiomux        = {0x400, 0x400, 0x400, 0x400 },
+               .gpiomute       = 0xc00,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -705,7 +722,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1f0fff,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x20000, 0x30000, 0x10000, 0, 0x40000 },
+               .gpiomux        = { 0x20000, 0x30000, 0x10000, 0 },
+               .gpiomute       = 0x40000,
                .needs_tvaudio  = 0,
                .tuner_type     = TUNER_PHILIPS_PAL,
                .tuner_addr     = ADDR_UNSET,
@@ -720,7 +738,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 3,
                .gpiomask       = 7,
                .muxsel         = { 2, 0, 1, 1 },
-               .audiomux       = { 0, 1, 2, 3, 4 },
+               .gpiomux        = { 0, 1, 2, 3 },
+               .gpiomute       = 4,
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -734,7 +753,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1800,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0x800, 0x1000, 0x1000, 0x1800 },
+               .gpiomux        = { 0, 0x800, 0x1000, 0x1000 },
+               .gpiomute       = 0x1800,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_SECAM,
                .tuner_addr     = ADDR_UNSET,
@@ -750,7 +770,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1f0fff,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x20000, 0x30000, 0x10000, 0x00000, 0x40000 },
+               .gpiomux        = { 0x20000, 0x30000, 0x10000, 0x00000 },
+               .gpiomute       = 0x40000,
                .needs_tvaudio  = 0,
                .tuner_type     = TUNER_PHILIPS_PAL,
                .tuner_addr     = ADDR_UNSET,
@@ -797,7 +818,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 1, /* was: 4 */
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 0, 0},
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .needs_tvaudio  = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -813,7 +834,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1800,  /* 0x8dfe00 */
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0x0800, 0x1000, 0x1000, 0x1800, 0 },
+               .gpiomux        = { 0, 0x0800, 0x1000, 0x1000 },
+               .gpiomute       = 0x1800,
                .pll            = PLL_28,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -827,7 +849,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 3,
                .gpiomask       = 1,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 1, 0, 0, 0, 0 },
+               .gpiomux        = { 1, 0, 0, 0 },
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL,
                .tuner_addr     = ADDR_UNSET,
@@ -843,7 +865,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .needs_tvaudio  = 0,
                .tuner_type     = 4,
                .tuner_addr     = ADDR_UNSET,
@@ -857,7 +879,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xffff00,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x500, 0, 0x300, 0x900, 0x900 },
+               .gpiomux        = { 0x500, 0, 0x300, 0x900 },
+               .gpiomute       = 0x900,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL,
@@ -873,11 +896,12 @@ struct tvcard bttv_tvcards[] = {
                .muxsel         = { 2, 3, 1, 1, 0 }, /* TV, CVid, SVid, CVid over SVid connector */
        #if 0
                .gpiomask       = 0xc33000,
-               .audiomux       = { 0x422000,0x1000,0x0000,0x620000,0x800000 },
+               .gpiomux        = { 0x422000,0x1000,0x0000,0x620000,0x800000 },
        #else
                /* Alexander Varakin <avarakin@hotmail.com> [stereo version] */
                .gpiomask       = 0xb33000,
-               .audiomux       = { 0x122000,0x1000,0x0000,0x620000,0x800000 },
+               .gpiomux        = { 0x122000,0x1000,0x0000,0x620000 },
+               .gpiomute       = 0x800000,
        #endif
                /* Audio Routing for "WinFast 2000 XP" (no tv stereo !)
                        gpio23 -- hef4052:nEnable (0x800000)
@@ -907,7 +931,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1800,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0x800, 0x1000, 0x1000, 0x1800 },
+               .gpiomux        = { 0, 0x800, 0x1000, 0x1000 },
+               .gpiomute       = 0x1800,
                .pll            = PLL_28,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -923,7 +948,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1800,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0x800, 0x1000, 0x1000, 0x1800, 0 },
+               .gpiomux        = { 0, 0x800, 0x1000, 0x1000 },
+               .gpiomute       = 0x1800,
                .pll            = PLL_28,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -938,7 +964,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xff,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x21, 0x20, 0x24, 0x2c, 0x29, 0x29 },
+               .gpiomux        = { 0x21, 0x20, 0x24, 0x2c },
+               .gpiomute       = 0x29,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -953,7 +980,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x551e00,
                .muxsel         = { 2, 3, 1, 0 },
-               .audiomux       = { 0x551400, 0x551200, 0, 0, 0x551c00, 0x551200 },
+               .gpiomux        = { 0x551400, 0x551200, 0, 0 },
+               .gpiomute       = 0x551c00,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = 1,
@@ -969,7 +997,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x03000F,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 2, 0xd0001, 0, 0, 1 },
+               .gpiomux        = { 2, 0xd0001, 0, 0 },
+               .gpiomute       = 1,
                .needs_tvaudio  = 0,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -986,7 +1015,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 7,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 4, 0, 2, 3, 1 },
+               .gpiomux        = { 4, 0, 2, 3 },
+               .gpiomute       = 1,
                .no_msp34xx     = 1,
                .needs_tvaudio  = 1,
                .tuner_type     = TUNER_PHILIPS_NTSC,
@@ -1003,7 +1033,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 15,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 13, 4, 11, 7, 0, 0 },
+               .gpiomux        = { 13, 4, 11, 7 },
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -1020,7 +1050,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 1},
-               .audiomux       = { 0, 0, 0, 0, 0},
+               .gpiomux        = { 0, 0, 0, 0},
                .needs_tvaudio  = 1,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
@@ -1036,7 +1066,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xe00b,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0xff9ff6, 0xff9ff6, 0xff1ff7, 0, 0xff3ffc },
+               .gpiomux        = { 0xff9ff6, 0xff9ff6, 0xff1ff7, 0 },
+               .gpiomute       = 0xff3ffc,
                .no_msp34xx     = 1,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -1052,7 +1083,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = -1,
                .gpiomask       = 3,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 1, 1, 0, 2, 3 },
+               .gpiomux        = { 1, 1, 0, 2 },
+               .gpiomute       = 3,
                .no_msp34xx     = 1,
                .pll            = PLL_NONE,
                .tuner_type     = -1,
@@ -1067,7 +1099,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 3,
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 0, 0 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -1082,7 +1114,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xbcf03f,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0xbc803f, 0xbc903f, 0xbcb03f, 0, 0xbcb03f },
+               .gpiomux        = { 0xbc803f, 0xbc903f, 0xbcb03f, 0 },
+               .gpiomute       = 0xbcb03f,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = 21,
@@ -1097,7 +1130,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x70000,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x20000, 0x30000, 0x10000, 0, 0x40000, 0x20000 },
+               .gpiomux        = { 0x20000, 0x30000, 0x10000, 0 },
+               .gpiomute       = 0x40000,
                .needs_tvaudio  = 1,
                .no_msp34xx     = 1,
                .pll            = PLL_35,
@@ -1116,7 +1150,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 15,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = {2,0,0,0,1 },
+               .gpiomux        = {2,0,0,0 },
+               .gpiomute       = 1,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -1131,7 +1166,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x010f00,
                .muxsel         = {2, 3, 0, 0 },
-               .audiomux       = {0x10000, 0, 0x10000, 0, 0, 0 },
+               .gpiomux        = {0x10000, 0, 0x10000, 0 },
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_ALPS_TSHC6_NTSC,
@@ -1148,7 +1183,8 @@ struct tvcard bttv_tvcards[] = {
                .gpiomask       = 0xAA0000,
                .muxsel         = { 2,3,1,1,-1 },
                .digital_mode   = DIGITAL_MODE_CAMERA,
-               .audiomux       = { 0x20000, 0, 0x80000, 0x80000, 0xa8000, 0x46000  },
+               .gpiomux        = { 0x20000, 0, 0x80000, 0x80000 },
+               .gpiomute       = 0xa8000,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL_I,
@@ -1173,7 +1209,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 7,
                .muxsel         = { 2, 0, 1, 1 },
-               .audiomux       = { 0, 1, 2, 3, 4 },
+               .gpiomux        = { 0, 1, 2, 3 },
+               .gpiomute       = 4,
                .pll            = PLL_28,
                .tuner_type     = -1 /* TUNER_ALPS_TMDH2_NTSC */,
                .tuner_addr     = ADDR_UNSET,
@@ -1190,7 +1227,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 3,
                .gpiomask       = 0x03000F,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 1, 0xd0001, 0, 0, 10 },
+               .gpiomux        = { 1, 0xd0001, 0, 0 },
+               .gpiomute       = 10,
                                /* sound path (5 sources):
                                MUX1 (mask 0x03), Enable Pin 0x08 (0=enable, 1=disable)
                                        0= ext. Audio IN
@@ -1216,7 +1254,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1c,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0, 0x10, 8, 4 },
+               .gpiomux        = { 0, 0, 0x10, 8 },
+               .gpiomute       = 4,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL,
@@ -1228,7 +1267,7 @@ struct tvcard bttv_tvcards[] = {
                /* Tim Röstermundt <rosterm@uni-muenster.de>
                in de.comp.os.unix.linux.hardware:
                        options bttv card=0 pll=1 radio=1 gpiomask=0x18e0
-                       audiomux=0x44c71f,0x44d71f,0,0x44d71f,0x44dfff
+                       gpiomux =0x44c71f,0x44d71f,0,0x44d71f,0x44dfff
                        options tuner type=5 */
                .name           = "Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]",
                .video_inputs   = 4,
@@ -1237,7 +1276,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x18e0,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x0000,0x0800,0x1000,0x1000,0x18e0 },
+               .gpiomux        = { 0x0000,0x0800,0x1000,0x1000 },
+               .gpiomute       = 0x18e0,
                        /* For cards with tda9820/tda9821:
                                0x0000: Tuner normal stereo
                                0x0080: Tuner A2 SAP (second audio program = Zweikanalton)
@@ -1257,7 +1297,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xF,
                .muxsel         = { 2, 3, 1, 0 },
-               .audiomux       = { 2, 0, 0, 0, 10 },
+               .gpiomux        = { 2, 0, 0, 0 },
+               .gpiomute       = 10,
                .needs_tvaudio  = 0,
                .pll            = PLL_28,
                .tuner_type     = TUNER_TEMIC_PAL,
@@ -1275,7 +1316,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1800,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0x800, 0x1000, 0x1000, 0x1800, 0 },
+               .gpiomux        = { 0, 0x800, 0x1000, 0x1000 },
+               .gpiomute       = 0x1800,
                .pll            = PLL_28,
                .tuner_type     = 5,
                .tuner_addr     = ADDR_UNSET,
@@ -1292,7 +1334,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 1,
                .gpiomask       = 0,
                .muxsel         = { 3, 1 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .needs_tvaudio  = 0,
                .no_msp34xx     = 1,
                .pll            = PLL_35,
@@ -1309,7 +1351,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xe00,
                .muxsel         = { 2, 3, 1, 1},
-               .audiomux       = { 0x400, 0x400, 0x400, 0x400, 0x800, 0x400 },
+               .gpiomux        = { 0x400, 0x400, 0x400, 0x400 },
+               .gpiomute       = 0x800,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_TEMIC_4036FY5_NTSC,
@@ -1325,7 +1368,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x03000F,
                .muxsel         = { 2, 3, 1, 0 },
-               .audiomux       = { 2, 0, 0, 0, 1 },
+               .gpiomux        = { 2, 0, 0, 0 },
+               .gpiomute       = 1,
                .pll            = PLL_28,
                .tuner_type     = 0,
                .tuner_addr     = ADDR_UNSET,
@@ -1342,7 +1386,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = -1,
                .gpiomask       = 11,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 2, 0, 0, 1, 8 },
+               .gpiomux        = { 2, 0, 0, 1 },
+               .gpiomute       = 8,
                .pll            = PLL_35,
                .tuner_type     = TUNER_TEMIC_PAL,
                .tuner_addr     = ADDR_UNSET,
@@ -1357,7 +1402,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 1,
                .gpiomask       = 0xF,
                .muxsel         = { 2, 2 },
-               .audiomux       = { },
+               .gpiomux        = { },
                .no_msp34xx     = 1,
                .needs_tvaudio  = 0,
                .pll            = PLL_28,
@@ -1376,7 +1421,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xFF,
                .muxsel         = { 2, 3, 1, 0 },
-               .audiomux       = { 1, 0, 4, 4, 9 },
+               .gpiomux        = { 1, 0, 4, 4 },
+               .gpiomute       = 9,
                .needs_tvaudio  = 0,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL,
@@ -1392,7 +1438,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xf03f,
                .muxsel         = { 2, 3, 1, 0 },
-               .audiomux       = { 0xbffe, 0, 0xbfff, 0, 0xbffe },
+               .gpiomux        = { 0xbffe, 0, 0xbfff, 0 },
+               .gpiomute       = 0xbffe,
                .pll            = PLL_28,
                .tuner_type     = TUNER_TEMIC_4006FN5_MULTI_PAL,
                .tuner_addr     = ADDR_UNSET,
@@ -1409,7 +1456,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = -1,
                .gpiomask       = 1,
                .muxsel         = { 2, 3, 0, 1 },
-               .audiomux       = { 0, 0, 1, 0, 0 },
+               .gpiomux        = { 0, 0, 1, 0 },
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_TEMIC_4006FN5_MULTI_PAL,
@@ -1428,7 +1475,8 @@ struct tvcard bttv_tvcards[] = {
                                /* Radio changed from 1e80 to 0x800 to make
                                FlyVideo2000S in .hu happy (gm)*/
                                /* -dk-???: set mute=0x1800 for tda9874h daughterboard */
-               .audiomux       = { 0x0000,0x0800,0x1000,0x1000,0x1800, 0x1080 },
+               .gpiomux        = { 0x0000,0x0800,0x1000,0x1000 },
+               .gpiomute       = 0x1800,
                .audio_hook     = fv2000s_audio,
                .no_msp34xx     = 1,
                .no_tda9875     = 1,
@@ -1446,7 +1494,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0xffff00,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x500, 0x500, 0x300, 0x900, 0x900 },
+               .gpiomux        = { 0x500, 0x500, 0x300, 0x900 },
+               .gpiomute       = 0x900,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL,
@@ -1463,7 +1512,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x010f00,
                .muxsel         = {2, 3, 0, 0 },
-               .audiomux       = {0x10000, 0, 0x10000, 0, 0, 0 },
+               .gpiomux        = {0x10000, 0, 0x10000, 0 },
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_SHARP_2U5JF5540_NTSC,
@@ -1484,7 +1533,8 @@ struct tvcard bttv_tvcards[] = {
                .gpiomask       = 0x4f8a00,
                /* 0x100000: 1=MSP enabled (0=disable again)
                * 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) */
-               .audiomux       = {0x947fff, 0x987fff,0x947fff,0x947fff, 0x947fff},
+               .gpiomux        = {0x947fff, 0x987fff,0x947fff,0x947fff },
+               .gpiomute       = 0x947fff,
                /* tvtuner, radio,   external,internal, mute,  stereo
                * tuner, Composit, SVid, Composit-on-Svid-adapter */
                .muxsel         = { 2, 3 ,0 ,1 },
@@ -1516,7 +1566,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 15,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0, 11, 7, 13, 0 }, /* TV and Radio with same GPIO ! */
+               .gpiomux        = { 0, 0, 11, 7 }, /* TV and Radio with same GPIO ! */
+               .gpiomute       = 13,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = 25,
@@ -1555,7 +1606,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x3f,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x01, 0x00, 0x03, 0x03, 0x09, 0x02 },
+               .gpiomux        = { 0x01, 0x00, 0x03, 0x03 },
+               .gpiomute       = 0x09,
                .needs_tvaudio  = 1,
                .no_msp34xx     = 1,
                .no_tda9875     = 1,
@@ -1584,7 +1636,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 4,
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 0, 0 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .needs_tvaudio  = 0,
                .tuner_type     = -1,
                .tuner_addr     = ADDR_UNSET,
@@ -1616,7 +1668,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x1C800F,  /* Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset */
                .muxsel         = { 2, 1, 1, },
-               .audiomux       = { 0, 1, 2, 2, 4 },
+               .gpiomux        = { 0, 1, 2, 2 },
+               .gpiomute       = 4,
                .needs_tvaudio  = 0,
                .tuner_type     = TUNER_PHILIPS_PAL,
                .tuner_addr     = ADDR_UNSET,
@@ -1635,7 +1688,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x140007,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 1, 2, 3, 4, 0 },
+               .gpiomux        = { 0, 1, 2, 3 },
+               .gpiomute       = 4,
                .tuner_type     = TUNER_PHILIPS_NTSC,
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
@@ -1649,7 +1703,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = -1,
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 0 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .needs_tvaudio  = 0,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
@@ -1665,13 +1719,14 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 7,
                .muxsel         = { 2, 3, 1, 1 },   /* Tuner, SVid, SVHS, SVid to SVHS connector */
-               .audiomux       = { 0 ,0 ,4, 4,4,4},/* Yes, this tuner uses the same audio output for TV and FM radio!
+               .gpiomux        = { 0, 0, 4, 4 },/* Yes, this tuner uses the same audio output for TV and FM radio!
                                                * This card lacks external Audio In, so we mute it on Ext. & Int.
                                                * The PCB can take a sbx1637/sbx1673, wiring unknown.
                                                * This card lacks PCI subsystem ID, sigh.
-                                               * audiomux=1: lower volume, 2+3: mute
+                                               * gpiomux =1: lower volume, 2+3: mute
                                                * btwincap uses 0x80000/0x80003
                                                */
+               .gpiomute       = 4,
                .needs_tvaudio  = 0,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
@@ -1718,7 +1773,7 @@ struct tvcard bttv_tvcards[] = {
                .radio_addr     = ADDR_UNSET,
 
                .gpiomask       = 7,
-               .audiomux       = {7},
+               .gpiomux        = {7},
        },
        [BTTV_BOARD_GVBCTV5PCI] = {
                .name           = "IODATA GV-BCTV5/PCI",
@@ -1728,7 +1783,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x0f0f80,
                .muxsel         = {2, 3, 1, 0 },
-               .audiomux       = {0x030000, 0x010000, 0, 0, 0x020000, 0},
+               .gpiomux        = {0x030000, 0x010000, 0, 0 },
+               .gpiomute       = 0x020000,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_NTSC_M,
@@ -1847,7 +1903,7 @@ struct tvcard bttv_tvcards[] = {
                .no_tda7432     = 1,
        },
        [BTTV_BOARD_OSPREY2x0] = {
-               .name           = "Osprey 210/220",   /* 0x1(A|B)-04C0-C1 */
+               .name           = "Osprey 210/220/230",   /* 0x1(A|B)-04C0-C1 */
                .video_inputs   = 2,
                .audio_inputs   = 1,
                .tuner          = -1,
@@ -1944,7 +2000,7 @@ struct tvcard bttv_tvcards[] = {
                .no_msp34xx     = 1,
                .no_tda9875     = 1,
                .no_tda7432     = 1,
-               .muxsel         = { 3, 0, 1, 2 },
+               .muxsel         = { 3, 1 },
                .pll            = PLL_28,
                .no_gpioirq     = 1,
                .has_dvb        = 1,
@@ -1958,7 +2014,7 @@ struct tvcard bttv_tvcards[] = {
                .gpiomask       = 2,
                /* TV, Comp1, Composite over SVID con, SVID */
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 2, 2, 0, 0, 0 },
+               .gpiomux        = { 2, 2, 0, 0 },
                .pll            = PLL_28,
                .has_radio      = 1,
                .tuner_type     = TUNER_PHILIPS_PAL,
@@ -1982,7 +2038,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = -1,
                .gpiomask       = 7,
                .muxsel         = { 2, 3, 1, 1},
-               .audiomux       = { 0, 1, 2, 3, 4},
+               .gpiomux        = { 0, 1, 2, 3},
+               .gpiomute       = 4,
                .needs_tvaudio  = 1,
                .tuner_type     = 5,
                .tuner_addr     = ADDR_UNSET,
@@ -2014,7 +2071,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = -1,
                .gpiomask       = 0,
                .muxsel         = { 2, 3 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .needs_tvaudio  = 0,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
@@ -2033,7 +2090,8 @@ struct tvcard bttv_tvcards[] = {
                .gpiomask       = 0x001e8007,
                .muxsel         = { 2, 3, 1, 0 },
                /*                  Tuner, Radio, external, internal, off,  on */
-               .audiomux       = { 0x08,  0x0f,  0x0a,     0x08,     0x0f, 0x08 },
+               .gpiomux        = { 0x08,  0x0f,  0x0a,     0x08 },
+               .gpiomute       = 0x0f,
                .needs_tvaudio  = 0,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
@@ -2150,7 +2208,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = -1,
                .gpiomask       = 0,
                .muxsel         = { 2, 3, 1, 0 },
-               .audiomux       = { 0 },
+               .gpiomux        = { 0 },
                .needs_tvaudio  = 0,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
@@ -2167,7 +2225,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 3,
                .gpiomask       = 0x00,
                .muxsel         = { 2, 3, 1, 0 },
-               .audiomux       = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */
+               .gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -2182,7 +2240,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 3,
                .gpiomask       = 0x00,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */
+               .gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -2202,7 +2260,7 @@ struct tvcard bttv_tvcards[] = {
                                        via the upper nibble of muxsel. here: used for
                                        xternal video-mux */
                .muxsel         = { 0x02, 0x12, 0x22, 0x32, 0x03, 0x13, 0x23, 0x33, 0x01, 0x00 },
-               .audiomux       = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */
+               .gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -2220,7 +2278,7 @@ struct tvcard bttv_tvcards[] = {
                                        via the upper nibble of muxsel. here: used for
                                        xternal video-mux */
                .muxsel         = { 0x02, 0x12, 0x22, 0x32, 0x03, 0x13, 0x23, 0x33, 0x01, 0x01 },
-               .audiomux       = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */
+               .gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = -1,
@@ -2308,7 +2366,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 3,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 1, 1, 1, 1, 0 },
+               .gpiomux        = { 1, 1, 1, 1 },
                .needs_tvaudio  = 1,
                .tuner_type     = TUNER_PHILIPS_PAL,
                .tuner_addr     = ADDR_UNSET,
@@ -2339,7 +2397,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x008007,
                .muxsel         = { 2, 3, 0, 0 },
-               .audiomux       = { 0, 0, 0, 0, 0x000003, 0 },
+               .gpiomux        = { 0, 0, 0, 0 },
+               .gpiomute       = 0x000003,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL,
                .tuner_addr     = ADDR_UNSET,
@@ -2375,7 +2434,7 @@ struct tvcard bttv_tvcards[] = {
                .needs_tvaudio  = 0,
                .gpiomask       = 0x68,
                .muxsel         = { 2, 3, 1 },
-               .audiomux       = { 0x68, 0x68, 0x61, 0x61, 0x00 },
+               .gpiomux        = { 0x68, 0x68, 0x61, 0x61 },
                .pll            = PLL_28,
        },
 
@@ -2390,7 +2449,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x008007,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 1, 2, 2, 3 },
+               .gpiomux        = { 0, 1, 2, 2 },
+               .gpiomute       = 3,
                .needs_tvaudio  = 0,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL,
@@ -2415,7 +2475,7 @@ struct tvcard bttv_tvcards[] = {
                .no_tda9875     = 1,
                .no_tda7432     = 1,
                .muxsel         = {2,2,2,2},/*878A input is always MUX0, see above.*/
-               .audiomux       = { 0, 0, 0, 0, 0, 0 }, /* card has no audio */
+               .gpiomux        = { 0, 0, 0, 0 }, /* card has no audio */
                .pll            = PLL_28,
                .needs_tvaudio  = 0,
                .muxsel_hook    = picolo_tetra_muxsel,/*Required as it doesn't follow the classic input selection policy*/
@@ -2433,7 +2493,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x0000000f,
                .muxsel         = { 2, 1, 1 },
-               .audiomux       = { 0x02, 0x00, 0x00, 0x00, 0x00 },
+               .gpiomux        = { 0x02, 0x00, 0x00, 0x00 },
                .tuner_type     = TUNER_TEMIC_PAL,
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
@@ -2489,7 +2549,7 @@ struct tvcard bttv_tvcards[] = {
                .muxsel           = { 2, 2, 2, 2, 2, 2, 2, 2,
                                3, 3, 3, 3, 3, 3, 3, 3 },
                .muxsel_hook      = sigmaSQ_muxsel,
-               .audiomux         = { 0 },
+               .gpiomux          = { 0 },
                .no_msp34xx       = 1,
                .pll              = PLL_28,
                .tuner_type       = -1,
@@ -2506,7 +2566,7 @@ struct tvcard bttv_tvcards[] = {
                .gpiomask         = 0x0,
                .muxsel           = { 2, 2, 2, 2 },
                .muxsel_hook      = sigmaSLC_muxsel,
-               .audiomux         = { 0 },
+               .gpiomux          = { 0 },
                .no_msp34xx       = 1,
                .pll              = PLL_28,
                .tuner_type       = -1,
@@ -2524,7 +2584,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = -1,
                .gpiomask       = 0xFF,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 2, 0, 0, 0, 10 },
+               .gpiomux        = { 2, 0, 0, 0 },
+               .gpiomute       = 10,
                .needs_tvaudio  = 0,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_PAL,
@@ -2558,7 +2619,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x3f,
                .muxsel         = {2, 3, 1, 0 },
-               .audiomux       = {0x31, 0x31, 0x31, 0x31, 0x31, 0x31 },
+               .gpiomux        = {0x31, 0x31, 0x31, 0x31 },
+               .gpiomute       = 0x31,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_PHILIPS_NTSC_M,
@@ -2581,7 +2643,7 @@ struct tvcard bttv_tvcards[] = {
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
                .gpiomask       = 0x008007,
-               .audiomux       = { 0, 0x000001,0,0, 0 },
+               .gpiomux        = { 0, 0x000001,0,0 },
                .needs_tvaudio  = 1,
                .has_radio      = 1,
        },
@@ -2683,7 +2745,7 @@ struct tvcard bttv_tvcards[] = {
                /* Michael Krufky <mkrufky@m1k.net> */
                .name           = "DViCO FusionHDTV 5 Lite",
                .tuner          = 0,
-               .tuner_type     = TUNER_LG_TDVS_H062F,
+               .tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
                .video_inputs   = 3,
@@ -2691,7 +2753,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .muxsel         = { 2, 3, 1 },
                .gpiomask       = 0x00e00007,
-               .audiomux       = { 0x00400005, 0, 0x00000001, 0, 0x00c00007, 0 },
+               .gpiomux        = { 0x00400005, 0, 0x00000001, 0 },
+               .gpiomute       = 0x00c00007,
                .no_msp34xx     = 1,
                .no_tda9875     = 1,
                .no_tda7432     = 1,
@@ -2699,7 +2762,7 @@ struct tvcard bttv_tvcards[] = {
        },
                /* ---- card 0x88---------------------------------- */
        [BTTV_BOARD_ACORP_Y878F] = {
-               /* Mauro Carvalho Chehab <mchehab@brturbo.com.br> */
+               /* Mauro Carvalho Chehab <mchehab@infradead.org> */
                .name           = "Acorp Y878F",
                .video_inputs   = 3,
                .audio_inputs   = 1,
@@ -2707,7 +2770,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x01fe00,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x001e00, 0, 0x018000, 0x014000, 0x002000, 0 },
+               .gpiomux        = { 0x001e00, 0, 0x018000, 0x014000 },
+               .gpiomute       = 0x002000,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_YMEC_TVF66T5_B_DFF,
@@ -2724,7 +2788,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x001c0007,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 1, 2, 2, 3 },
+               .gpiomux        = { 0, 1, 2, 2 },
+               .gpiomute       = 3,
                .needs_tvaudio  = 0,
                .pll            = PLL_28,
                .tuner_type     = TUNER_TENA_9533_DI,
@@ -2743,7 +2808,8 @@ struct tvcard bttv_tvcards[] = {
                .gpiomask      = 0x01fe00,
                .muxsel        = { 2,3,1,1,-1 },
                .digital_mode  = DIGITAL_MODE_CAMERA,
-               .audiomux      = { 0x00400, 0x10400, 0x04400, 0x80000, 0x12400, 0x46000  },
+               .gpiomux       = { 0x00400, 0x10400, 0x04400, 0x80000 },
+               .gpiomute      = 0x12400,
                .no_msp34xx    = 1,
                .pll           = PLL_28,
                .tuner_type    = TUNER_LG_PAL_FM,
@@ -2761,7 +2827,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x3f,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0x21, 0x20, 0x24, 0x2c, 0x29, 0x29 },
+               .gpiomux        = { 0x21, 0x20, 0x24, 0x2c },
+               .gpiomute       = 0x29,
                .no_msp34xx     = 1,
                .pll            = PLL_28,
                .tuner_type     = TUNER_YMEC_TVF_5533MF,
@@ -2795,7 +2862,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 15,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 2, 0, 0, 0, 1 },
+               .gpiomux        = { 2, 0, 0, 0 },
+               .gpiomute       = 1,
                .needs_tvaudio  = 1,
                .pll            = PLL_28,
                .tuner_type     = 2,
@@ -2811,7 +2879,7 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 0x108007,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 100000, 100002, 100002, 100000 },
+               .gpiomux        = { 100000, 100002, 100002, 100000 },
                .no_msp34xx     = 1,
                .no_tda9875     = 1,
                .no_tda7432     = 1,
@@ -2851,7 +2919,8 @@ struct tvcard bttv_tvcards[] = {
                .svhs           = 2,
                .gpiomask       = 7,
                .muxsel         = { 2, 3, 1, 1 },
-               .audiomux       = { 0, 1, 2, 3, 4 },
+               .gpiomux        = { 0, 1, 2, 3 },
+               .gpiomute       = 4,
                .tuner_type     = TUNER_TEMIC_4009FR5_PAL,
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
@@ -2922,21 +2991,21 @@ void __devinit bttv_idcard(struct bttv *btv)
 
        if (UNSET != audiomux[0]) {
                gpiobits = 0;
-               for (i = 0; i < 5; i++) {
-                       bttv_tvcards[btv->c.type].audiomux[i] = audiomux[i];
+               for (i = 0; i < 4; i++) {
+                       bttv_tvcards[btv->c.type].gpiomux[i] = audiomux[i];
                        gpiobits |= audiomux[i];
                }
        } else {
                gpiobits = audioall;
-               for (i = 0; i < 5; i++) {
-                       bttv_tvcards[btv->c.type].audiomux[i] = audioall;
+               for (i = 0; i < 4; i++) {
+                       bttv_tvcards[btv->c.type].gpiomux[i] = audioall;
                }
        }
        bttv_tvcards[btv->c.type].gpiomask = (UNSET != gpiomask) ? gpiomask : gpiobits;
        printk(KERN_INFO "bttv%d: gpio config override: mask=0x%x, mux=",
               btv->c.nr,bttv_tvcards[btv->c.type].gpiomask);
        for (i = 0; i < 5; i++) {
-               printk("%s0x%x", i ? "," : "", bttv_tvcards[btv->c.type].audiomux[i]);
+               printk("%s0x%x", i ? "," : "", bttv_tvcards[btv->c.type].gpiomux[i]);
        }
        printk("\n");
 }
@@ -3044,7 +3113,7 @@ static void miro_pinnacle_gpio(struct bttv *btv)
        gpio_inout(0xffffff, 0);
        gpio = gpio_read();
        id   = ((gpio>>10) & 63) -1;
-       msp  = bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx");
+       msp  = bttv_I2CRead(btv, I2C_ADDR_MSP3400, "MSP34xx");
        if (id < 32) {
                btv->tuner_type = miro_tunermap[id];
                if (0 == (gpio & 0x20)) {
@@ -3440,8 +3509,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
 
        if (bttv_tvcards[btv->c.type].digital_mode == DIGITAL_MODE_CAMERA) {
                /* detect Bt832 chip for quartzsight digital camera */
-               if ((bttv_I2CRead(btv, I2C_BT832_ALT1, "Bt832") >=0) ||
-                   (bttv_I2CRead(btv, I2C_BT832_ALT2, "Bt832") >=0))
+               if ((bttv_I2CRead(btv, I2C_ADDR_BT832_ALT1, "Bt832") >=0) ||
+                   (bttv_I2CRead(btv, I2C_ADDR_BT832_ALT2, "Bt832") >=0))
                        boot_bt832(btv);
        }
 
@@ -3450,19 +3519,19 @@ void __devinit bttv_init_card2(struct bttv *btv)
 
        /* try to detect audio/fader chips */
        if (!bttv_tvcards[btv->c.type].no_msp34xx &&
-           bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx") >=0)
+           bttv_I2CRead(btv, I2C_ADDR_MSP3400, "MSP34xx") >=0)
                request_module("msp3400");
 
        if (bttv_tvcards[btv->c.type].msp34xx_alt &&
-           bttv_I2CRead(btv, I2C_MSP3400_ALT, "MSP34xx (alternate address)") >=0)
+           bttv_I2CRead(btv, I2C_ADDR_MSP3400_ALT, "MSP34xx (alternate address)") >=0)
                request_module("msp3400");
 
        if (!bttv_tvcards[btv->c.type].no_tda9875 &&
-           bttv_I2CRead(btv, I2C_TDA9875, "TDA9875") >=0)
+           bttv_I2CRead(btv, I2C_ADDR_TDA9875, "TDA9875") >=0)
                request_module("tda9875");
 
        if (!bttv_tvcards[btv->c.type].no_tda7432 &&
-           bttv_I2CRead(btv, I2C_TDA7432, "TDA7432") >=0)
+           bttv_I2CRead(btv, I2C_ADDR_TDA7432, "TDA7432") >=0)
                request_module("tda7432");
 
        if (bttv_tvcards[btv->c.type].needs_tvaudio)
@@ -3473,16 +3542,11 @@ void __devinit bttv_init_card2(struct bttv *btv)
        if (btv->tda9887_conf)
                tda9887 = 1;
        if (0 == tda9887 && 0 == bttv_tvcards[btv->c.type].has_dvb &&
-           bttv_I2CRead(btv, I2C_TDA9887, "TDA9887") >=0)
+           bttv_I2CRead(btv, I2C_ADDR_TDA9887, "TDA9887") >=0)
                tda9887 = 1;
        /* Hybrid DVB card, DOES have a tda9887 */
        if (btv->c.type == BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE)
                tda9887 = 1;
-       if((btv->tuner_type == TUNER_PHILIPS_FM1216ME_MK3) ||
-          (btv->tuner_type == TUNER_PHILIPS_FM1236_MK3) ||
-          (btv->tuner_type == TUNER_PHILIPS_FM1256_IH3) ||
-           tda9887)
-               request_module("tda9887");
        if (btv->tuner_type != UNSET)
                request_module("tuner");
 }
@@ -3721,6 +3785,7 @@ static void __devinit osprey_eeprom(struct bttv *btv)
                       break;
               case 0x0060:
               case 0x0070:
+              case 0x00A0:
                       btv->c.type = BTTV_BOARD_OSPREY2x0;
                       /* enable output on select control lines */
                       gpio_inout(0xffffff,0x000303);
@@ -3794,18 +3859,18 @@ void bttv_tda9880_setnorm(struct bttv *btv, int norm)
 {
        /* fix up our card entry */
        if(norm==VIDEO_MODE_NTSC) {
-               bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].audiomux[0]=0x957fff;
-               bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].audiomux[4]=0x957fff;
+               bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].gpiomux[TVAUDIO_INPUT_TUNER]=0x957fff;
+               bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].gpiomute=0x957fff;
                dprintk("bttv_tda9880_setnorm to NTSC\n");
        }
        else {
-               bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].audiomux[0]=0x947fff;
-               bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].audiomux[4]=0x947fff;
+               bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].gpiomux[TVAUDIO_INPUT_TUNER]=0x947fff;
+               bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].gpiomute=0x947fff;
                dprintk("bttv_tda9880_setnorm to PAL\n");
        }
        /* set GPIO according */
        gpio_bits(bttv_tvcards[btv->c.type].gpiomask,
-                 bttv_tvcards[btv->c.type].audiomux[btv->audio]);
+                 bttv_tvcards[btv->c.type].gpiomux[btv->audio]);
 }
 
 
@@ -3936,7 +4001,7 @@ static void __devinit init_PXC200(struct bttv *btv)
  *      - sleep 1ms
  *      - write 0x0E
  *     read from GPIO_DATA into buf (uint_32)
- *      - if ( buf>>18 & 0x01 ) || ( buf>>19 && 0x01 != 0 )
+ *      - if ( buf>>18 & 0x01 ) || ( buf>>19 & 0x01 != 0 )
  *                error. ERROR_CPLD_Check_Failed.
  */
 /* ----------------------------------------------------------------------- */
@@ -4777,7 +4842,7 @@ static void picolo_tetra_muxsel (struct bttv* btv, unsigned int input)
  *
  * The IVC120G security card has 4 i2c controlled TDA8540 matrix
  * swichers to provide 16 channels to MUX0. The TDA8540's have
- * 4 indepedant outputs and as such the IVC120G also has the
+ * 4 independent outputs and as such the IVC120G also has the
  * optional "Monitor Out" bus. This allows the card to be looking
  * at one input while the monitor is looking at another.
  *
@@ -4926,7 +4991,7 @@ void __devinit bttv_check_chipset(void)
        int pcipci_fail = 0;
        struct pci_dev *dev = NULL;
 
-       if (pci_pci_problems & PCIPCI_FAIL)
+       if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL))       /* should check if target is AGP */
                pcipci_fail = 1;
        if (pci_pci_problems & (PCIPCI_TRITON|PCIPCI_NATOMA|PCIPCI_VIAETBF))
                triton1 = 1;
@@ -4944,12 +5009,14 @@ void __devinit bttv_check_chipset(void)
        if (vsfx)
                printk(KERN_INFO "bttv: Host bridge needs VSFX enabled.\n");
        if (pcipci_fail) {
-               printk(KERN_WARNING "bttv: BT848 and your chipset may not work together.\n");
+               printk(KERN_INFO "bttv: bttv and your chipset may not work "
+                                                       "together.\n");
                if (!no_overlay) {
-                       printk(KERN_WARNING "bttv: overlay will be disabled.\n");
+                       printk(KERN_INFO "bttv: overlay will be disabled.\n");
                        no_overlay = 1;
                } else {
-                       printk(KERN_WARNING "bttv: overlay forced. Use this option at your own risk.\n");
+                       printk(KERN_INFO "bttv: overlay forced. Use this "
+                                               "option at your own risk.\n");
                }
        }
        if (UNSET != latency)