Unverified Commit 6d34b66f authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown
Browse files

ASoC: soc-pcm: Preserve hw parameters from components in dpcm_runtime_setup_fe



Component drivers can prepare snd_pcm_hardware struct based on the hardware
capabilities which information should not be discarded.

Only touch the rates, channels_max and formats if they were left to 0,
otherwise keep the provided configuration intact for the parameter cross
checking decision.

Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://patch.msgid.link/20251029073600.13624-1-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 7a381e37
Loading
Loading
Loading
Loading
+22 −14
Original line number Diff line number Diff line
@@ -570,14 +570,26 @@ static void soc_pcm_apply_msb(struct snd_pcm_substream *substream)
	soc_pcm_set_msb(substream, cpu_bits);
}

static void soc_pcm_hw_init(struct snd_pcm_hardware *hw)
static void soc_pcm_hw_init(struct snd_pcm_hardware *hw, bool force)
{
	if (force) {
		hw->rates = UINT_MAX;
		hw->rate_min = 0;
		hw->rate_max = UINT_MAX;
		hw->channels_min = 0;
		hw->channels_max = UINT_MAX;
		hw->formats = ULLONG_MAX;
	} else {
		/* Preserve initialized parameters */
		if (!hw->rates)
			hw->rates = UINT_MAX;
		if (!hw->rate_max)
			hw->rate_max = UINT_MAX;
		if (!hw->channels_max)
			hw->channels_max = UINT_MAX;
		if (!hw->formats)
			hw->formats = ULLONG_MAX;
	}
}

static void soc_pcm_hw_update_rate(struct snd_pcm_hardware *hw,
@@ -626,7 +638,7 @@ int snd_soc_runtime_calc_hw(struct snd_soc_pcm_runtime *rtd,
	unsigned int cpu_chan_min = 0, cpu_chan_max = UINT_MAX;
	int i;

	soc_pcm_hw_init(hw);
	soc_pcm_hw_init(hw, true);

	/* first calculate min/max only for CPUs in the DAI link */
	for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
@@ -1738,13 +1750,9 @@ static void dpcm_runtime_setup_fe(struct snd_pcm_substream *substream)
	struct snd_pcm_hardware *hw = &runtime->hw;
	struct snd_soc_dai *dai;
	int stream = substream->stream;
	u64 formats = hw->formats;
	int i;

	soc_pcm_hw_init(hw);

	if (formats)
		hw->formats &= formats;
	soc_pcm_hw_init(hw, false);

	for_each_rtd_cpu_dais(fe, i, dai) {
		const struct snd_soc_pcm_stream *cpu_stream;