diff options
author | Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> | 2022-04-21 15:32:01 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2022-04-25 13:58:38 +0100 |
commit | c4eb48f7739fc0dae7e6b8319a77261fc1b61d74 (patch) | |
tree | 3c83162a73ba7c3691bd7d9a902ebfb9463c3d3d | |
parent | 880924cad12e96092364467cb7b3ad7a689bec55 (diff) | |
download | linux-stable-c4eb48f7739fc0dae7e6b8319a77261fc1b61d74.tar.gz linux-stable-c4eb48f7739fc0dae7e6b8319a77261fc1b61d74.tar.bz2 linux-stable-c4eb48f7739fc0dae7e6b8319a77261fc1b61d74.zip |
ASoC: SOF: Intel: hda-dai: protect hw_params against successive calls
Once we've set-up the HDA stream and its format, we currently don't
support additional format changes. We already have a protection in the
.prepare case, but this needs to be added in the hw_params too.
In mixing use cases where two DPCM FEs are connected to the same BE,
if can happen that there are multiple calls to the BE hw_params when
the two FEs are configured simultaneously.
This could alternatively be fixed at the DPCM level but that's a more
intrusive change requiring infrastructure changes: this would need to
be paired with the definition of fixed hw_params at the mixer level.
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20220421203201.1550328-15-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/sof/intel/hda-dai.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/sound/soc/sof/intel/hda-dai.c b/sound/soc/sof/intel/hda-dai.c index 53600c6c2911..9823230d2ef4 100644 --- a/sound/soc/sof/intel/hda-dai.c +++ b/sound/soc/sof/intel/hda-dai.c @@ -336,8 +336,13 @@ static int hda_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { + struct hdac_ext_stream *hext_stream = + snd_soc_dai_get_dma_data(dai, substream); int ret; + if (hext_stream && hext_stream->link_prepared) + return 0; + ret = hda_link_dma_hw_params(substream, params); if (ret < 0) return ret; |