Merge branch 'topic/pcm-device-suspend' into for-next

Pull the PCM suspend improvement / cleanup.
This moves the most of snd_pcm_suspend*() calls into PCM's own device
PM ops.  There should be no change from the functionality POV.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2019-01-18 17:37:14 +01:00
commit 436ec40e0c
61 changed files with 50 additions and 174 deletions

View File

@ -3924,15 +3924,12 @@ The scheme of the real suspend job is as follows.
2. Call :c:func:`snd_power_change_state()` with 2. Call :c:func:`snd_power_change_state()` with
``SNDRV_CTL_POWER_D3hot`` to change the power status. ``SNDRV_CTL_POWER_D3hot`` to change the power status.
3. Call :c:func:`snd_pcm_suspend_all()` to suspend the running 3. If AC97 codecs are used, call :c:func:`snd_ac97_suspend()` for
PCM streams.
4. If AC97 codecs are used, call :c:func:`snd_ac97_suspend()` for
each codec. each codec.
5. Save the register values if necessary. 4. Save the register values if necessary.
6. Stop the hardware if necessary. 5. Stop the hardware if necessary.
A typical code would be like: A typical code would be like:
@ -3946,12 +3943,10 @@ A typical code would be like:
/* (2) */ /* (2) */
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
/* (3) */ /* (3) */
snd_pcm_suspend_all(chip->pcm);
/* (4) */
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
/* (5) */ /* (4) */
snd_mychip_save_registers(chip); snd_mychip_save_registers(chip);
/* (6) */ /* (5) */
snd_mychip_stop_hardware(chip); snd_mychip_stop_hardware(chip);
return 0; return 0;
} }
@ -3994,13 +3989,9 @@ A typical code would be like:
return 0; return 0;
} }
As shown in the above, it's better to save registers after suspending Note that, at the time this callback gets called, the PCM stream has
the PCM operations via :c:func:`snd_pcm_suspend_all()` or been already suspended via its own PM ops calling
:c:func:`snd_pcm_suspend()`. It means that the PCM streams are :c:func:`snd_pcm_suspend_all()` internally.
already stopped when the register snapshot is taken. But, remember that
you don't have to restart the PCM stream in the resume callback. It'll
be restarted via trigger call with ``SNDRV_PCM_TRIGGER_RESUME`` when
necessary.
OK, we have all callbacks now. Let's set them up. In the initialization OK, we have all callbacks now. Let's set them up. In the initialization
of the card, make sure that you can get the chip data from the card of the card, make sure that you can get the chip data from the card

View File

@ -614,7 +614,6 @@ static int snd_dw_hdmi_suspend(struct device *dev)
struct snd_dw_hdmi *dw = dev_get_drvdata(dev); struct snd_dw_hdmi *dw = dev_get_drvdata(dev);
snd_power_change_state(dw->card, SNDRV_CTL_POWER_D3cold); snd_power_change_state(dw->card, SNDRV_CTL_POWER_D3cold);
snd_pcm_suspend_all(dw->pcm);
return 0; return 0;
} }

View File

