This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / sound / pci / ac97 / ac97_pcm.c
index dd289b9..466977e 100644 (file)
@@ -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));
                        }
                }
        }