]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: SOF: ipc4-topology: set playback channel mask
authorBard Liao <yung-chuan.liao@linux.intel.com>
Mon, 15 Dec 2025 13:07:23 +0000 (15:07 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 15 Dec 2025 14:07:29 +0000 (23:07 +0900)
Currently, we send all channels to all amps and copy the channel_mask
to all ALH DMAs in playback. However, the amp may not have the
capability to run any process and SOF may need to split the channels
and send specific data channel to each amp. In that case, we need
to split the channel_mask in ALH DMA.
Copy the channel mask only if the widget channel count is the same
the FE channels for playback, otherwise, split the channels among the
aggregated DAIs. Like what we did in capture.

Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://patch.msgid.link/20251215130723.31081-1-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc4-topology.c

index 221e9d4052b8f0ef823def6c8e31f22d0b857839..588defd3eec99a29c447323259861bfd981f7bd4 100644 (file)
@@ -2280,8 +2280,19 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
                                ch_map >>= 4;
                        }
 
-                       step = ch_count / blob->alh_cfg.device_count;
-                       mask =  GENMASK(step - 1, 0);
+                       if (swidget->id == snd_soc_dapm_dai_in && ch_count == out_ref_channels) {
+                               /*
+                                * For playback DAI widgets where the channel number is equal to
+                                * the output reference channels, set the step = 0 to ensure all
+                                * the ch_mask is applied to all alh mappings.
+                                */
+                               mask = ch_mask;
+                               step = 0;
+                       } else {
+                               step = ch_count / blob->alh_cfg.device_count;
+                               mask =  GENMASK(step - 1, 0);
+                       }
+
                        /*
                         * Set each gtw_cfg.node_id to blob->alh_cfg.mapping[]
                         * for all widgets with the same stream name
@@ -2316,8 +2327,9 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
                                }
 
                                /*
-                                * Set the same channel mask for playback as the audio data is
-                                * duplicated for all speakers. For capture, split the channels
+                                * Set the same channel mask if the widget channel count is the same
+                                * as the FE channels for playback as the audio data is duplicated
+                                * for all speakers in this case. Otherwise, split the channels
                                 * among the aggregated DAIs. For example, with 4 channels on 2
                                 * aggregated DAIs, the channel_mask should be 0x3 and 0xc for the
                                 * two DAI's.
@@ -2326,10 +2338,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
                                 * the tables in soc_acpi files depending on the _ADR and devID
                                 * registers for each codec.
                                 */
-                               if (w->id == snd_soc_dapm_dai_in)
-                                       blob->alh_cfg.mapping[i].channel_mask = ch_mask;
-                               else
-                                       blob->alh_cfg.mapping[i].channel_mask = mask << (step * i);
+                               blob->alh_cfg.mapping[i].channel_mask = mask << (step * i);
 
                                i++;
                        }