Commit 23b1944e authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Mark Brown

ASoC: SOF: Intel: hda-dai: improve suspend case

Add comments and re-align with the TRIGGER_SUSPEND case with an
additional call to hda_dai_hw_free_ipc() to free-up resources.
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarRander Wang <rander.wang@intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20220421203201.1550328-12-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent f09e9284
...@@ -456,6 +456,7 @@ static int hda_dai_suspend(struct hdac_bus *bus) ...@@ -456,6 +456,7 @@ static int hda_dai_suspend(struct hdac_bus *bus)
struct hdac_stream *s; struct hdac_stream *s;
const char *name; const char *name;
int stream_tag; int stream_tag;
int ret;
/* set internal flag for BE */ /* set internal flag for BE */
list_for_each_entry(s, &bus->stream_list, list) { list_for_each_entry(s, &bus->stream_list, list) {
...@@ -468,20 +469,32 @@ static int hda_dai_suspend(struct hdac_bus *bus) ...@@ -468,20 +469,32 @@ static int hda_dai_suspend(struct hdac_bus *bus)
* explicitly during suspend. * explicitly during suspend.
*/ */
if (hext_stream->link_substream) { if (hext_stream->link_substream) {
struct snd_soc_dai *cpu_dai;
struct snd_soc_dai *codec_dai;
rtd = asoc_substream_to_rtd(hext_stream->link_substream); rtd = asoc_substream_to_rtd(hext_stream->link_substream);
name = asoc_rtd_to_codec(rtd, 0)->component->name; cpu_dai = asoc_rtd_to_cpu(rtd, 0);
codec_dai = asoc_rtd_to_codec(rtd, 0);
name = codec_dai->component->name;
link = snd_hdac_ext_bus_get_link(bus, name); link = snd_hdac_ext_bus_get_link(bus, name);
if (!link) if (!link)
return -EINVAL; return -EINVAL;
/*
* we don't need to call snd_hdac_ext_link_stream_clear(he_stream)
* since we can only reach this case in the pause_push state, and
* the TRIGGER_PAUSE_PUSH already stops the DMA
*/
if (hdac_stream(hext_stream)->direction == SNDRV_PCM_STREAM_PLAYBACK) {
stream_tag = hdac_stream(hext_stream)->stream_tag;
snd_hdac_ext_link_clear_stream_id(link, stream_tag);
}
hext_stream->link_prepared = 0; hext_stream->link_prepared = 0;
if (hdac_stream(hext_stream)->direction == /* for consistency with TRIGGER_SUSPEND we free DAI resources */
SNDRV_PCM_STREAM_CAPTURE) ret = hda_dai_hw_free_ipc(hdac_stream(hext_stream)->direction, cpu_dai);
continue; if (ret < 0)
return ret;
stream_tag = hdac_stream(hext_stream)->stream_tag;
snd_hdac_ext_link_clear_stream_id(link, stream_tag);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment