Hi,

vidiocstuner-patch fixes broken v4l2 tv sound selection.
At least msp3400 dislikes any empty video_audio fields.

audiohook-patch is work-in-progress. It is what I currently run, running
with ~1 MHz i2c clock and i2c-algo-biths from CVS. It also moves
btv->audio_hooks within btv_call_i2c_clients, renamed btv_call_clients
now. Sometimes sound does not unmute after tune.. Let me know what you
think, I'll clean it up once new i2c is stabilized.

BTW: i2c CVS has gone out-of-sync with 2.5.x changes, hopefully we get
this fixed within a week.

-- 
  Kyösti Mälkki
  [EMAIL PROTECTED]
Only in orig/bttv-0.9.3/: .bp.2.5.30_bttv-0.9.x
Only in orig/bttv-0.9.3/: .bp.20_videobuf
diff -ur orig/bttv-0.9.3/bttv-cards.c bttv-0.9.3/bttv-cards.c
--- orig/bttv-0.9.3/bttv-cards.c        Tue Dec 10 22:45:40 2002
+++ bttv-0.9.3/bttv-cards.c     Sat Dec 28 21:05:48 2002
@@ -1809,7 +1809,7 @@
                btv->tuner_type = 33;
                if (autoload)
                        request_module("tda9887");
-               bttv_call_i2c_clients(btv,AUDC_CONFIG_PINNACLE,&id);
+               bttv_call_clients(btv,AUDC_CONFIG_PINNACLE,&id);
        }
 }
 
@@ -2022,7 +2022,7 @@
        if (-1 != tuner[btv->nr])
                btv->tuner_type = tuner[btv->nr];
        if (btv->tuner_type != -1)
-               bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type);
+               bttv_call_clients(btv,TUNER_SET_TYPE,&btv->tuner_type);
        printk("bttv%d: using tuner=%d\n",btv->nr,btv->tuner_type);
 
        if (bttv_tvcards[btv->type].has_radio)
@@ -2497,7 +2497,7 @@
        }
 
        request_module("bt832");
-       bttv_call_i2c_clients(btv, BT832_HEXDUMP, NULL);
+       bttv_call_clients(btv, BT832_HEXDUMP, NULL);
 
        printk("bttv%d: Reset Bt832 [line=0x%x]\n",btv->nr,resetbit);
        btwrite(0, BT848_GPIO_DATA);
@@ -2514,7 +2514,7 @@
 
        // bt832 on pixelview changes from i2c 0x8a to 0x88 after
        // being reset as above. So we must follow by this:
-       bttv_call_i2c_clients(btv, BT832_REATTACH, NULL);
+       bttv_call_clients(btv, BT832_REATTACH, NULL);
 }
 
 /* ----------------------------------------------------------------------- */
Binary files orig/bttv-0.9.3/bttv-cards.o and bttv-0.9.3/bttv-cards.o differ
diff -ur orig/bttv-0.9.3/bttv-driver.c bttv-0.9.3/bttv-driver.c
--- orig/bttv-0.9.3/bttv-driver.c       Tue Dec 10 23:01:13 2002
+++ bttv-0.9.3/bttv-driver.c    Fri Jan 10 23:25:13 2003
@@ -43,7 +43,7 @@
 struct bttv bttvs[BTTV_MAX];
 
 unsigned int bttv_debug = 0;
-unsigned int bttv_verbose = 1;
+unsigned int bttv_verbose = 0;
 unsigned int bttv_gpio = 0;
 
 /* config variables */
@@ -827,44 +827,45 @@
        "audio: intern", "audio: off"
 };
 
-static int
+int
 audio_mux(struct bttv *btv, int mode)
 {
-       int val,mux,i2c_mux,signal;
+       int val,mux;
        
+       btv->audio &= AUDIO_MUTE;
+       btv->audio |= mode;
+
+       mux = (btv->audio & AUDIO_MUTE) ? AUDIO_OFF : btv->audio;
+
        btaor(bttv_tvcards[btv->type].gpiomask,
              ~bttv_tvcards[btv->type].gpiomask,BT848_GPIO_OUT_EN);
+       val = bttv_tvcards[btv->type].audiomux[mux];
+       btaor(val,~bttv_tvcards[btv->type].gpiomask, BT848_GPIO_DATA);
+       if (bttv_gpio)
+               bttv_gpio_tracking(btv,audio_modes[mux]);
+
+       vprintk("bttv%d: amux: mode=%d audio=%d mux=%d\n",
+              btv->nr, mode, btv->audio, mux );
+
+       bttv_call_clients(btv,AUDC_SET_INPUT,&mux);
+       return 0;
+}
+
+int
+audio_mute(struct bttv *btv, int mute)
+{
+       int signal;     
+
        signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
 
-       switch (mode) {
-       case AUDIO_MUTE:
+       if ((mute) || (btv->opt_automute && !signal && !btv->radio_user)) {
                btv->audio |= AUDIO_MUTE;
-               break;
-       case AUDIO_UNMUTE:
+       }
+       else {
                btv->audio &= ~AUDIO_MUTE;
-               break;
-       case AUDIO_TUNER:
-       case AUDIO_RADIO:
-       case AUDIO_EXTERN:
-       case AUDIO_INTERN:
-               btv->audio &= AUDIO_MUTE;
-               btv->audio |= mode;
-       }
-       i2c_mux = mux = (btv->audio & AUDIO_MUTE) ? AUDIO_OFF : btv->audio;
-       if (btv->opt_automute && !signal && !btv->radio_user)
-               mux = AUDIO_OFF;
-#if 0
-       printk("bttv%d: amux: mode=%d audio=%d signal=%s mux=%d/%d irq=%s\n",
-              btv->nr, mode, btv->audio, signal ? "yes" : "no",
-              mux, i2c_mux, in_interrupt() ? "yes" : "no");
-#endif
+       }
+       audio_mux(btv, btv->audio);
 
-       val = bttv_tvcards[btv->type].audiomux[mux];
-       btaor(val,~bttv_tvcards[btv->type].gpiomask, BT848_GPIO_DATA);
-       if (bttv_gpio)
-               bttv_gpio_tracking(btv,audio_modes[mux]);
-       if (!in_interrupt())
-               bttv_call_i2c_clients(btv,AUDC_SET_INPUT,&(i2c_mux));
        return 0;
 }
 
@@ -876,9 +877,7 @@
        memset(&c,0,sizeof(c));
        c.norm    = btv->tvnorm;
        c.channel = btv->input;
-       bttv_call_i2c_clients(btv,VIDIOCSCHAN,&c);
-       if (btv->type == BTTV_VOODOOTV_FM)
-               bttv_tda9880_setnorm(btv,c.norm);
+       bttv_call_clients(btv,VIDIOCSCHAN,&c);
 }
 
 static int
@@ -988,9 +987,7 @@
                return -EINVAL;
        if (i >= 4 && i <= 8) {
                memset(&va,0,sizeof(va));
-               bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
-               if (btv->audio_hook)
-                       btv->audio_hook(btv,&va,0);
+               bttv_call_clients(btv, VIDIOCGAUDIO, &va);
        }
        switch (c->id) {
        case V4L2_CID_BRIGHTNESS:
@@ -1055,9 +1052,7 @@
                return -EINVAL;
        if (i >= 4 && i <= 8) {
                memset(&va,0,sizeof(va));
-               bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
-               if (btv->audio_hook)
-                       btv->audio_hook(btv,&va,0);
+               bttv_call_clients(btv, VIDIOCGAUDIO, &va);
        }
        switch (c->id) {
        case V4L2_CID_BRIGHTNESS:
@@ -1075,10 +1070,8 @@
        case V4L2_CID_AUDIO_MUTE:
                if (c->value) {
                        va.flags |= VIDEO_AUDIO_MUTE;
-                       audio_mux(btv, AUDIO_MUTE);
                } else {
                        va.flags &= ~VIDEO_AUDIO_MUTE;
-                       audio_mux(btv, AUDIO_UNMUTE);
                }
                break;
 
@@ -1126,9 +1119,7 @@
                return -EINVAL;
        }
        if (i >= 4 && i <= 8) {
-               bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
-               if (btv->audio_hook)
-                       btv->audio_hook(btv,&va,1);
+               bttv_call_clients(btv, VIDIOCSAUDIO, &va);
        }
        return 0;
 }
@@ -1359,9 +1350,7 @@
                unsigned long *freq = arg;
                down(&btv->lock);
                btv->freq=*freq;
-               bttv_call_i2c_clients(btv,VIDIOCSFREQ,freq);
-               if (btv->has_matchbox && btv->radio_user)
-                       tea5757_set_freq(btv,*freq);
+               bttv_call_clients(btv,VIDIOCSFREQ,freq);
                up(&btv->lock);
                return 0;
        }
@@ -1378,7 +1367,7 @@
                v->flags     = VIDEO_TUNER_PAL|VIDEO_TUNER_NTSC|VIDEO_TUNER_SECAM;
                v->mode      = btv->tvnorm;
                v->signal    = (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC) ? 0xFFFF : 
0;
-               bttv_call_i2c_clients(btv,cmd,v);
+               bttv_call_clients(btv,cmd,v);
                return 0;
        }
        case VIDIOCSTUNER:
@@ -1392,7 +1381,7 @@
 
                down(&btv->lock);
                set_tvnorm(btv,v->mode);
-               bttv_call_i2c_clients(btv,cmd,v);
+               bttv_call_clients(btv,cmd,v);
                up(&btv->lock);
                return 0;
        }
@@ -1453,12 +1442,7 @@
                v->mode  = VIDEO_SOUND_MONO;
 
                down(&btv->lock);
-               bttv_call_i2c_clients(btv,cmd,v);
-
-               /* card specific hooks */
-               if (btv->audio_hook)
-                       btv->audio_hook(btv,v,0);
-
+               bttv_call_clients(btv,cmd,v);
                up(&btv->lock);
                return 0;
        }
@@ -1471,13 +1455,7 @@
                        return -EINVAL;
 
                down(&btv->lock);
-               audio_mux(btv, (v->flags&VIDEO_AUDIO_MUTE) ? AUDIO_MUTE : 
AUDIO_UNMUTE);
-               bttv_call_i2c_clients(btv,cmd,v);
-
-               /* card specific hooks */
-               if (btv->audio_hook)
-                       btv->audio_hook(btv,v,1);
-               
+               bttv_call_clients(btv,cmd,v);
                up(&btv->lock);
                return 0;
        }
@@ -1599,9 +1577,7 @@
                        /* Hmmm ... */
                        struct video_audio va;
                        memset(&va, 0, sizeof(struct video_audio));
-                       bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
-                       if (btv->audio_hook)
-                               btv->audio_hook(btv,&va,0);
+                       bttv_call_clients(btv, VIDIOCGAUDIO, &va);
                        if(va.mode & VIDEO_SOUND_STEREO)
                                t->rxsubchans |= V4L2_TUNER_SUB_STEREO;
                        if(va.mode & VIDEO_SOUND_LANG1)
@@ -1625,6 +1601,7 @@
                {
                        struct video_audio va;
                        memset(&va, 0, sizeof(struct video_audio));
+                       bttv_call_clients(btv, VIDIOCGAUDIO, &va);
                        if (t->audmode == V4L2_TUNER_MODE_MONO)
                                va.mode = VIDEO_SOUND_MONO;
                        else if (t->audmode == V4L2_TUNER_MODE_STEREO)
@@ -1633,9 +1610,7 @@
                                va.mode = VIDEO_SOUND_LANG1;
                        else if (t->audmode == V4L2_TUNER_MODE_LANG2)
                                va.mode = VIDEO_SOUND_LANG2;
-                       bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
-                       if (btv->audio_hook)
-                               btv->audio_hook(btv,&va,1);
+                       bttv_call_clients(btv, VIDIOCSAUDIO, &va);
                }
                up(&btv->lock);
                return 0;
@@ -1660,9 +1635,7 @@
                        return -EINVAL;
                down(&btv->lock);
                btv->freq = f->frequency;
-               bttv_call_i2c_clients(btv,VIDIOCSFREQ,&btv->freq);
-               if (btv->has_matchbox && btv->radio_user)
-                       tea5757_set_freq(btv,btv->freq);
+               bttv_call_clients(btv,VIDIOCSFREQ,&btv->freq);
                up(&btv->lock);
                return 0;
        }
@@ -2523,9 +2496,7 @@
                if (i >= 4 && i <= 8) {
                        struct video_audio va;
                        memset(&va,0,sizeof(va));
-                       bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
-                       if (btv->audio_hook)
-                               btv->audio_hook(btv,&va,0);
+                       bttv_call_clients(btv, VIDIOCGAUDIO, &va);
                        switch (bttv_ctls[i].id) {
                        case V4L2_CID_AUDIO_VOLUME:
                                if (!(va.flags & VIDEO_AUDIO_VOLUME))
@@ -2835,9 +2806,8 @@
        file->private_data = btv;
 
        i2c_vidiocschan(btv);
-       bttv_call_i2c_clients(btv,VIDIOCSFREQ,&v);
-        bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type);
-       audio_mux(btv,AUDIO_RADIO);
+       bttv_call_clients(btv,VIDIOCSFREQ,&v);
+        bttv_call_clients(btv,AUDC_SET_RADIO,&btv->tuner_type);
 
        up(&btv->lock);
         return 0;
@@ -2882,7 +2852,7 @@
                    russia:         65.0 MHz - 108.0 MHz */
                 v->rangelow=(int)(65*16);
                 v->rangehigh=(int)(108*16);
-                bttv_call_i2c_clients(btv,cmd,v);
+                bttv_call_clients(btv,cmd,v);
                 return 0;
         }
         case VIDIOCSTUNER:
