Update of /cvsroot/alsa/alsa-kernel/pci/ac97 In directory sc8-pr-cvs1:/tmp/cvs-serv9962/pci/ac97
Modified Files: ac97_codec.c ac97_patch.c Log Message: - fixed the resume of ad18xx chips. - fixed the bit mask of cs spdif rate. Index: ac97_codec.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/ac97/ac97_codec.c,v retrieving revision 1.79 retrieving revision 1.80 diff -u -r1.79 -r1.80 --- ac97_codec.c 24 Mar 2003 16:32:33 -0000 1.79 +++ ac97_codec.c 27 Mar 2003 12:39:46 -0000 1.80 @@ -2537,7 +2537,7 @@ static int set_spdif_rate(ac97_t *ac97, unsigned short rate) { - unsigned short old, bits, reg; + unsigned short old, bits, reg, mask; if (! (ac97->ext_id & AC97_EI_SPDIF)) return -ENODEV; @@ -2551,6 +2551,7 @@ return -EINVAL; } reg = AC97_CSR_SPDIF; + mask = 1 << AC97_SC_SPSR_SHIFT; } else { switch (rate) { case 44100: bits = AC97_SC_SPSR_44K; break; @@ -2561,14 +2562,15 @@ return -EINVAL; } reg = AC97_SPDIF; + mask = AC97_SC_SPSR_MASK; } spin_lock(&ac97->reg_lock); - old = ac97->regs[reg] & ~AC97_SC_SPSR_MASK; + old = ac97->regs[reg] & ~mask; spin_unlock(&ac97->reg_lock); if (old != bits) { snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); - snd_ac97_update_bits(ac97, reg, AC97_SC_SPSR_MASK, bits); + snd_ac97_update_bits(ac97, reg, mask, bits); } snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); return 0; @@ -2660,7 +2662,7 @@ */ void snd_ac97_resume(ac97_t *ac97) { - int i; + int i, is_ad18xx, codec; if (ac97->reset) { ac97->reset(ac97); @@ -2685,6 +2687,20 @@ if (ac97->init) ac97->init(ac97); + is_ad18xx = (ac97->id & 0xffffff40) == AC97_ID_AD1881; + if (is_ad18xx) { + /* restore the AD18xx codec configurations */ + for (codec = 0; codec < 3; codec++) { + if (! ac97->spec.ad18xx.id[codec]) + continue; + /* select single codec */ + ac97->write(ac97, AC97_AD_SERIAL_CFG, ac97->spec.ad18xx.unchained[codec] | ac97->spec.ad18xx.chained[codec]); + ac97->write(ac97, AC97_AD_CODEC_CFG, ac97->spec.ad18xx.codec_cfg[codec]); + } + /* select all codecs */ + ac97->write(ac97, AC97_AD_SERIAL_CFG, 0x7000); + } + /* restore ac97 status */ for (i = 2; i < 0x7c ; i += 2) { if (i == AC97_POWERDOWN || i == AC97_EXTENDED_ID) @@ -2693,8 +2709,42 @@ * some chip (e.g. nm256) may hang up when unsupported registers * are accessed..! */ - if (test_bit(i, ac97->reg_accessed)) + if (test_bit(i, ac97->reg_accessed)) { + if (is_ad18xx) { + /* handle multi codecs for AD18xx */ + if (i == AC97_PCM) { + for (codec = 0; codec < 3; codec++) { + if (! ac97->spec.ad18xx.id[codec]) + continue; + /* select single codec */ + ac97->write(ac97, AC97_AD_SERIAL_CFG, ac97->spec.ad18xx.unchained[codec] | ac97->spec.ad18xx.chained[codec]); + /* update PCM bits */ + ac97->write(ac97, AC97_PCM, ac97->spec.ad18xx.pcmreg[codec]); + } + /* select all codecs */ + ac97->write(ac97, AC97_AD_SERIAL_CFG, 0x7000); + continue; + } else if (i == AC97_AD_TEST || + i == AC97_AD_CODEC_CFG || + i == AC97_AD_SERIAL_CFG) + continue; /* ignore */ + } snd_ac97_write(ac97, i, ac97->regs[i]); + snd_ac97_read(ac97, i); + } + } + + if (ac97->ext_id & AC97_EI_SPDIF) { + if (ac97->regs[AC97_EXTENDED_STATUS] & AC97_EA_SPDIF) { + /* reset spdif status */ + snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); + snd_ac97_write(ac97, AC97_EXTENDED_STATUS, ac97->regs[AC97_EXTENDED_STATUS]); + if (ac97->flags & AC97_CS_SPDIF) + snd_ac97_write(ac97, AC97_CSR_SPDIF, ac97->regs[AC97_CSR_SPDIF]); + else + snd_ac97_write(ac97, AC97_SPDIF, ac97->regs[AC97_SPDIF]); + snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */ + } } } #endif Index: ac97_patch.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/ac97/ac97_patch.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- ac97_patch.c 25 Feb 2003 16:56:25 -0000 1.9 +++ ac97_patch.c 27 Mar 2003 12:39:47 -0000 1.10 @@ -221,6 +221,7 @@ return 0; ac97->spec.ad18xx.unchained[idx] = mask; ac97->spec.ad18xx.id[idx] = val; + ac97->spec.ad18xx.codec_cfg[idx] = 0x0000; return mask; } @@ -238,6 +239,7 @@ snd_ac97_write_cache(ac97, AC97_AD_CODEC_CFG, codec_bits); ac97->spec.ad18xx.chained[idx] = cfg_bits[idx]; ac97->spec.ad18xx.id[idx] = val; + ac97->spec.ad18xx.codec_cfg[idx] = codec_bits ? codec_bits : 0x0004; return 1; } @@ -253,6 +255,7 @@ // test for chained codecs snd_ac97_write_cache(ac97, AC97_AD_SERIAL_CFG, ac97->spec.ad18xx.unchained[unchained_idx]); snd_ac97_write_cache(ac97, AC97_AD_CODEC_CFG, 0x0002); // ID1C + ac97->spec.ad18xx.codec_cfg[unchained_idx] = 0x0002; if (cidx1 >= 0) { if (patch_ad1881_chained1(ac97, cidx1, 0x0006)) // SDIE | ID1C patch_ad1881_chained1(ac97, cidx2, 0); @@ -306,6 +309,9 @@ if (num == 1) { /* ok, deselect all ID bits */ snd_ac97_write_cache(ac97, AC97_AD_CODEC_CFG, 0x0000); + ac97->spec.ad18xx.codec_cfg[0] = + ac97->spec.ad18xx.codec_cfg[1] = + ac97->spec.ad18xx.codec_cfg[2] = 0x0000; } /* required for AD1886/AD1885 combination */ ac97->ext_id = snd_ac97_read(ac97, AC97_EXTENDED_ID); ------------------------------------------------------- This SF.net email is sponsored by: The Definitive IT and Networking Event. Be There! NetWorld+Interop Las Vegas 2003 -- Register today! http://ads.sourceforge.net/cgi-bin/redirect.pl?keyn0001en _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog