In message <[EMAIL PROTECTED]>, Takashi Iwai writes:

>we have already a method to change the spdif rate:
>       snd_ac97_set_rate(ac97, AC97_SPDIF, rate);
>but it didn't work properly.  so i fixed the relevant part based on
>your patch.

>to via82xx.c, the above call was just added, so that the spdif rate is
>automatically changed.

I have produced a minimal patch based upon your work in CVS to get the SPDIF
port going on A7V8X motherboards with 0.9.0rc6 until 0.9.0rc7 is released:

--- alsa-driver-0.9.0rc6/alsa-kernel/pci/via82xx.c.orig 2002-12-27 17:25:29.000000000 
-0500
+++ alsa-driver-0.9.0rc6/alsa-kernel/pci/via82xx.c      2002-12-27 17:27:22.000000000 
+-0500
@@ -613,6 +613,9 @@
        snd_pcm_runtime_t *runtime = substream->runtime;
 
        snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE, runtime->rate);
+       snd_ac97_set_rate(chip->ac97, AC97_PCM_SURR_DAC_RATE, runtime->rate);
+       snd_ac97_set_rate(chip->ac97, AC97_PCM_LFE_DAC_RATE, runtime->rate);
+       snd_ac97_set_rate(chip->ac97, AC97_SPDIF, runtime->rate);
        if (chip->chip_type == TYPE_VIA8233 &&
            chip->playback.reg_offset != VIA_REG_MULTPLAY_STATUS) {
                unsigned int tmp;
--- alsa-driver-0.9.0rc6/alsa-kernel/pci/ac97/ac97_codec.c.orig 2002-12-27 
17:29:08.000000000 -0500
+++ alsa-driver-0.9.0rc6/alsa-kernel/pci/ac97/ac97_codec.c      2002-12-27 
+17:43:43.000000000 -0500
@@ -1942,6 +1942,45 @@
        }
 }
 
+static int set_spdif_rate(ac97_t *ac97, unsigned short rate)
+{
+       unsigned short old, bits, reg;
+
+       if (! (ac97->ext_id & AC97_EI_SPDIF))
+               return -ENODEV;
+
+       if (ac97->flags & AC97_CS_SPDIF) {
+               switch (rate) {
+               case 48000: bits = 0; break;
+               case 44100: bits = 1 << AC97_SC_SPSR_SHIFT; break;
+               default: /* invalid - disable output */
+                       snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, 
+AC97_EA_SPDIF, 0);
+                       return -EINVAL;
+               }
+               reg = AC97_CSR_SPDIF;
+       } else {
+               switch (rate) {
+               case 44100: bits = AC97_SC_SPSR_44K; break;
+               case 48000: bits = AC97_SC_SPSR_48K; break;
+               case 32000: bits = AC97_SC_SPSR_32K; break;
+               default: /* invalid - disable output */
+                       snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, 
+AC97_EA_SPDIF, 0);
+                       return -EINVAL;
+               }
+               reg = AC97_SPDIF;
+       }
+
+       spin_lock(&ac97->reg_lock);
+       old = ac97->regs[reg] & ~AC97_SC_SPSR_MASK;
+       if (old != bits) {
+               snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 
+0);
+               snd_ac97_update_bits_nolock(ac97, reg, AC97_SC_SPSR_MASK, bits);
+       }
+       snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 
+AC97_EA_SPDIF);
+       spin_unlock(&ac97->reg_lock);
+       return 0;
+}
+
 /*
  *  PCM support
  */
@@ -1971,8 +2010,9 @@
                                return -EINVAL;
                break;
        case AC97_SPDIF:
-               return 0;
-       default: return -EINVAL;
+               return set_spdif_rate(ac97, rate);
+       default:
+               return -EINVAL;
        }
        tmp = ((unsigned int)rate * ac97->clock) / 48000;
        if (tmp > 65535)

-- 
John GOTTS <[EMAIL PROTECTED]>  http://linuxsavvy.com/staff/jgotts


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to