vserver 2.0 rc7
[linux-2.6.git] / sound / pci / atiixp.c
index 758bc99..6b04c0a 100644 (file)
@@ -250,6 +250,7 @@ struct snd_atiixp_dma {
        int running;
        int pcm_open_flag;
        int ac97_pcm_type;      /* index # of ac97_pcm to access, -1 = not used */
+       unsigned int saved_curptr;
 };
 
 /*
@@ -1375,6 +1376,8 @@ static int __devinit snd_atiixp_mixer_new(atiixp_t *chip, int clock, const char
                ac97.pci = chip->pci;
                ac97.num = i;
                ac97.scaps = AC97_SCAP_SKIP_MODEM;
+               if (! chip->spdif_over_aclink)
+                       ac97.scaps |= AC97_SCAP_NO_SPDIF;
                if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i])) < 0) {
                        chip->ac97[i] = NULL; /* to be sure */
                        snd_printdd("atiixp: codec %d not available for audio\n", i);
@@ -1398,14 +1401,18 @@ static int __devinit snd_atiixp_mixer_new(atiixp_t *chip, int clock, const char
 /*
  * power management
  */
-static int snd_atiixp_suspend(snd_card_t *card, unsigned int state)
+static int snd_atiixp_suspend(snd_card_t *card, pm_message_t state)
 {
        atiixp_t *chip = card->pm_private_data;
        int i;
 
        for (i = 0; i < NUM_ATI_PCMDEVS; i++)
-               if (chip->pcmdevs[i])
+               if (chip->pcmdevs[i]) {
+                       atiixp_dma_t *dma = &chip->dmas[i];
+                       if (dma->substream && dma->running)
+                               dma->saved_curptr = readl(chip->remap_addr + dma->ops->dt_cur);
                        snd_pcm_suspend_all(chip->pcmdevs[i]);
+               }
        for (i = 0; i < NUM_ATI_CODECS; i++)
                if (chip->ac97[i])
                        snd_ac97_suspend(chip->ac97[i]);
@@ -1417,7 +1424,7 @@ static int snd_atiixp_suspend(snd_card_t *card, unsigned int state)
        return 0;
 }
 
-static int snd_atiixp_resume(snd_card_t *card, unsigned int state)
+static int snd_atiixp_resume(snd_card_t *card)
 {
        atiixp_t *chip = card->pm_private_data;
        int i;
@@ -1433,6 +1440,17 @@ static int snd_atiixp_resume(snd_card_t *card, unsigned int state)
                if (chip->ac97[i])
                        snd_ac97_resume(chip->ac97[i]);
 
+       for (i = 0; i < NUM_ATI_PCMDEVS; i++)
+               if (chip->pcmdevs[i]) {
+                       atiixp_dma_t *dma = &chip->dmas[i];
+                       if (dma->substream && dma->running) {
+                               dma->ops->enable_dma(chip, 1);
+                               writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN,
+                                      chip->remap_addr + dma->ops->llp_offset);
+                               writel(dma->saved_curptr, chip->remap_addr + dma->ops->dt_cur);
+                       }
+               }
+
        return 0;
 }
 #endif /* CONFIG_PM */