Update of /cvsroot/alsa/alsa-kernel/pci/ac97 In directory sc8-pr-cvs1:/tmp/cvs-serv28208/pci/ac97
Modified Files: ac97_pcm.c Log Message: - added spdif field to struct ac97_pcm. - snd_ac97_set_rate() accepts AC97_SPDIF. - allow fixed rate mic capture. - optimized the loop in snd_ac97_pcm_open. Index: ac97_pcm.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/ac97/ac97_pcm.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- ac97_pcm.c 30 Nov 2003 18:35:33 -0000 1.7 +++ ac97_pcm.c 3 Dec 2003 13:39:06 -0000 1.8 @@ -165,6 +165,8 @@ return 0xff; if (slot > 11) return 0xff; + if (pcm->spdif) + return AC97_SPDIF; /* pseudo register */ if (pcm->stream == SNDRV_PCM_STREAM_PLAYBACK) return rate_reg_tables[dbl][pcm->r[dbl].rate_table[cidx]][slot - 3]; else @@ -230,6 +232,8 @@ * AC97_PCM_FRONT_DAC_RATE, AC97_PCM_LR_ADC_RATE. * AC97_PCM_SURR_DAC_RATE and AC97_PCM_LFE_DAC_RATE are accepted * if the codec supports them. + * AC97_SPDIF is accepted as a pseudo register to modify the SPDIF + * status bits. * * Returns zero if successful, or a negative error code on failure. */ @@ -257,6 +261,9 @@ if (! (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC)) return -EINVAL; break; + case AC97_SPDIF: + /* special case */ + return set_spdif_rate(ac97, rate); default: return -EINVAL; } @@ -350,8 +357,7 @@ if (!ac97_is_audio(ac97)) return 0; slots = (1<<AC97_SLOT_PCM_LEFT)|(1<<AC97_SLOT_PCM_RIGHT); - if (ac97->ext_id & AC97_EI_VRM) - slots |= (1<<AC97_SLOT_MIC); + slots |= (1<<AC97_SLOT_MIC); return slots; } @@ -431,6 +437,7 @@ } rpcm->stream = pcm->stream; rpcm->exclusive = pcm->exclusive; + rpcm->spdif = pcm->spdif; rpcm->private_value = pcm->private_value; rpcm->bus = bus; rpcm->rates = ~0; @@ -467,6 +474,8 @@ rpcm->r[0].slots |= tmp; rpcm->rates &= rates; } + if (rpcm->rates == ~0) + rpcm->rates = 0; /* not used */ } bus->pcms_count = pcms_count; bus->pcms = rpcms; @@ -487,8 +496,9 @@ { ac97_bus_t *bus; int i, cidx, r = 0, ok_flag; - unsigned short reg_ok = 0, reg_ok_new; + unsigned int reg_ok = 0; unsigned char reg; + int err = 0; if (rate > 48000) /* FIXME: add support for double rate */ return -EINVAL; @@ -506,27 +516,23 @@ for (i = 3; i < 12; i++) { if (!(slots & (1 << i))) continue; - for (cidx = 0; cidx < 4; cidx++) + ok_flag = 0; + for (cidx = 0; cidx < 4; cidx++) { if (bus->used_slots[pcm->stream][cidx] & (1 << i)) { spin_unlock_irq(&pcm->bus->bus_lock); - return -EBUSY; + err = -EBUSY; + goto error; } - } - for (i = 3; i < 12; i++) { - if (!(slots & (1 << i))) - continue; - ok_flag = 0; - for (cidx = 0; cidx < 4; cidx++) if (pcm->r[r].rslots[cidx] & (1 << i)) { bus->used_slots[pcm->stream][cidx] |= (1 << i); ok_flag++; } + } if (!ok_flag) { spin_unlock_irq(&pcm->bus->bus_lock); snd_printk(KERN_ERR "cannot find configuration for AC97 slot %i\n", i); - pcm->aslots = slots; - snd_ac97_pcm_close(pcm); - return -EAGAIN; + err = -EAGAIN; + goto error; } } spin_unlock_irq(&pcm->bus->bus_lock); @@ -534,23 +540,29 @@ if (!(slots & (1 << i))) continue; for (cidx = 0; cidx < 4; cidx++) { - reg_ok_new = 0; if (pcm->r[r].rslots[cidx] & (1 << i)) { - reg = get_slot_reg(pcm, cidx, i, 0); + 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))) continue; - snd_ac97_set_rate(pcm->r[r].codec[cidx], reg, rate); - reg_ok_new |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE)); + 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\n, err=%d", cidx, reg, rate, err); + else + reg_ok |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE)); } - reg_ok |= reg_ok_new; } } pcm->aslots = slots; return 0; + + error: + pcm->aslots = slots; + snd_ac97_pcm_close(pcm); + return err; } /** ------------------------------------------------------- This SF.net email is sponsored by: SF.net Giveback Program. Does SourceForge.net help you be more productive? Does it help you create better code? SHARE THE LOVE, and help us help YOU! Click Here: http://sourceforge.net/donate/ _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog