X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sound%2Fpci%2Fac97%2Fac97_pcm.c;h=466977e3fa0d0f94fe31a57239e73b5bcca25977;hb=f1227cd3e0e73c48b93368800aa89f4341103a00;hp=dd289b9512e13b55c2f088464572380a4aad00dc;hpb=340e2b1a4c74f653454348914c408420d5d3c28a;p=linux-2.6.git diff --git a/sound/pci/ac97/ac97_pcm.c b/sound/pci/ac97/ac97_pcm.c index dd289b951..466977e3f 100644 --- a/sound/pci/ac97/ac97_pcm.c +++ b/sound/pci/ac97/ac97_pcm.c @@ -206,12 +206,14 @@ static int set_spdif_rate(ac97_t *ac97, unsigned short rate) mask = AC97_SC_SPSR_MASK; } - down(&ac97->reg_mutex); + spin_lock(&ac97->reg_lock); old = snd_ac97_read(ac97, reg) & mask; + spin_unlock(&ac97->reg_lock); if (old != bits) { - snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); - snd_ac97_update_bits_nolock(ac97, reg, mask, bits); + snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); + snd_ac97_update_bits(ac97, reg, mask, bits); /* update the internal spdif bits */ + spin_lock(&ac97->reg_lock); sbits = ac97->spdif_status; if (sbits & IEC958_AES0_PROFESSIONAL) { sbits &= ~IEC958_AES0_PRO_FS; @@ -229,9 +231,9 @@ static int set_spdif_rate(ac97_t *ac97, unsigned short rate) } } ac97->spdif_status = sbits; + spin_unlock(&ac97->reg_lock); } - snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); - up(&ac97->reg_mutex); + snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); return 0; } @@ -553,7 +555,7 @@ int snd_ac97_pcm_open(struct ac97_pcm *pcm, unsigned int rate, { ac97_bus_t *bus; int i, cidx, r, ok_flag; - unsigned int reg_ok[4] = {0,0,0,0}; + unsigned int reg_ok = 0; unsigned char reg; int err = 0; @@ -602,14 +604,14 @@ int snd_ac97_pcm_open(struct ac97_pcm *pcm, unsigned int rate, snd_printk(KERN_ERR "invalid AC97 slot %i?\n", i); continue; } - if (reg_ok[cidx] & (1 << (reg - AC97_PCM_FRONT_DAC_RATE))) + if (reg_ok & (1 << (reg - AC97_PCM_FRONT_DAC_RATE))) continue; //printk(KERN_DEBUG "setting ac97 reg 0x%x to rate %d\n", reg, 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, err=%d\n", cidx, reg, rate, err); else - reg_ok[cidx] |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE)); + reg_ok |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE)); } } }