Merge to kernel-2.6.20-1.2949.fc6.vs2.2.0.1
[linux-2.6.git] / sound / pci / ac97 / ac97_pcm.c
index f684aa2..3758d07 100644 (file)
@@ -269,6 +269,7 @@ int snd_ac97_set_rate(struct snd_ac97 *ac97, int reg, unsigned int rate)
                        return -EINVAL;
        }
 
+       snd_ac97_update_power(ac97, reg, 1);
        switch (reg) {
        case AC97_PCM_MIC_ADC_RATE:
                if ((ac97->regs[AC97_EXTENDED_STATUS] & AC97_EA_VRM) == 0)      /* MIC VRA */
@@ -606,6 +607,7 @@ int snd_ac97_pcm_open(struct ac97_pcm *pcm, unsigned int rate,
                        goto error;
                }
        }
+       pcm->cur_dbl = r;
        spin_unlock_irq(&pcm->bus->bus_lock);
        for (i = 3; i < 12; i++) {
                if (!(slots & (1 << i)))
@@ -651,6 +653,21 @@ int snd_ac97_pcm_close(struct ac97_pcm *pcm)
        unsigned short slots = pcm->aslots;
        int i, cidx;
 
+#ifdef CONFIG_SND_AC97_POWER_SAVE
+       int r = pcm->cur_dbl;
+       for (i = 3; i < 12; i++) {
+               if (!(slots & (1 << i)))
+                       continue;
+               for (cidx = 0; cidx < 4; cidx++) {
+                       if (pcm->r[r].rslots[cidx] & (1 << i)) {
+                               int reg = get_slot_reg(pcm, cidx, i, r);
+                               snd_ac97_update_power(pcm->r[r].codec[cidx],
+                                                     reg, 0);
+                       }
+               }
+       }
+#endif
+
        bus = pcm->bus;
        spin_lock_irq(&pcm->bus->bus_lock);
        for (i = 3; i < 12; i++) {
@@ -660,6 +677,7 @@ int snd_ac97_pcm_close(struct ac97_pcm *pcm)
                        bus->used_slots[pcm->stream][cidx] &= ~(1 << i);
        }
        pcm->aslots = 0;
+       pcm->cur_dbl = 0;
        spin_unlock_irq(&pcm->bus->bus_lock);
        return 0;
 }