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;