--- alsa-driver-0.9.0rc6/alsa-kernel/pci/ac97/ac97_codec.c 2002-10-30 15:20:08.000000000 +0100 +++ alsa-driver-0.9.0rc6-ae/alsa-kernel/pci/ac97/ac97_codec.c 2002-11-26 10:21:13.000000000 +0100 @@ -1946,6 +1946,51 @@ * PCM support */ + +// AE: Updating SPDIF Clock +static void ae_set_spdif(ac97_t *ac97, unsigned short rate) +{ + unsigned short old, new; + + // Get new SPDIF Rate + switch(rate) { + case 48000: + rate = AC97_SC_SPSR_48K; + break; + + case 44100: + rate = AC97_SC_SPSR_44K; + break; + + case 32000: + rate = AC97_SC_SPSR_32K; + break; + + default: + rate = AC97_SC_SPSR_48K; + break; + } + + + // Do we need to change SR ? + old = ac97->regs[AC97_SPDIF]; + new = (old & ~ AC97_SC_SPSR_MASK) | rate; + if (old != new) { + + // Disable SPDIF + snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); + + + // Set SPDIF out RATE + snd_ac97_update_bits(ac97, AC97_SPDIF, AC97_SC_SPSR_MASK, rate); + + + // Re-Enable SPDIF + snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); + } +} + + int snd_ac97_set_rate(ac97_t *ac97, int reg, unsigned short rate) { unsigned short mask; @@ -1978,7 +2023,13 @@ if (tmp > 65535) return -EINVAL; snd_ac97_update(ac97, reg, tmp & 0xffff); - snd_ac97_read(ac97, reg); + rate = snd_ac97_read(ac97, reg); + + // AE: Set SPDIF out RATE + if (reg == AC97_PCM_FRONT_DAC_RATE) { + ae_set_spdif(ac97, rate); + } + return 0; }