upgrade to fedora-2.6.12-1.1398.FC4 + vserver 2.0.rc7
[linux-2.6.git] / sound / pci / ac97 / ac97_pcm.c
index 466977e..dd289b9 100644 (file)
@@ -206,14 +206,12 @@ static int set_spdif_rate(ac97_t *ac97, unsigned short rate)
                mask = AC97_SC_SPSR_MASK;
        }
 
-       spin_lock(&ac97->reg_lock);
+       down(&ac97->reg_mutex);
        old = snd_ac97_read(ac97, 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, mask, bits);
+               snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0);
+               snd_ac97_update_bits_nolock(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;
@@ -231,9 +229,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(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF);
+       snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF);
+       up(&ac97->reg_mutex);
        return 0;
 }
 
@@ -555,7 +553,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 = 0;
+       unsigned int reg_ok[4] = {0,0,0,0};
        unsigned char reg;
        int err = 0;
 
@@ -604,14 +602,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 & (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);
                                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));
+                                       reg_ok[cidx] |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE));
                        }
                }
        }