Can you guys test this patch, and let me know if it fixes Via audio
problems on your kernel?

It should apply against 2.4.1 or 2.4.1-acXX kernels.  Note that it
should be applied with "patch -p0" while in the linux kernel source
directory, not applied with "patch -p1".

Regards,

        Jeff




Index: drivers/sound/via82cxxx_audio.c
===================================================================
RCS file: /cvsroot/gkernel/linux_2_4/drivers/sound/via82cxxx_audio.c,v
retrieving revision 1.1.1.13.22.1
diff -u -r1.1.1.13.22.1 via82cxxx_audio.c
--- drivers/sound/via82cxxx_audio.c     2001/02/18 23:58:28     1.1.1.13.22.1
+++ drivers/sound/via82cxxx_audio.c     2001/02/21 16:36:23
@@ -281,6 +281,8 @@
 
        int dev_dsp;            /* /dev/dsp index from register_sound_dsp() */
 
+       int locked_rate : 1;
+
        struct semaphore syscall_sem;
        struct semaphore open_sem;
 
@@ -503,10 +505,16 @@
 static int via_set_rate (struct ac97_codec *ac97,
                         struct via_channel *chan, unsigned rate)
 {
+       struct via_info *card = ac97->private_data;
        int rate_reg;
 
        DPRINTK ("ENTER, rate = %d\n", rate);
 
+       if (card->locked_rate) {
+               chan->rate = 48000;
+               goto out;
+       }
+
        if (rate > 48000)               rate = 48000;
        if (rate < 4000)                rate = 4000;
 
@@ -530,6 +538,13 @@
         */
        chan->rate = via_ac97_read_reg (ac97, rate_reg);
 
+       if (chan->rate == 0) {
+               card->locked_rate = 1;
+               chan->rate = 48000;
+               printk (KERN_WARNING PFX "Codec rate locked at 48Khz\n");
+       }
+
+out:
        DPRINTK ("EXIT, returning rate %d Hz\n", chan->rate);
        return chan->rate;
 }
@@ -1438,7 +1453,7 @@
  *     via_ac97_reset - Reset Via AC97 hardware
  *     @card: Private info for specified board
  *
- *     Reset Via AC97 hardware.
+ *     Reset Via AC97 codec, controller, and hardware.
  */
 
 static int __init via_ac97_reset (struct via_info *card)
@@ -1512,8 +1527,8 @@
         */
 
        /* enable variable rate, variable rate MIC ADC */
-       tmp16 = via_ac97_read_reg (&card->ac97, 0x2A);
-       via_ac97_write_reg (&card->ac97, 0x2A, tmp16 | (1<<0));
+       tmp16 = via_ac97_read_reg (&card->ac97, AC97_EXTENDED_STATUS);
+       via_ac97_write_reg (&card->ac97, AC97_EXTENDED_STATUS, tmp16 | 1);
 
        pci_read_config_byte (pdev, VIA_ACLINK_CTRL, &tmp8);
        if ((tmp8 & (VIA_CR41_AC97_ENABLE | VIA_CR41_AC97_RESET)) == 0) {
@@ -1588,8 +1603,22 @@
        }
 
        /* enable variable rate, variable rate MIC ADC */
-       tmp16 = via_ac97_read_reg (&card->ac97, 0x2A);
-       via_ac97_write_reg (&card->ac97, 0x2A, tmp16 | (1<<0));
+       tmp16 = via_ac97_read_reg (&card->ac97, AC97_EXTENDED_STATUS);
+       via_ac97_write_reg (&card->ac97, AC97_EXTENDED_STATUS, tmp16 | 1);
+
+       /*
+        * If we cannot enable VRA, we have a locked-rate codec.
+        * We try again to enable VRA before assuming so, however.
+        */
+       tmp16 = via_ac97_read_reg (&card->ac97, AC97_EXTENDED_STATUS);
+       if ((tmp16 & 1) == 0) {
+               via_ac97_write_reg (&card->ac97, AC97_EXTENDED_STATUS, tmp16 | 1);
+               tmp16 = via_ac97_read_reg (&card->ac97, AC97_EXTENDED_STATUS);
+               if ((tmp16 & 1) == 0) {
+                       card->locked_rate = 1;
+                       printk (KERN_WARNING PFX "Codec rate locked at 48Khz\n");
+               }
+       }
 
        DPRINTK ("EXIT, returning 0\n");
        return 0;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to