@@ -3206,8 +3176,8 @@
                 if ((astat & BT848_INT_RISCI)  &&  (stat & (1<<28)))
                        bttv_irq_switch_fields(btv);
 
-               if ((astat & BT848_INT_HLOCK)  &&  btv->opt_automute)
-                       audio_mux(btv, -1);
+               //if ((astat & BT848_INT_HLOCK)  &&  btv->opt_automute)
+               //      audio_mux(btv, -1);
 
                if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
                        printk(KERN_INFO "bttv%d: %s%s @ %08x,",btv->nr,
@@ -3437,7 +3407,7 @@
        bt848_contrast(btv,32768);
        bt848_hue(btv,32768);
        bt848_sat(btv,32768);
-       audio_mux(btv,AUDIO_MUTE);
+       audio_mute(btv,1);
        set_input(btv,0);
 
        /* everything is fine */
@@ -3475,7 +3445,7 @@
 
         /* unregister i2c_bus */
        if (0 == btv->i2c_rc)
-               i2c_bit_del_bus(&btv->i2c_adap);
+               i2c_biths_del_bus(&btv->i2c_adap);
 
        /* unregister video4linux */
         if (btv->video_dev.minor!=-1)
Only in bttv-0.9.3/: bttv-driver.c.orig
Only in bttv-0.9.3/: bttv-driver.c~~
Binary files orig/bttv-0.9.3/bttv-driver.o and bttv-0.9.3/bttv-driver.o differ
diff -ur orig/bttv-0.9.3/bttv-if.c bttv-0.9.3/bttv-if.c
--- orig/bttv-0.9.3/bttv-if.c   Tue Dec 10 22:45:40 2002
+++ bttv-0.9.3/bttv-if.c        Sun Dec 29 15:52:38 2002
@@ -36,10 +36,11 @@
 #include "bttvp.h"
 #include "tuner.h"
 
-static struct i2c_algo_bit_data bttv_i2c_algo_template;
+static struct i2c_algo_biths_data bttv_i2c_algo_template;
 static struct i2c_adapter bttv_i2c_adap_template;
 static struct i2c_client bttv_i2c_client_template;
 
+
 EXPORT_SYMBOL(bttv_get_cardinfo);
 EXPORT_SYMBOL(bttv_get_pcidev);
 EXPORT_SYMBOL(bttv_get_id);
@@ -152,48 +153,6 @@
 /* ----------------------------------------------------------------------- */
 /* I2C functions                                                           */
 
-void bttv_bit_setscl(void *data, int state)
-{
-       struct bttv *btv = (struct bttv*)data;
-
-       if (state)
-               btv->i2c_state |= 0x02;
-       else
-               btv->i2c_state &= ~0x02;
-       btwrite(btv->i2c_state, BT848_I2C);
-       btread(BT848_I2C);
-}
-
-void bttv_bit_setsda(void *data, int state)
-{
-       struct bttv *btv = (struct bttv*)data;
-
-       if (state)
-               btv->i2c_state |= 0x01;
-       else
-               btv->i2c_state &= ~0x01;
-       btwrite(btv->i2c_state, BT848_I2C);
-       btread(BT848_I2C);
-}
-
-static int bttv_bit_getscl(void *data)
-{
-       struct bttv *btv = (struct bttv*)data;
-       int state;
-       
-       state = btread(BT848_I2C) & 0x02 ? 1 : 0;
-       return state;
-}
-
-static int bttv_bit_getsda(void *data)
-{
-       struct bttv *btv = (struct bttv*)data;
-       int state;
-
-       state = btread(BT848_I2C) & 0x01;
-       return state;
-}
-
 static void bttv_inc_use(struct i2c_adapter *adap)
 {
        MOD_INC_USE_COUNT;
@@ -216,7 +175,7 @@
                }
        }
        if (btv->tuner_type != -1)
