--- ac97_pcm.c.orig 2005-02-08 15:42:46.000000000 -0500 +++ ac97_pcm.c 2005-02-11 11:03:49.757899504 -0500 @@ -312,6 +312,7 @@ return 0; if (ac97_is_rev22(ac97) || ac97_can_amap(ac97)) { unsigned short slots = 0; + /*snd_printk("ac97_is_rev22: %d\n", ac97_is_rev22(ac97));*/ if (ac97_is_rev22(ac97)) { /* Note: it's simply emulation of AMAP behaviour */ u16 es; @@ -553,10 +554,12 @@ { ac97_bus_t *bus; int i, cidx, r, ok_flag; - unsigned int reg_ok = 0; + unsigned int reg_ok[4] = {0,0,0,0}; unsigned char reg; int err = 0; + snd_printk("slots: 0x%04X\n", slots); + r = rate > 48000; bus = pcm->bus; if (cfg == AC97_PCM_CFG_SPDIF) { @@ -597,19 +600,23 @@ continue; for (cidx = 0; cidx < 4; cidx++) { if (pcm->r[r].rslots[cidx] & (1 << i)) { + snd_printk("matching slot: cidx=%d, slot=%d\n", cidx, i); reg = get_slot_reg(pcm, cidx, i, r); if (reg == 0xff) { snd_printk(KERN_ERR "invalid AC97 slot %i?\n", i); continue; } - if (reg_ok & (1 << (reg - AC97_PCM_FRONT_DAC_RATE))) + if (reg_ok[cidx] & (1 << (reg - AC97_PCM_FRONT_DAC_RATE))) continue; //printk(KERN_DEBUG "setting ac97 reg 0x%x to rate %d\n", reg, rate); + snd_printk("setting ac97 reg 0x%x to rate %d (codec %d)\n", reg, rate, cidx); err = snd_ac97_set_rate(pcm->r[r].codec[cidx], reg, rate); if (err < 0) snd_printk(KERN_ERR "error in snd_ac97_set_rate: cidx=%d, reg=0x%x, rate=%d, err=%d\n", cidx, reg, rate, err); - else - reg_ok |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE)); + else { + reg_ok[cidx] |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE)); + snd_printk("success in snd_ac97_set_rate: cidx=%d, reg=0x%x, rate=%d\n", cidx, reg, rate); + } } } }