]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: soc-pcm: Preserve hw parameters from components in dpcm_runtime_setup_fe
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Wed, 29 Oct 2025 07:36:00 +0000 (09:36 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 6 Nov 2025 13:05:43 +0000 (13:05 +0000)
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: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://patch.msgid.link/20251029073600.13624-1-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-pcm.c

index 2c21fd528afd0fb7188f4bffadc477149aaae18b..c82b10578ba608ff65d0182fb6ee3b00ea8ba95b 100644 (file)
@@ -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)
-{
-       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;
+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;