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

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.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent f09e9284
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
@@ -456,6 +456,7 @@ static int hda_dai_suspend(struct hdac_bus *bus)
	struct hdac_stream *s;
	const char *name;
	int stream_tag;
	int ret;

	/* set internal flag for BE */
	list_for_each_entry(s, &bus->stream_list, list) {
@@ -468,21 +469,33 @@ static int hda_dai_suspend(struct hdac_bus *bus)
		 * explicitly during suspend.
		 */
		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);
			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);
			if (!link)
				return -EINVAL;

			hext_stream->link_prepared = 0;

			if (hdac_stream(hext_stream)->direction ==
				SNDRV_PCM_STREAM_CAPTURE)
				continue;

			/*
			 * 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;

			/* for consistency with TRIGGER_SUSPEND we free DAI resources */
			ret = hda_dai_hw_free_ipc(hdac_stream(hext_stream)->direction, cpu_dai);
			if (ret < 0)
				return ret;
		}
	}

	return 0;