@ -538,6 +538,7 @@ struct snd_pcm {
void (*private_free) (struct snd_pcm *pcm); void (*private_free) (struct snd_pcm *pcm);
bool internal; /* pcm is for internal use only */ bool internal; /* pcm is for internal use only */
bool nonatomic; /* whole PCM operations are in non-atomic context */ bool nonatomic; /* whole PCM operations are in non-atomic context */
bool no_device_suspend; /* don't invoke device PM suspend */
#if IS_ENABLED(CONFIG_SND_PCM_OSS) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
struct snd_pcm_oss oss; struct snd_pcm_oss oss;
#endif #endif
@ -581,13 +582,8 @@ int snd_pcm_stop(struct snd_pcm_substream *substream, snd_pcm_state_t status);
int snd_pcm_drain_done(struct snd_pcm_substream *substream); int snd_pcm_drain_done(struct snd_pcm_substream *substream);
int snd_pcm_stop_xrun(struct snd_pcm_substream *substream); int snd_pcm_stop_xrun(struct snd_pcm_substream *substream);
#ifdef CONFIG_PM #ifdef CONFIG_PM
int snd_pcm_suspend(struct snd_pcm_substream *substream);
int snd_pcm_suspend_all(struct snd_pcm *pcm); int snd_pcm_suspend_all(struct snd_pcm *pcm);
#else #else
static inline int snd_pcm_suspend(struct snd_pcm_substream *substream)
{
return 0;
}
static inline int snd_pcm_suspend_all(struct snd_pcm *pcm) static inline int snd_pcm_suspend_all(struct snd_pcm *pcm)
{ {
return 0; return 0;

View File

@ -380,10 +380,6 @@ static int i2sbus_suspend(struct macio_dev* dev, pm_message_t state)
int err, ret = 0; int err, ret = 0;
list_for_each_entry(i2sdev, &control->list, item) { list_for_each_entry(i2sdev, &control->list, item) {
/* Notify Alsa */
/* Suspend PCM streams */
snd_pcm_suspend_all(i2sdev->sound.pcm);
/* Notify codecs */ /* Notify codecs */
list_for_each_entry(cii, &i2sdev->sound.codec_list, list) { list_for_each_entry(cii, &i2sdev->sound.codec_list, list) {
err = 0; err = 0;

View File

@ -757,7 +757,6 @@ static int aaci_do_suspend(struct snd_card *card)
{ {
struct aaci *aaci = card->private_data; struct aaci *aaci = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3cold); snd_power_change_state(card, SNDRV_CTL_POWER_D3cold);
snd_pcm_suspend_all(aaci->pcm);
return 0; return 0;
} }

View File

@ -124,7 +124,6 @@ static int pxa2xx_ac97_do_suspend(struct snd_card *card)
pxa2xx_audio_ops_t *platform_ops = card->dev->platform_data; pxa2xx_audio_ops_t *platform_ops = card->dev->platform_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3cold); snd_power_change_state(card, SNDRV_CTL_POWER_D3cold);
snd_pcm_suspend_all(pxa2xx_ac97_pcm);
snd_ac97_suspend(pxa2xx_ac97_ac97); snd_ac97_suspend(pxa2xx_ac97_ac97);
if (platform_ops && platform_ops->suspend) if (platform_ops && platform_ops->suspend)
platform_ops->suspend(platform_ops->priv); platform_ops->suspend(platform_ops->priv);

View File

@ -683,6 +683,31 @@ static inline int snd_pcm_substream_proc_done(struct snd_pcm_substream *substrea
static const struct attribute_group *pcm_dev_attr_groups[]; static const struct attribute_group *pcm_dev_attr_groups[];
/*
* PM callbacks: we need to deal only with suspend here, as the resume is
* triggered either from user-space or the driver's resume callback
*/
#ifdef CONFIG_PM_SLEEP
static int do_pcm_suspend(struct device *dev)
{
struct snd_pcm_str *pstr = container_of(dev, struct snd_pcm_str, dev);
if (!pstr->pcm->no_device_suspend)
snd_pcm_suspend_all(pstr->pcm);
return 0;
}
#endif
static const struct dev_pm_ops pcm_dev_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(do_pcm_suspend, NULL)
};
/* device type for PCM -- basically only for passing PM callbacks */
static const struct device_type pcm_dev_type = {
.name = "pcm",
.pm = &pcm_dev_pm_ops,
};
/** /**
* snd_pcm_new_stream - create a new PCM stream * snd_pcm_new_stream - create a new PCM stream
* @pcm: the pcm instance * @pcm: the pcm instance
@ -713,6 +738,7 @@ int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count)
snd_device_initialize(&pstr->dev, pcm->card); snd_device_initialize(&pstr->dev, pcm->card);
pstr->dev.groups = pcm_dev_attr_groups; pstr->dev.groups = pcm_dev_attr_groups;
pstr->dev.type = &pcm_dev_type;
dev_set_name(&pstr->dev, "pcmC%iD%i%c", pcm->card->number, pcm->device, dev_set_name(&pstr->dev, "pcmC%iD%i%c", pcm->card->number, pcm->device,
stream == SNDRV_PCM_STREAM_PLAYBACK ? 'p' : 'c'); stream == SNDRV_PCM_STREAM_PLAYBACK ? 'p' : 'c');

View File

@ -1460,29 +1460,24 @@ static const struct action_ops snd_pcm_action_suspend = {
.post_action = snd_pcm_post_suspend .post_action = snd_pcm_post_suspend
}; };
/** /*
* snd_pcm_suspend - trigger SUSPEND to all linked streams * snd_pcm_suspend - trigger SUSPEND to all linked streams
* @substream: the PCM substream * @substream: the PCM substream
* *
* After this call, all streams are changed to SUSPENDED state. * After this call, all streams are changed to SUSPENDED state.
* *
* Return: Zero if successful (or @substream is %NULL), or a negative error * Return: Zero if successful, or a negative error code.
* code.
*/ */
int snd_pcm_suspend(struct snd_pcm_substream *substream) static int snd_pcm_suspend(struct snd_pcm_substream *substream)
{ {
int err; int err;
unsigned long flags; unsigned long flags;
if (! substream)
return 0;
snd_pcm_stream_lock_irqsave(substream, flags); snd_pcm_stream_lock_irqsave(substream, flags);
err = snd_pcm_action(&snd_pcm_action_suspend, substream, 0); err = snd_pcm_action(&snd_pcm_action_suspend, substream, 0);
snd_pcm_stream_unlock_irqrestore(substream, flags); snd_pcm_stream_unlock_irqrestore(substream, flags);
return err; return err;
} }
EXPORT_SYMBOL(snd_pcm_suspend);
/** /**
* snd_pcm_suspend_all - trigger SUSPEND to all substreams in the given pcm * snd_pcm_suspend_all - trigger SUSPEND to all substreams in the given pcm

View File

@ -1200,12 +1200,8 @@ static int loopback_remove(struct platform_device *devptr)
static int loopback_suspend(struct device *pdev) static int loopback_suspend(struct device *pdev)
{ {
struct snd_card *card = dev_get_drvdata(pdev); struct snd_card *card = dev_get_drvdata(pdev);
struct loopback *loopback = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(loopback->pcm[0]);
snd_pcm_suspend_all(loopback->pcm[1]);
return 0; return 0;
} }

View File

@ -1138,10 +1138,8 @@ static int snd_dummy_remove(struct platform_device *devptr)
static int snd_dummy_suspend(struct device *pdev) static int snd_dummy_suspend(struct device *pdev)
{ {
struct snd_card *card = dev_get_drvdata(pdev); struct snd_card *card = dev_get_drvdata(pdev);
struct snd_dummy *dummy = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(dummy->pcm);
return 0; return 0;
} }

View File

@ -197,7 +197,6 @@ static int pcsp_suspend(struct device *dev)
{ {
struct snd_pcsp *chip = dev_get_drvdata(dev); struct snd_pcsp *chip = dev_get_drvdata(dev);
pcsp_stop_beep(chip); pcsp_stop_beep(chip);
snd_pcm_suspend_all(chip->pcm);
return 0; return 0;
} }

View File

@ -732,12 +732,8 @@ EXPORT_SYMBOL(snd_vx_dsp_load);
*/ */
int snd_vx_suspend(struct vx_core *chip) int snd_vx_suspend(struct vx_core *chip)
{ {
unsigned int i;
snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
chip->chip_status |= VX_STAT_IN_SUSPEND; chip->chip_status |= VX_STAT_IN_SUSPEND;
for (i = 0; i < chip->hw->num_codecs; i++)
snd_pcm_suspend_all(chip->pcm[i]);
return 0; return 0;
} }

View File

@ -518,7 +518,6 @@ void snd_ad1816a_suspend(struct snd_ad1816a *chip)
int reg; int reg;
unsigned long flags; unsigned long flags;
snd_pcm_suspend_all(chip->pcm);
spin_lock_irqsave(&chip->lock, flags); spin_lock_irqsave(&chip->lock, flags);
for (reg = 0; reg < 48; reg++) for (reg = 0; reg < 48; reg++)
chip->image[reg] = snd_ad1816a_read(chip, reg); chip->image[reg] = snd_ad1816a_read(chip, reg);

View File

@ -322,7 +322,6 @@ static int snd_als100_pnp_suspend(struct pnp_card_link *pcard, pm_message_t stat
struct snd_sb *chip = acard->chip; struct snd_sb *chip = acard->chip;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_sbmixer_suspend(chip); snd_sbmixer_suspend(chip);
return 0; return 0;
} }

View File

@ -434,7 +434,6 @@ static int snd_cmi8328_suspend(struct device *pdev, unsigned int n,
cmi = card->private_data; cmi = card->private_data;
snd_cmi8328_cfg_save(cmi->port, cmi->cfg); snd_cmi8328_cfg_save(cmi->port, cmi->cfg);
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(cmi->wss->pcm);
cmi->wss->suspend(cmi->wss); cmi->wss->suspend(cmi->wss);
return 0; return 0;

View File

@ -484,7 +484,6 @@ static int snd_cmi8330_suspend(struct snd_card *card)
struct snd_cmi8330 *acard = card->private_data; struct snd_cmi8330 *acard = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(acard->pcm);
acard->wss->suspend(acard->wss); acard->wss->suspend(acard->wss);
snd_sbmixer_suspend(acard->sb); snd_sbmixer_suspend(acard->sb);
return 0; return 0;

View File

@ -301,10 +301,8 @@ static int snd_es968_pnp_suspend(struct pnp_card_link *pcard,
pm_message_t state) pm_message_t state)
{ {
struct snd_card *card = pnp_get_card_drvdata(pcard); struct snd_card *card = pnp_get_card_drvdata(pcard);
struct snd_es1688 *chip = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
return 0; return 0;
} }

View File

@ -1731,8 +1731,6 @@ static int snd_es18xx_suspend(struct snd_card *card, pm_message_t state)
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
/* power down */ /* power down */
chip->pm_reg = (unsigned char)snd_es18xx_read(chip, ES18XX_PM); chip->pm_reg = (unsigned char)snd_es18xx_read(chip, ES18XX_PM);
chip->pm_reg |= (ES18XX_PM_FM | ES18XX_PM_SUS); chip->pm_reg |= (ES18XX_PM_FM | ES18XX_PM_SUS);

View File

@ -356,7 +356,6 @@ static int snd_jazz16_suspend(struct device *pdev, unsigned int n,
struct snd_sb *chip = acard->chip; struct snd_sb *chip = acard->chip;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_sbmixer_suspend(chip); snd_sbmixer_suspend(chip);
return 0; return 0;
} }

View File

@ -471,7 +471,6 @@ static int snd_sb16_suspend(struct snd_card *card, pm_message_t state)
struct snd_sb *chip = acard->chip; struct snd_sb *chip = acard->chip;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_sbmixer_suspend(chip); snd_sbmixer_suspend(chip);
return 0; return 0;
} }

View File

@ -218,7 +218,6 @@ static int snd_sb8_suspend(struct device *dev, unsigned int n,
struct snd_sb *chip = acard->chip; struct snd_sb *chip = acard->chip;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_sbmixer_suspend(chip); snd_sbmixer_suspend(chip);
return 0; return 0;
} }