-               bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type);
+               bttv_call_clients(btv,TUNER_SET_TYPE,&btv->tuner_type);
         if (bttv_verbose)
                printk("bttv%d: i2c attach [client=%s,%s]\n",btv->nr,
                       client->name, (i < I2C_CLIENTS_MAX) ?  "ok" : "failed");
@@ -240,7 +199,7 @@
         return 0;
 }
 
-void bttv_call_i2c_clients(struct bttv *btv, unsigned int cmd, void *arg)
+void bttv_call_clients(struct bttv *btv, unsigned int cmd, void *arg)
 {
        int i;
        
@@ -252,23 +211,83 @@
                btv->i2c_clients[i]->driver->command(
                        btv->i2c_clients[i],cmd,arg);
        }
+
+       switch (cmd) {
+           case VIDIOCGAUDIO:
+                   if (btv->audio_hook)
+                           btv->audio_hook(btv, arg, 0);
+                   break;
+           case VIDIOCSAUDIO:
+           {
+                   struct video_audio *v = arg;
+
+                   audio_mute(btv, (v->flags & VIDEO_AUDIO_MUTE) ? 1 : 0);
+                   if (btv->audio_hook)
+                           btv->audio_hook(btv, arg, 1);
+                   break;
+           }
+           case VIDIOCSFREQ:
+                   if (btv->has_matchbox && btv->radio_user) {
+                           unsigned long *freq = arg;
+                           tea5757_set_freq(btv, *freq);
+                   }
+                   break;
+           case VIDIOCSCHAN:
+                   if (btv->type == BTTV_VOODOOTV_FM) {
+                           struct video_channel *c = arg;
+                           bttv_tda9880_setnorm(btv,c->norm);
+                   }
+                   break;
+           case AUDC_SET_RADIO:
+                   audio_mux(btv,AUDIO_RADIO);
+                   break;
+       }
 }
 
 void bttv_i2c_call(unsigned int card, unsigned int cmd, void *arg)
 {
        if (card >= bttv_num)
                return;
-       bttv_call_i2c_clients(&bttvs[card], cmd, arg);
+       bttv_call_clients(&bttvs[card], cmd, arg);
 }
 
-static struct i2c_algo_bit_data bttv_i2c_algo_template = {
-       .setsda  = bttv_bit_setsda,
-       .setscl  = bttv_bit_setscl,
-       .getsda  = bttv_bit_getsda,
-       .getscl  = bttv_bit_getscl,
-       .udelay  = 16,
-       .mdelay  = 10,
-       .timeout = 200,
+
+static _HS_ATTR_ void bttv_bit_setstate(struct i2c_algo_biths_data *adap)
+{
+       adap->hw_state &= ~(BT848_I2C_SCL | BT848_I2C_SDA);
+       if (adap->ctrl & _HS_SCL)
+               adap->hw_state |= BT848_I2C_SCL;
+
+       if (adap->ctrl & _HS_SDA)
+               adap->hw_state |= BT848_I2C_SDA;
+}
+
+static _HS_ATTR_ void bttv_bit_setscl(void *bt848_i2c, int hw_state)
+{      
+       writel(hw_state, bt848_i2c);
+       readl(bt848_i2c);
+}
+#define bttv_bit_setsda bttv_bit_setscl
+
+static _HS_ATTR_ int bttv_bit_getscl(void *bt848_i2c)
+{
+       return (readl(bt848_i2c) & BT848_I2C_SCL);
+}
+
+static _HS_ATTR_ int bttv_bit_getsda(void *bt848_i2c)
+{
+       return (readl(bt848_i2c) & BT848_I2C_SDA);
+}
+
+#define xloop_kHz(x) (x * 0x10c6 / 4000)
+static struct i2c_algo_biths_data bttv_i2c_algo_template = {
+       setstate:  bttv_bit_setstate,
+       setsda:  bttv_bit_setsda,
+       setscl:  bttv_bit_setscl,
+       getsda:  bttv_bit_getsda,
+       getscl:  bttv_bit_getscl,
+       xloops:  xloop_kHz(1000),
+       timeout: HZ/100,
 };
 
 static struct i2c_adapter bttv_i2c_adap_template = {
@@ -332,7 +351,6 @@
 void __devinit bttv_readee(struct bttv *btv, unsigned char *eedata, int addr)
 {
        int i;
-        
        if (bttv_I2CWrite(btv, addr, 0, -1, 0)<0) {
                printk(KERN_WARNING "bttv: readee error\n");
                return;
@@ -352,21 +370,21 @@
        memcpy(&btv->i2c_adap, &bttv_i2c_adap_template,
               sizeof(struct i2c_adapter));
        memcpy(&btv->i2c_algo, &bttv_i2c_algo_template,
-              sizeof(struct i2c_algo_bit_data));
+              sizeof(struct i2c_algo_biths_data));
        memcpy(&btv->i2c_client, &bttv_i2c_client_template,
               sizeof(struct i2c_client));
 
        sprintf(btv->i2c_adap.name+strlen(btv->i2c_adap.name),
                " #%d", btv->nr);
-        btv->i2c_algo.data = btv;
+
+       btv->i2c_algo.hw_data = btv->bt848_mmio + BT848_I2C;
+       btv->i2c_algo.hw_state = btread(BT848_I2C);
+
         btv->i2c_adap.data = btv;
         btv->i2c_adap.algo_data = &btv->i2c_algo;
         btv->i2c_client.adapter = &btv->i2c_adap;
 
-       bttv_bit_setscl(btv,1);
-       bttv_bit_setsda(btv,1);
-
-       btv->i2c_rc = i2c_bit_add_bus(&btv->i2c_adap);
+       btv->i2c_rc = i2c_biths_add_bus(&btv->i2c_adap);
        return btv->i2c_rc;
 }
 
Binary files orig/bttv-0.9.3/bttv-if.o and bttv-0.9.3/bttv-if.o differ
Binary files orig/bttv-0.9.3/bttv-risc.o and bttv-0.9.3/bttv-risc.o differ
Binary files orig/bttv-0.9.3/bttv-vbi.o and bttv-0.9.3/bttv-vbi.o differ
diff -ur orig/bttv-0.9.3/bttv.h bttv-0.9.3/bttv.h
--- orig/bttv-0.9.3/bttv.h      Tue Dec 10 22:45:40 2002
+++ bttv-0.9.3/bttv.h   Sat Dec 28 18:26:00 2002
@@ -243,9 +243,7 @@
 
 /* i2c */
 #define I2C_CLIENTS_MAX 16
-extern void bttv_bit_setscl(void *data, int state);
-extern void bttv_bit_setsda(void *data, int state);
-extern void bttv_call_i2c_clients(struct bttv *btv, unsigned int cmd, void *arg);
+extern void bttv_call_clients(struct bttv *btv, unsigned int cmd, void *arg);
 extern int bttv_I2CRead(struct bttv *btv, unsigned char addr, char *probe_for);
 extern int bttv_I2CWrite(struct bttv *btv, unsigned char addr, unsigned char b1,
                         unsigned char b2, int both);
Binary files orig/bttv-0.9.3/bttv.o and bttv-0.9.3/bttv.o differ
diff -ur orig/bttv-0.9.3/bttvp.h bttv-0.9.3/bttvp.h
--- orig/bttv-0.9.3/bttvp.h     Tue Dec 10 22:57:21 2002
+++ bttv-0.9.3/bttvp.h  Sat Dec 28 18:26:00 2002
@@ -29,7 +29,7 @@
 #include <linux/types.h>
 #include <linux/wait.h>
 #include <linux/i2c.h>
-#include <linux/i2c-algo-bit.h>
+#include <linux/i2c-algo-biths.h>
 #include <linux/videodev.h>
 #include <linux/pci.h>
 #include <asm/scatterlist.h>
@@ -268,7 +268,7 @@
        
        /* i2c layer */
        struct i2c_adapter         i2c_adap;
-       struct i2c_algo_bit_data   i2c_algo;
+       struct i2c_algo_biths_data i2c_algo;
        struct i2c_client          i2c_client;
        int                        i2c_state, i2c_rc;
        struct i2c_client         *i2c_clients[I2C_CLIENTS_MAX];
Only in orig/bttv-0.9.3/: log
Binary files orig/bttv-0.9.3/video-buf.o and bttv-0.9.3/video-buf.o differ
--- bttv-driver.c.orig  Fri Jan 10 23:24:04 2003
+++ bttv-driver.c       Fri Jan 10 23:25:13 2003
@@ -1601,6 +1601,7 @@
                {
                        struct video_audio va;
                        memset(&va, 0, sizeof(struct video_audio));
+                       bttv_call_clients(btv, VIDIOCGAUDIO, &va);
                        if (t->audmode == V4L2_TUNER_MODE_MONO)
                                va.mode = VIDEO_SOUND_MONO;
                        else if (t->audmode == V4L2_TUNER_MODE_STEREO)

Reply via email to