ASoC: apple: mca: Constrain channels according to TDM mask
authorMartin Povišer <povik+lin@cutebit.org>
Sun, 18 May 2025 10:50:46 +0000 (20:50 +1000)
committerMark Brown <broonie@kernel.org>
Mon, 19 May 2025 10:59:44 +0000 (11:59 +0100)
We don't (and can't) configure the hardware correctly if the number of
channels exceeds the weight of the TDM mask. Report that constraint in
startup of FE.

Fixes: 3df5d0d97289 ("ASoC: apple: mca: Start new platform driver")
Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
Signed-off-by: James Calligeros <jcalligeros99@gmail.com>
Link: https://patch.msgid.link/20250518-mca-fixes-v1-1-ee1015a695f6@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/apple/mca.c

index b4f4696809dd231a64229114c5550bb5f237607f..5dd24ab90d0f052bb48f451cf009dc2e9128014d 100644 (file)
@@ -464,6 +464,28 @@ err:
        return -EINVAL;
 }
 
+static int mca_fe_startup(struct snd_pcm_substream *substream,
+                         struct snd_soc_dai *dai)
+{
+       struct mca_cluster *cl = mca_dai_to_cluster(dai);
+       unsigned int mask, nchannels;
+
+       if (cl->tdm_slots) {
+               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+                       mask = cl->tdm_tx_mask;
+               else
+                       mask = cl->tdm_rx_mask;
+
+               nchannels = hweight32(mask);
+       } else {
+               nchannels = 2;
+       }
+
+       return snd_pcm_hw_constraint_minmax(substream->runtime,
+                                           SNDRV_PCM_HW_PARAM_CHANNELS,
+                                           1, nchannels);
+}
+
 static int mca_fe_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
                               unsigned int rx_mask, int slots, int slot_width)
 {
@@ -680,6 +702,7 @@ static int mca_fe_hw_params(struct snd_pcm_substream *substream,
 }
 
 static const struct snd_soc_dai_ops mca_fe_ops = {
+       .startup = mca_fe_startup,
        .set_fmt = mca_fe_set_fmt,
        .set_bclk_ratio = mca_set_bclk_ratio,
        .set_tdm_slot = mca_fe_set_tdm_slot,