View File

@ -1625,7 +1625,6 @@ static void snd_wss_suspend(struct snd_wss *chip)
int reg; int reg;
unsigned long flags; unsigned long flags;
snd_pcm_suspend_all(chip->pcm);
spin_lock_irqsave(&chip->reg_lock, flags); spin_lock_irqsave(&chip->reg_lock, flags);
for (reg = 0; reg < 32; reg++) for (reg = 0; reg < 32; reg++)
chip->image[reg] = snd_wss_in(chip, reg); chip->image[reg] = snd_wss_in(chip, reg);

View File

@ -1882,10 +1882,8 @@ static int ali_suspend(struct device *dev)
return 0; return 0;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
for (i = 0; i < chip->num_of_codecs; i++) { for (i = 0; i < chip->num_of_codecs; i++)
snd_pcm_suspend_all(chip->pcm[i]);
snd_ac97_suspend(chip->ac97[i]); snd_ac97_suspend(chip->ac97[i]);
}
spin_lock_irq(&chip->reg_lock); spin_lock_irq(&chip->reg_lock);

View File

@ -731,7 +731,6 @@ static int snd_als300_suspend(struct device *dev)
struct snd_als300 *chip = card->private_data; struct snd_als300 *chip = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
return 0; return 0;
} }

View File

@ -994,7 +994,6 @@ static int snd_als4000_suspend(struct device *dev)
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_sbmixer_suspend(chip); snd_sbmixer_suspend(chip);
return 0; return 0;
} }

View 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_START:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
case SNDRV_PCM_TRIGGER_RESUME: 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->ops->enable_transfer(chip, 1);
dma->running = 1; dma->running = 1;
dma->suspended = 0; 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_STOP:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
case SNDRV_PCM_TRIGGER_SUSPEND: 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->ops->enable_transfer(chip, 0);
dma->running = 0; dma->running = 0;
dma->suspended = cmd == SNDRV_PCM_TRIGGER_SUSPEND;
break; break;
default: default:
err = -EINVAL; err = -EINVAL;
@ -1479,14 +1486,6 @@ static int snd_atiixp_suspend(struct device *dev)
int i; int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); 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++) for (i = 0; i < NUM_ATI_CODECS; i++)
snd_ac97_suspend(chip->ac97[i]); snd_ac97_suspend(chip->ac97[i]);
snd_atiixp_aclink_down(chip); snd_atiixp_aclink_down(chip);
@ -1514,8 +1513,6 @@ static int snd_atiixp_resume(struct device *dev)
dma->substream->ops->prepare(dma->substream); dma->substream->ops->prepare(dma->substream);
writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN,
chip->remap_addr + dma->ops->llp_offset); chip->remap_addr + dma->ops->llp_offset);
writel(dma->saved_curptr, chip->remap_addr +
dma->ops->dt_cur);
} }
} }

View File

@ -1125,8 +1125,6 @@ static int snd_atiixp_suspend(struct device *dev)
int i; int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
for (i = 0; i < NUM_ATI_PCMDEVS; i++)
snd_pcm_suspend_all(chip->pcmdevs[i]);
for (i = 0; i < NUM_ATI_CODECS; i++) for (i = 0; i < NUM_ATI_CODECS; i++)
snd_ac97_suspend(chip->ac97[i]); snd_ac97_suspend(chip->ac97[i]);
snd_atiixp_aclink_down(chip); snd_atiixp_aclink_down(chip);

View File

@ -2699,10 +2699,6 @@ snd_azf3328_suspend(struct device *dev)
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
/* same pcm object for playback/capture */
snd_pcm_suspend_all(chip->pcm[AZF_CODEC_PLAYBACK]);
snd_pcm_suspend_all(chip->pcm[AZF_CODEC_I2S_OUT]);
snd_azf3328_suspend_ac97(chip); snd_azf3328_suspend_ac97(chip);
snd_azf3328_suspend_regs(chip, chip->ctrl_io, snd_azf3328_suspend_regs(chip, chip->ctrl_io,

View File

@ -1910,11 +1910,8 @@ static int snd_ca0106_suspend(struct device *dev)
{ {
struct snd_card *card = dev_get_drvdata(dev); struct snd_card *card = dev_get_drvdata(dev);
struct snd_ca0106 *chip = card->private_data; struct snd_ca0106 *chip = card->private_data;
int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
for (i = 0; i < 4; i++)
snd_pcm_suspend_all(chip->pcm[i]);
if (chip->details->ac97) if (chip->details->ac97)
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
snd_ca0106_mixer_suspend(chip); snd_ca0106_mixer_suspend(chip);

View File

@ -3351,10 +3351,6 @@ static int snd_cmipci_suspend(struct device *dev)
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(cm->pcm);
snd_pcm_suspend_all(cm->pcm2);
snd_pcm_suspend_all(cm->pcm_spdif);
/* save registers */ /* save registers */
for (i = 0; i < ARRAY_SIZE(saved_regs); i++) for (i = 0; i < ARRAY_SIZE(saved_regs); i++)
cm->saved_regs[i] = snd_cmipci_read(cm, saved_regs[i]); cm->saved_regs[i] = snd_cmipci_read(cm, saved_regs[i]);

View File

@ -2002,8 +2002,6 @@ static int cs4281_suspend(struct device *dev)
unsigned int i; unsigned int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
snd_ac97_suspend(chip->ac97_secondary); snd_ac97_suspend(chip->ac97_secondary);

View File

@ -3781,12 +3781,6 @@ static int snd_cs46xx_suspend(struct device *dev)
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
chip->in_suspend = 1; chip->in_suspend = 1;
snd_pcm_suspend_all(chip->pcm);
#ifdef CONFIG_SND_CS46XX_NEW_DSP
snd_pcm_suspend_all(chip->pcm_rear);
snd_pcm_suspend_all(chip->pcm_center_lfe);
snd_pcm_suspend_all(chip->pcm_iec958);
#endif
// chip->ac97_powerdown = snd_cs46xx_codec_read(chip, AC97_POWER_CONTROL); // chip->ac97_powerdown = snd_cs46xx_codec_read(chip, AC97_POWER_CONTROL);
// chip->ac97_general_purpose = snd_cs46xx_codec_read(chip, BA0_AC97_GENERAL_PURPOSE); // chip->ac97_general_purpose = snd_cs46xx_codec_read(chip, BA0_AC97_GENERAL_PURPOSE);

View File

@ -62,7 +62,6 @@ static int __maybe_unused snd_cs5535audio_suspend(struct device *dev)
int i; int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(cs5535au->pcm);
snd_ac97_suspend(cs5535au->ac97); snd_ac97_suspend(cs5535au->ac97);
for (i = 0; i < NUM_CS5535AUDIO_DMAS; i++) { for (i = 0; i < NUM_CS5535AUDIO_DMAS; i++) {
struct cs5535audio_dma *dma = &cs5535au->dmas[i]; struct cs5535audio_dma *dma = &cs5535au->dmas[i];

View File

@ -1548,18 +1548,10 @@ static void atc_connect_resources(struct ct_atc *atc)
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int atc_suspend(struct ct_atc *atc) static int atc_suspend(struct ct_atc *atc)
{ {
int i;
struct hw *hw = atc->hw; struct hw *hw = atc->hw;
snd_power_change_state(atc->card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(atc->card, SNDRV_CTL_POWER_D3hot);
for (i = FRONT; i < NUM_PCMS; i++) {
if (!atc->pcms[i])
continue;
snd_pcm_suspend_all(atc->pcms[i]);
}
atc_release_resources(atc); atc_release_resources(atc);
hw->suspend(hw); hw->suspend(hw);

View File

@ -2165,9 +2165,6 @@ static int snd_echo_suspend(struct device *dev)
{ {
struct echoaudio *chip = dev_get_drvdata(dev); struct echoaudio *chip = dev_get_drvdata(dev);
snd_pcm_suspend_all(chip->analog_pcm);
snd_pcm_suspend_all(chip->digital_pcm);
#ifdef ECHOCARD_HAS_MIDI #ifdef ECHOCARD_HAS_MIDI
/* This call can sleep */ /* This call can sleep */
if (chip->midi_out) if (chip->midi_out)

View File

@ -224,12 +224,6 @@ static int snd_emu10k1_suspend(struct device *dev)
cancel_delayed_work_sync(&emu->emu1010.firmware_work); cancel_delayed_work_sync(&emu->emu1010.firmware_work);
snd_pcm_suspend_all(emu->pcm);
snd_pcm_suspend_all(emu->pcm_mic);
snd_pcm_suspend_all(emu->pcm_efx);
snd_pcm_suspend_all(emu->pcm_multi);
snd_pcm_suspend_all(emu->pcm_p16v);
snd_ac97_suspend(emu->ac97); snd_ac97_suspend(emu->ac97);
snd_emu10k1_efx_suspend(emu); snd_emu10k1_efx_suspend(emu);

View File

@ -2037,9 +2037,6 @@ static int snd_ensoniq_suspend(struct device *dev)
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(ensoniq->pcm1);
snd_pcm_suspend_all(ensoniq->pcm2);
#ifdef CHIP1371 #ifdef CHIP1371
snd_ac97_suspend(ensoniq->u.es1371.ac97); snd_ac97_suspend(ensoniq->u.es1371.ac97);
#else #else

View File

@ -1475,7 +1475,6 @@ static int es1938_suspend(struct device *dev)
unsigned char *s, *d; unsigned char *s, *d;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
/* save mixer-related registers */ /* save mixer-related registers */
for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) for (s = saved_regs, d = chip->saved_regs; *s; s++, d++)

View File

@ -2392,7 +2392,6 @@ static int es1968_suspend(struct device *dev)
chip->in_suspend = 1; chip->in_suspend = 1;
cancel_work_sync(&chip->hwvol_work); cancel_work_sync(&chip->hwvol_work);
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
snd_es1968_bob_stop(chip); snd_es1968_bob_stop(chip);
return 0; return 0;

View File

@ -1408,7 +1408,6 @@ static int snd_fm801_suspend(struct device *dev)
if (chip->tea575x_tuner & TUNER_ONLY) { if (chip->tea575x_tuner & TUNER_ONLY) {
/* FIXME: tea575x suspend */ /* FIXME: tea575x suspend */
} else { } else {
snd_pcm_suspend_all(chip->pcm);
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
snd_ac97_suspend(chip->ac97_sec); snd_ac97_suspend(chip->ac97_sec);
} }

View File

@ -2927,8 +2927,6 @@ static int hda_codec_runtime_suspend(struct device *dev)
unsigned int state; unsigned int state;
cancel_delayed_work_sync(&codec->jackpoll_work); cancel_delayed_work_sync(&codec->jackpoll_work);
list_for_each_entry(pcm, &codec->pcm_list_head, list)
snd_pcm_suspend_all(pcm->pcm);
state = hda_call_codec_suspend(codec); state = hda_call_codec_suspend(codec);
if (codec->link_down_at_suspend || if (codec->link_down_at_suspend ||
(codec_has_clkstop(codec) && codec_has_epss(codec) && (codec_has_clkstop(codec) && codec_has_epss(codec) &&

View File

@ -2792,9 +2792,6 @@ static int snd_ice1712_suspend(struct device *dev)
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(ice->pcm);
snd_pcm_suspend_all(ice->pcm_pro);
snd_pcm_suspend_all(ice->pcm_ds);
snd_ac97_suspend(ice->ac97); snd_ac97_suspend(ice->ac97);
spin_lock_irq(&ice->reg_lock); spin_lock_irq(&ice->reg_lock);

View File

@ -2804,9 +2804,6 @@ static int snd_vt1724_suspend(struct device *dev)
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(ice->pcm);
snd_pcm_suspend_all(ice->pcm_pro);
snd_pcm_suspend_all(ice->pcm_ds);
snd_ac97_suspend(ice->ac97); snd_ac97_suspend(ice->ac97);
spin_lock_irq(&ice->reg_lock); spin_lock_irq(&ice->reg_lock);

View File

@ -2614,8 +2614,6 @@ static int intel8x0_suspend(struct device *dev)
int i; int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
for (i = 0; i < chip->pcm_devs; i++)
snd_pcm_suspend_all(chip->pcm[i]);
for (i = 0; i < chip->ncodecs; i++) for (i = 0; i < chip->ncodecs; i++)
snd_ac97_suspend(chip->ac97[i]); snd_ac97_suspend(chip->ac97[i]);
if (chip->device_type == DEVICE_INTEL_ICH4) if (chip->device_type == DEVICE_INTEL_ICH4)

View File

@ -1025,11 +1025,8 @@ static int intel8x0m_suspend(struct device *dev)
{ {
struct snd_card *card = dev_get_drvdata(dev); struct snd_card *card = dev_get_drvdata(dev);
struct intel8x0m *chip = card->private_data; struct intel8x0m *chip = card->private_data;
int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
for (i = 0; i < chip->pcm_devs; i++)
snd_pcm_suspend_all(chip->pcm[i]);
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
if (chip->irq >= 0) { if (chip->irq >= 0) {
free_irq(chip->irq, chip); free_irq(chip->irq, chip);

View File

@ -2422,7 +2422,6 @@ static int m3_suspend(struct device *dev)
chip->in_suspend = 1; chip->in_suspend = 1;
cancel_work_sync(&chip->hwvol_work); cancel_work_sync(&chip->hwvol_work);
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
msleep(10); /* give the assp a chance to idle.. */ msleep(10); /* give the assp a chance to idle.. */

View File

@ -1413,7 +1413,6 @@ static int nm256_suspend(struct device *dev)
struct nm256 *chip = card->private_data; struct nm256 *chip = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
chip->coeffs_current = 0; chip->coeffs_current = 0;
return 0; return 0;

View File

@ -744,13 +744,10 @@ static int oxygen_pci_suspend(struct device *dev)
{ {
struct snd_card *card = dev_get_drvdata(dev); struct snd_card *card = dev_get_drvdata(dev);
struct oxygen *chip = card->private_data; struct oxygen *chip = card->private_data;
unsigned int i, saved_interrupt_mask; unsigned int saved_interrupt_mask;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
for (i = 0; i < PCM_COUNT; ++i)
snd_pcm_suspend(chip->streams[i]);
if (chip->model.suspend) if (chip->model.suspend)
chip->model.suspend(chip); chip->model.suspend(chip);

View File

@ -1158,7 +1158,6 @@ static int riptide_suspend(struct device *dev)
chip->in_suspend = 1; chip->in_suspend = 1;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
return 0; return 0;
} }

View File

@ -2388,8 +2388,6 @@ static int rme96_suspend(struct device *dev)
struct rme96 *rme96 = card->private_data; struct rme96 *rme96 = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend(rme96->playback_substream);
snd_pcm_suspend(rme96->capture_substream);
/* save capture & playback pointers */ /* save capture & playback pointers */
rme96->playback_pointer = readl(rme96->iobase + RME96_IO_GET_PLAY_POS) rme96->playback_pointer = readl(rme96->iobase + RME96_IO_GET_PLAY_POS)

View File

@ -1214,7 +1214,6 @@ static int sis_suspend(struct device *dev)
int i; int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(sis->pcm);
if (sis->codecs_present & SIS_PRIMARY_CODEC_PRESENT) if (sis->codecs_present & SIS_PRIMARY_CODEC_PRESENT)
snd_ac97_suspend(sis->ac97[0]); snd_ac97_suspend(sis->ac97[0]);
if (sis->codecs_present & SIS_SECONDARY_CODEC_PRESENT) if (sis->codecs_present & SIS_SECONDARY_CODEC_PRESENT)

View File

@ -3915,10 +3915,6 @@ static int snd_trident_suspend(struct device *dev)
trident->in_suspend = 1; trident->in_suspend = 1;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(trident->pcm);
snd_pcm_suspend_all(trident->foldback);
snd_pcm_suspend_all(trident->spdif);
snd_ac97_suspend(trident->ac97); snd_ac97_suspend(trident->ac97);
snd_ac97_suspend(trident->ac97_sec); snd_ac97_suspend(trident->ac97_sec);
return 0; return 0;

View File

@ -2278,8 +2278,6 @@ static int snd_via82xx_suspend(struct device *dev)
int i; int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
for (i = 0; i < 2; i++)
snd_pcm_suspend_all(chip->pcms[i]);
for (i = 0; i < chip->num_devs; i++) for (i = 0; i < chip->num_devs; i++)
snd_via82xx_channel_reset(chip, &chip->devs[i]); snd_via82xx_channel_reset(chip, &chip->devs[i]);
synchronize_irq(chip->irq); synchronize_irq(chip->irq);

View File

@ -1038,8 +1038,6 @@ static int snd_via82xx_suspend(struct device *dev)
int i; int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
for (i = 0; i < 2; i++)
snd_pcm_suspend_all(chip->pcms[i]);
for (i = 0; i < chip->num_devs; i++) for (i = 0; i < chip->num_devs; i++)
snd_via82xx_channel_reset(chip, &chip->devs[i]); snd_via82xx_channel_reset(chip, &chip->devs[i]);
synchronize_irq(chip->irq); synchronize_irq(chip->irq);

View File

@ -2304,10 +2304,6 @@ static int snd_ymfpci_suspend(struct device *dev)
unsigned int i; unsigned int i;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
snd_pcm_suspend_all(chip->pcm2);
snd_pcm_suspend_all(chip->pcm_spdif);
snd_pcm_suspend_all(chip->pcm_4ch);
snd_ac97_suspend(chip->ac97); snd_ac97_suspend(chip->ac97);
for (i = 0; i < YDSXGR_NUM_SAVED_REGS; i++) for (i = 0; i < YDSXGR_NUM_SAVED_REGS; i++)
chip->saved_regs[i] = snd_ymfpci_readl(chip, saved_regs_index[i]); chip->saved_regs[i] = snd_ymfpci_readl(chip, saved_regs_index[i]);

View File

@ -265,7 +265,6 @@ int snd_pdacf_suspend(struct snd_pdacf *chip)
u16 val; u16 val;
snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(chip->pcm);
/* disable interrupts, but use direct write to preserve old register value in chip->regmap */ /* disable interrupts, but use direct write to preserve old register value in chip->regmap */
val = inw(chip->port + PDAUDIOCF_REG_IER); val = inw(chip->port + PDAUDIOCF_REG_IER);
val &= ~(PDAUDIOCF_IRQOVREN|PDAUDIOCF_IRQAKMEN|PDAUDIOCF_IRQLVLEN0|PDAUDIOCF_IRQLVLEN1); val &= ~(PDAUDIOCF_IRQOVREN|PDAUDIOCF_IRQAKMEN|PDAUDIOCF_IRQLVLEN0|PDAUDIOCF_IRQLVLEN1);

View File

@ -1365,7 +1365,6 @@ void snd_pmac_suspend(struct snd_pmac *chip)
snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
if (chip->suspend) if (chip->suspend)
chip->suspend(chip); chip->suspend(chip);
snd_pcm_suspend_all(chip->pcm);
spin_lock_irqsave(&chip->reg_lock, flags); spin_lock_irqsave(&chip->reg_lock, flags);
snd_pmac_beep_stop(chip); snd_pmac_beep_stop(chip);
spin_unlock_irqrestore(&chip->reg_lock, flags); spin_unlock_irqrestore(&chip->reg_lock, flags);

View File

@ -3155,6 +3155,7 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
} }
pcm->private_free = soc_pcm_private_free; pcm->private_free = soc_pcm_private_free;
pcm->no_device_suspend = true;
out: out:
dev_info(rtd->card->dev, "%s <-> %s mapping ok\n", dev_info(rtd->card->dev, "%s <-> %s mapping ok\n",
(rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name, (rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name,

View File

@ -811,7 +811,6 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
if (!chip->num_suspended_intf++) { if (!chip->num_suspended_intf++) {
list_for_each_entry(as, &chip->pcm_list, list) { list_for_each_entry(as, &chip->pcm_list, list) {
snd_pcm_suspend_all(as->pcm);
snd_usb_pcm_suspend(as); snd_usb_pcm_suspend(as);
as->substream[0].need_setup_ep = as->substream[0].need_setup_ep =
as->substream[1].need_setup_ep = true; as->substream[1].need_setup_ep = true;

View File

@ -849,10 +849,8 @@ int line6_suspend(struct usb_interface *interface, pm_message_t message)
if (line6->properties->capabilities & LINE6_CAP_CONTROL) if (line6->properties->capabilities & LINE6_CAP_CONTROL)
line6_stop_listen(line6); line6_stop_listen(line6);
if (line6pcm != NULL) { if (line6pcm != NULL)
snd_pcm_suspend_all(line6pcm->pcm);
line6pcm->flags = 0; line6pcm->flags = 0;
}
return 0; return 0;
} }

View File

@ -1651,18 +1651,6 @@ static int had_create_jack(struct snd_intelhad *ctx,
static int __maybe_unused hdmi_lpe_audio_suspend(struct device *dev) static int __maybe_unused hdmi_lpe_audio_suspend(struct device *dev)
{ {
struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev); struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev);
int port;
for_each_port(card_ctx, port) {
struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];
struct snd_pcm_substream *substream;
substream = had_substream_get(ctx);
if (substream) {
snd_pcm_suspend(substream);
had_substream_put(ctx);
}
}
snd_power_change_state(card_ctx->card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card_ctx->card, SNDRV_CTL_POWER_D3hot);