ALSA: atiixp: Move PCM suspend/resume code into trigger callback
authorTakashi Iwai <tiwai@suse.de>
Fri, 11 Jan 2019 16:57:29 +0000 (17:57 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 15 Jan 2019 16:46:50 +0000 (17:46 +0100)
ATIIXP driver supports the full PCM resume and saves/restores the
running PCM pointer.  This used to be done in the suspend and resume
callbacks together with snd_pcm_suspend() call.  But since we moved
the snd_pcm_supsend*() call in PCM device PM ops, this should be moved
to a more appropriate place, i.e. the trigger callback.

Along with the movement of the PCM suspend/resume code, remove the
superfluous snd_pcm_suspend_all() call, too.

Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/atiixp.c

index 1a41f8c802436c92dbe91e4a2993ea33913367b0..7715d26916acda663c7a9e3e5572caa4d63b48be 100644 (file)
@@ -733,6 +733,10 @@ static int snd_atiixp_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
        case SNDRV_PCM_TRIGGER_START:
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
        case SNDRV_PCM_TRIGGER_RESUME:
+               if (dma->running && dma->suspended &&
+                   cmd == SNDRV_PCM_TRIGGER_RESUME)
+                       writel(dma->saved_curptr, chip->remap_addr +
+                              dma->ops->dt_cur);
                dma->ops->enable_transfer(chip, 1);
                dma->running = 1;
                dma->suspended = 0;
@@ -740,9 +744,12 @@ static int snd_atiixp_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
        case SNDRV_PCM_TRIGGER_STOP:
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
        case SNDRV_PCM_TRIGGER_SUSPEND:
+               dma->suspended = cmd == SNDRV_PCM_TRIGGER_SUSPEND;
+               if (dma->running && dma->suspended)
+                       dma->saved_curptr = readl(chip->remap_addr +
+                                                 dma->ops->dt_cur);
                dma->ops->enable_transfer(chip, 0);
                dma->running = 0;
-               dma->suspended = cmd == SNDRV_PCM_TRIGGER_SUSPEND;
                break;
        default:
                err = -EINVAL;
@@ -1479,14 +1486,6 @@ static int snd_atiixp_suspend(struct device *dev)
        int i;
 
        snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
-       for (i = 0; i < NUM_ATI_PCMDEVS; i++)
-               if (chip->pcmdevs[i]) {
-                       struct atiixp_dma *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++)
                snd_ac97_suspend(chip->ac97[i]);
        snd_atiixp_aclink_down(chip);
@@ -1514,8 +1513,6 @@ static int snd_atiixp_resume(struct device *dev)
                                dma->substream->ops->prepare(dma->substream);
                                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);
                        }
                }