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:
commit
436ec40e0c
|
@ -3924,15 +3924,12 @@ The scheme of the real suspend job is as follows.
|
|||
2. Call :c:func:`snd_power_change_state()` with
|
||||
``SNDRV_CTL_POWER_D3hot`` to change the power status.
|
||||
|
||||
3. Call :c:func:`snd_pcm_suspend_all()` to suspend the running
|
||||
PCM streams.
|
||||
|
||||
4. If AC97 codecs are used, call :c:func:`snd_ac97_suspend()` for
|
||||
3. If AC97 codecs are used, call :c:func:`snd_ac97_suspend()` for
|
||||
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:
|
||||
|
||||
|
@ -3946,12 +3943,10 @@ A typical code would be like:
|
|||
/* (2) */
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
/* (3) */
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
/* (4) */
|
||||
snd_ac97_suspend(chip->ac97);
|
||||
/* (5) */
|
||||
/* (4) */
|
||||
snd_mychip_save_registers(chip);
|
||||
/* (6) */
|
||||
/* (5) */
|
||||
snd_mychip_stop_hardware(chip);
|
||||
return 0;
|
||||
}
|
||||
|
@ -3994,13 +3989,9 @@ A typical code would be like:
|
|||
return 0;
|
||||
}
|
||||
|
||||
As shown in the above, it's better to save registers after suspending
|
||||
the PCM operations via :c:func:`snd_pcm_suspend_all()` or
|
||||
:c:func:`snd_pcm_suspend()`. It means that the PCM streams are
|
||||
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.
|
||||
Note that, at the time this callback gets called, the PCM stream has
|
||||
been already suspended via its own PM ops calling
|
||||
:c:func:`snd_pcm_suspend_all()` internally.
|
||||
|
||||
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
|
||||
|
|
|
@ -614,7 +614,6 @@ static int snd_dw_hdmi_suspend(struct device *dev)
|
|||
struct snd_dw_hdmi *dw = dev_get_drvdata(dev);
|
||||
|
||||
snd_power_change_state(dw->card, SNDRV_CTL_POWER_D3cold);
|
||||
snd_pcm_suspend_all(dw->pcm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -538,6 +538,7 @@ struct snd_pcm {
|
|||
void (*private_free) (struct snd_pcm *pcm);
|
||||
bool internal; /* pcm is for internal use only */
|
||||
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)
|
||||
struct snd_pcm_oss oss;
|
||||
#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_stop_xrun(struct snd_pcm_substream *substream);
|
||||
#ifdef CONFIG_PM
|
||||
int snd_pcm_suspend(struct snd_pcm_substream *substream);
|
||||
int snd_pcm_suspend_all(struct snd_pcm *pcm);
|
||||
#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)
|
||||
{
|
||||
return 0;
|
||||
|
|
|
@ -380,10 +380,6 @@ static int i2sbus_suspend(struct macio_dev* dev, pm_message_t state)
|
|||
int err, ret = 0;
|
||||
|
||||
list_for_each_entry(i2sdev, &control->list, item) {
|
||||
/* Notify Alsa */
|
||||
/* Suspend PCM streams */
|
||||
snd_pcm_suspend_all(i2sdev->sound.pcm);
|
||||
|
||||
/* Notify codecs */
|
||||
list_for_each_entry(cii, &i2sdev->sound.codec_list, list) {
|
||||
err = 0;
|
||||
|
|
|
@ -757,7 +757,6 @@ static int aaci_do_suspend(struct snd_card *card)
|
|||
{
|
||||
struct aaci *aaci = card->private_data;
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3cold);
|
||||
snd_pcm_suspend_all(aaci->pcm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -124,7 +124,6 @@ static int pxa2xx_ac97_do_suspend(struct snd_card *card)
|
|||
pxa2xx_audio_ops_t *platform_ops = card->dev->platform_data;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3cold);
|
||||
snd_pcm_suspend_all(pxa2xx_ac97_pcm);
|
||||
snd_ac97_suspend(pxa2xx_ac97_ac97);
|
||||
if (platform_ops && platform_ops->suspend)
|
||||
platform_ops->suspend(platform_ops->priv);
|
||||
|
|
|
@ -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[];
|
||||
|
||||
/*
|
||||
* 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
|
||||
* @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);
|
||||
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,
|
||||
stream == SNDRV_PCM_STREAM_PLAYBACK ? 'p' : 'c');
|
||||
|
||||
|
|
|
@ -1460,29 +1460,24 @@ static const struct action_ops snd_pcm_action_suspend = {
|
|||
.post_action = snd_pcm_post_suspend
|
||||
};
|
||||
|
||||
/**
|
||||
/*
|
||||
* snd_pcm_suspend - trigger SUSPEND to all linked streams
|
||||
* @substream: the PCM substream
|
||||
*
|
||||
* After this call, all streams are changed to SUSPENDED state.
|
||||
*
|
||||
* Return: Zero if successful (or @substream is %NULL), or a negative error
|
||||
* code.
|
||||
* Return: Zero if successful, or a negative error code.
|
||||
*/
|
||||
int snd_pcm_suspend(struct snd_pcm_substream *substream)
|
||||
static int snd_pcm_suspend(struct snd_pcm_substream *substream)
|
||||
{
|
||||
int err;
|
||||
unsigned long flags;
|
||||
|
||||
if (! substream)
|
||||
return 0;
|
||||
|
||||
snd_pcm_stream_lock_irqsave(substream, flags);
|
||||
err = snd_pcm_action(&snd_pcm_action_suspend, substream, 0);
|
||||
snd_pcm_stream_unlock_irqrestore(substream, flags);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_pcm_suspend);
|
||||
|
||||
/**
|
||||
* snd_pcm_suspend_all - trigger SUSPEND to all substreams in the given pcm
|
||||
|
|
|
@ -1200,12 +1200,8 @@ static int loopback_remove(struct platform_device *devptr)
|
|||
static int loopback_suspend(struct device *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_pcm_suspend_all(loopback->pcm[0]);
|
||||
snd_pcm_suspend_all(loopback->pcm[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1138,10 +1138,8 @@ static int snd_dummy_remove(struct platform_device *devptr)
|
|||
static int snd_dummy_suspend(struct device *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_pcm_suspend_all(dummy->pcm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -197,7 +197,6 @@ static int pcsp_suspend(struct device *dev)
|
|||
{
|
||||
struct snd_pcsp *chip = dev_get_drvdata(dev);
|
||||
pcsp_stop_beep(chip);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -732,12 +732,8 @@ EXPORT_SYMBOL(snd_vx_dsp_load);
|
|||
*/
|
||||
int snd_vx_suspend(struct vx_core *chip)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -518,7 +518,6 @@ void snd_ad1816a_suspend(struct snd_ad1816a *chip)
|
|||
int reg;
|
||||
unsigned long flags;
|
||||
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
spin_lock_irqsave(&chip->lock, flags);
|
||||
for (reg = 0; reg < 48; reg++)
|
||||
chip->image[reg] = snd_ad1816a_read(chip, reg);
|
||||
|
|
|
@ -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;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_sbmixer_suspend(chip);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -434,7 +434,6 @@ static int snd_cmi8328_suspend(struct device *pdev, unsigned int n,
|
|||
cmi = card->private_data;
|
||||
snd_cmi8328_cfg_save(cmi->port, cmi->cfg);
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(cmi->wss->pcm);
|
||||
cmi->wss->suspend(cmi->wss);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -484,7 +484,6 @@ static int snd_cmi8330_suspend(struct snd_card *card)
|
|||
struct snd_cmi8330 *acard = card->private_data;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(acard->pcm);
|
||||
acard->wss->suspend(acard->wss);
|
||||
snd_sbmixer_suspend(acard->sb);
|
||||
return 0;
|
||||
|
|
|
@ -301,10 +301,8 @@ static int snd_es968_pnp_suspend(struct pnp_card_link *pcard,
|
|||
pm_message_t state)
|
||||
{
|
||||
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_pcm_suspend_all(chip->pcm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -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_pcm_suspend_all(chip->pcm);
|
||||
|
||||
/* power down */
|
||||
chip->pm_reg = (unsigned char)snd_es18xx_read(chip, ES18XX_PM);
|
||||
chip->pm_reg |= (ES18XX_PM_FM | ES18XX_PM_SUS);
|
||||
|
|
|
@ -356,7 +356,6 @@ static int snd_jazz16_suspend(struct device *pdev, unsigned int n,
|
|||
struct snd_sb *chip = acard->chip;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_sbmixer_suspend(chip);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -471,7 +471,6 @@ static int snd_sb16_suspend(struct snd_card *card, pm_message_t state)
|
|||
struct snd_sb *chip = acard->chip;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_sbmixer_suspend(chip);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -218,7 +218,6 @@ static int snd_sb8_suspend(struct device *dev, unsigned int n,
|
|||
struct snd_sb *chip = acard->chip;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_sbmixer_suspend(chip);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1625,7 +1625,6 @@ static void snd_wss_suspend(struct snd_wss *chip)
|
|||
int reg;
|
||||
unsigned long flags;
|
||||
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
spin_lock_irqsave(&chip->reg_lock, flags);
|
||||
for (reg = 0; reg < 32; reg++)
|
||||
chip->image[reg] = snd_wss_in(chip, reg);
|
||||
|
|
|
@ -1882,10 +1882,8 @@ static int ali_suspend(struct device *dev)
|
|||
return 0;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
for (i = 0; i < chip->num_of_codecs; i++) {
|
||||
snd_pcm_suspend_all(chip->pcm[i]);
|
||||
for (i = 0; i < chip->num_of_codecs; i++)
|
||||
snd_ac97_suspend(chip->ac97[i]);
|
||||
}
|
||||
|
||||
spin_lock_irq(&chip->reg_lock);
|
||||
|
||||
|
|
|
@ -731,7 +731,6 @@ static int snd_als300_suspend(struct device *dev)
|
|||
struct snd_als300 *chip = card->private_data;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_ac97_suspend(chip->ac97);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -994,7 +994,6 @@ static int snd_als4000_suspend(struct device *dev)
|
|||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_sbmixer_suspend(chip);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1125,8 +1125,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++)
|
||||
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);
|
||||
|
|
|
@ -2699,10 +2699,6 @@ snd_azf3328_suspend(struct device *dev)
|
|||
|
||||
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_regs(chip, chip->ctrl_io,
|
||||
|
|
|
@ -1910,11 +1910,8 @@ static int snd_ca0106_suspend(struct device *dev)
|
|||
{
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
struct snd_ca0106 *chip = card->private_data;
|
||||
int i;
|
||||
|
||||
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)
|
||||
snd_ac97_suspend(chip->ac97);
|
||||
snd_ca0106_mixer_suspend(chip);
|
||||
|
|
|
@ -3351,10 +3351,6 @@ static int snd_cmipci_suspend(struct device *dev)
|
|||
|
||||
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 */
|
||||
for (i = 0; i < ARRAY_SIZE(saved_regs); i++)
|
||||
cm->saved_regs[i] = snd_cmipci_read(cm, saved_regs[i]);
|
||||
|
|
|
@ -2002,8 +2002,6 @@ static int cs4281_suspend(struct device *dev)
|
|||
unsigned int i;
|
||||
|
||||
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_secondary);
|
||||
|
||||
|
|
|
@ -3781,12 +3781,6 @@ static int snd_cs46xx_suspend(struct device *dev)
|
|||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
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_general_purpose = snd_cs46xx_codec_read(chip, BA0_AC97_GENERAL_PURPOSE);
|
||||
|
||||
|
|
|
@ -62,7 +62,6 @@ static int __maybe_unused snd_cs5535audio_suspend(struct device *dev)
|
|||
int i;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(cs5535au->pcm);
|
||||
snd_ac97_suspend(cs5535au->ac97);
|
||||
for (i = 0; i < NUM_CS5535AUDIO_DMAS; i++) {
|
||||
struct cs5535audio_dma *dma = &cs5535au->dmas[i];
|
||||
|
|
|
@ -1548,18 +1548,10 @@ static void atc_connect_resources(struct ct_atc *atc)
|
|||
#ifdef CONFIG_PM_SLEEP
|
||||
static int atc_suspend(struct ct_atc *atc)
|
||||
{
|
||||
int i;
|
||||
struct hw *hw = atc->hw;
|
||||
|
||||
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);
|
||||
|
||||
hw->suspend(hw);
|
||||
|
|
|
@ -2165,9 +2165,6 @@ static int snd_echo_suspend(struct device *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
|
||||
/* This call can sleep */
|
||||
if (chip->midi_out)
|
||||
|
|
|
@ -224,12 +224,6 @@ static int snd_emu10k1_suspend(struct device *dev)
|
|||
|
||||
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_emu10k1_efx_suspend(emu);
|
||||
|
|
|
@ -2037,9 +2037,6 @@ static int snd_ensoniq_suspend(struct device *dev)
|
|||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
|
||||
snd_pcm_suspend_all(ensoniq->pcm1);
|
||||
snd_pcm_suspend_all(ensoniq->pcm2);
|
||||
|
||||
#ifdef CHIP1371
|
||||
snd_ac97_suspend(ensoniq->u.es1371.ac97);
|
||||
#else
|
||||
|
|
|
@ -1475,7 +1475,6 @@ static int es1938_suspend(struct device *dev)
|
|||
unsigned char *s, *d;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
|
||||
/* save mixer-related registers */
|
||||
for (s = saved_regs, d = chip->saved_regs; *s; s++, d++)
|
||||
|
|
|
@ -2392,7 +2392,6 @@ static int es1968_suspend(struct device *dev)
|
|||
chip->in_suspend = 1;
|
||||
cancel_work_sync(&chip->hwvol_work);
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_ac97_suspend(chip->ac97);
|
||||
snd_es1968_bob_stop(chip);
|
||||
return 0;
|
||||
|
|
|
@ -1408,7 +1408,6 @@ static int snd_fm801_suspend(struct device *dev)
|
|||
if (chip->tea575x_tuner & TUNER_ONLY) {
|
||||
/* FIXME: tea575x suspend */
|
||||
} else {
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_ac97_suspend(chip->ac97);
|
||||
snd_ac97_suspend(chip->ac97_sec);
|
||||
}
|
||||
|
|
|
@ -2927,8 +2927,6 @@ static int hda_codec_runtime_suspend(struct device *dev)
|
|||
unsigned int state;
|
||||
|
||||
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);
|
||||
if (codec->link_down_at_suspend ||
|
||||
(codec_has_clkstop(codec) && codec_has_epss(codec) &&
|
||||
|
|
|
@ -2792,9 +2792,6 @@ static int snd_ice1712_suspend(struct device *dev)
|
|||
|
||||
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);
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
|
|
|
@ -2804,9 +2804,6 @@ static int snd_vt1724_suspend(struct device *dev)
|
|||
|
||||
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);
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
|
|
|
@ -2614,8 +2614,6 @@ static int intel8x0_suspend(struct device *dev)
|
|||
int i;
|
||||
|
||||
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++)
|
||||
snd_ac97_suspend(chip->ac97[i]);
|
||||
if (chip->device_type == DEVICE_INTEL_ICH4)
|
||||
|
|
|
@ -1025,11 +1025,8 @@ static int intel8x0m_suspend(struct device *dev)
|
|||
{
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
struct intel8x0m *chip = card->private_data;
|
||||
int i;
|
||||
|
||||
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);
|
||||
if (chip->irq >= 0) {
|
||||
free_irq(chip->irq, chip);
|
||||
|
|
|
@ -2422,7 +2422,6 @@ static int m3_suspend(struct device *dev)
|
|||
chip->in_suspend = 1;
|
||||
cancel_work_sync(&chip->hwvol_work);
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_ac97_suspend(chip->ac97);
|
||||
|
||||
msleep(10); /* give the assp a chance to idle.. */
|
||||
|
|
|
@ -1413,7 +1413,6 @@ static int nm256_suspend(struct device *dev)
|
|||
struct nm256 *chip = card->private_data;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_ac97_suspend(chip->ac97);
|
||||
chip->coeffs_current = 0;
|
||||
return 0;
|
||||
|
|
|
@ -744,13 +744,10 @@ static int oxygen_pci_suspend(struct device *dev)
|
|||
{
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
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);
|
||||
|
||||
for (i = 0; i < PCM_COUNT; ++i)
|
||||
snd_pcm_suspend(chip->streams[i]);
|
||||
|
||||
if (chip->model.suspend)
|
||||
chip->model.suspend(chip);
|
||||
|
||||
|
|
|
@ -1158,7 +1158,6 @@ static int riptide_suspend(struct device *dev)
|
|||
|
||||
chip->in_suspend = 1;
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
snd_ac97_suspend(chip->ac97);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -2388,8 +2388,6 @@ static int rme96_suspend(struct device *dev)
|
|||
struct rme96 *rme96 = card->private_data;
|
||||
|
||||
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 */
|
||||
rme96->playback_pointer = readl(rme96->iobase + RME96_IO_GET_PLAY_POS)
|
||||
|
|
|
@ -1214,7 +1214,6 @@ static int sis_suspend(struct device *dev)
|
|||
int i;
|
||||
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
snd_pcm_suspend_all(sis->pcm);
|
||||
if (sis->codecs_present & SIS_PRIMARY_CODEC_PRESENT)
|
||||
snd_ac97_suspend(sis->ac97[0]);
|
||||
if (sis->codecs_present & SIS_SECONDARY_CODEC_PRESENT)
|
||||
|
|
|
@ -3915,10 +3915,6 @@ static int snd_trident_suspend(struct device *dev)
|
|||
|
||||
trident->in_suspend = 1;
|
||||
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_sec);
|
||||
return 0;
|
||||
|
|
|
@ -2278,8 +2278,6 @@ static int snd_via82xx_suspend(struct device *dev)
|
|||
int i;
|
||||
|
||||
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++)
|
||||
snd_via82xx_channel_reset(chip, &chip->devs[i]);
|
||||
synchronize_irq(chip->irq);
|
||||
|
|
|
@ -1038,8 +1038,6 @@ static int snd_via82xx_suspend(struct device *dev)
|
|||
int i;
|
||||
|
||||
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++)
|
||||
snd_via82xx_channel_reset(chip, &chip->devs[i]);
|
||||
synchronize_irq(chip->irq);
|
||||
|
|
|
@ -2304,10 +2304,6 @@ static int snd_ymfpci_suspend(struct device *dev)
|
|||
unsigned int i;
|
||||
|
||||
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);
|
||||
for (i = 0; i < YDSXGR_NUM_SAVED_REGS; i++)
|
||||
chip->saved_regs[i] = snd_ymfpci_readl(chip, saved_regs_index[i]);
|
||||
|
|
|
@ -265,7 +265,6 @@ int snd_pdacf_suspend(struct snd_pdacf *chip)
|
|||
u16 val;
|
||||
|
||||
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 */
|
||||
val = inw(chip->port + PDAUDIOCF_REG_IER);
|
||||
val &= ~(PDAUDIOCF_IRQOVREN|PDAUDIOCF_IRQAKMEN|PDAUDIOCF_IRQLVLEN0|PDAUDIOCF_IRQLVLEN1);
|
||||
|
|
|
@ -1365,7 +1365,6 @@ void snd_pmac_suspend(struct snd_pmac *chip)
|
|||
snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
|
||||
if (chip->suspend)
|
||||
chip->suspend(chip);
|
||||
snd_pcm_suspend_all(chip->pcm);
|
||||
spin_lock_irqsave(&chip->reg_lock, flags);
|
||||
snd_pmac_beep_stop(chip);
|
||||
spin_unlock_irqrestore(&chip->reg_lock, flags);
|
||||
|
|
|
@ -3155,6 +3155,7 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
|
|||
}
|
||||
|
||||
pcm->private_free = soc_pcm_private_free;
|
||||
pcm->no_device_suspend = true;
|
||||
out:
|
||||
dev_info(rtd->card->dev, "%s <-> %s mapping ok\n",
|
||||
(rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name,
|
||||
|
|
|
@ -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);
|
||||
if (!chip->num_suspended_intf++) {
|
||||
list_for_each_entry(as, &chip->pcm_list, list) {
|
||||
snd_pcm_suspend_all(as->pcm);
|
||||
snd_usb_pcm_suspend(as);
|
||||
as->substream[0].need_setup_ep =
|
||||
as->substream[1].need_setup_ep = true;
|
||||
|
|
|
@ -849,10 +849,8 @@ int line6_suspend(struct usb_interface *interface, pm_message_t message)
|
|||
if (line6->properties->capabilities & LINE6_CAP_CONTROL)
|
||||
line6_stop_listen(line6);
|
||||
|
||||
if (line6pcm != NULL) {
|
||||
snd_pcm_suspend_all(line6pcm->pcm);
|
||||
if (line6pcm != NULL)
|
||||
line6pcm->flags = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1651,18 +1651,6 @@ static int had_create_jack(struct snd_intelhad *ctx,
|
|||
static int __maybe_unused hdmi_lpe_audio_suspend(struct device *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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue