ASoC: SOF: Intel: hda: release link DMA for paused streams during suspend
Paused streams do not get suspended when the system enters S3. So, clear and release link DMA channel for such streams in the hda_dsp_set_hw_params_upon_resume() callback. Also, invalidate the link DMA channel in the DAI config before restoring the dai config upon resume. Also, modify the signature for the set_hw_params_upon_resume() op to return an int. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:

committed by
Mark Brown

parent
6b2239e333
commit
7077a07a72
@@ -454,18 +454,45 @@ int hda_dsp_suspend(struct snd_sof_dev *sdev, int state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev)
|
||||
int hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct hdac_bus *bus = sof_to_bus(sdev);
|
||||
struct sof_intel_hda_stream *hda_stream;
|
||||
struct hdac_ext_stream *stream;
|
||||
struct hdac_stream *s;
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
|
||||
struct snd_soc_pcm_runtime *rtd;
|
||||
struct hdac_ext_link *link;
|
||||
const char *name;
|
||||
int stream_tag;
|
||||
#endif
|
||||
|
||||
/* set internal flag for BE */
|
||||
list_for_each_entry(s, &bus->stream_list, list) {
|
||||
stream = stream_to_hdac_ext_stream(s);
|
||||
hda_stream = container_of(stream, struct sof_intel_hda_stream,
|
||||
hda_stream);
|
||||
hda_stream->hw_params_upon_resume = 1;
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
|
||||
/*
|
||||
* clear and release stream. This should already be taken care
|
||||
* for running streams when the SUSPEND trigger is called.
|
||||
* But paused streams do not get suspended, so this needs to be
|
||||
* done explicitly during suspend.
|
||||
*/
|
||||
if (stream->link_substream) {
|
||||
rtd = snd_pcm_substream_chip(stream->link_substream);
|
||||
name = rtd->codec_dai->component->name;
|
||||
link = snd_hdac_ext_bus_get_link(bus, name);
|
||||
if (!link)
|
||||
return -EINVAL;
|
||||
stream_tag = hdac_stream(stream)->stream_tag;
|
||||
snd_hdac_ext_link_clear_stream_id(link, stream_tag);
|
||||
snd_hdac_ext_stream_release(stream,
|
||||
HDAC_EXT_STREAM_TYPE_LINK);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user