ASoC: SOF: ipc3-topology: Convert the topology pin index to ALH dai index
authorBard Liao <yung-chuan.liao@linux.intel.com>
Wed, 27 Nov 2024 09:29:54 +0000 (17:29 +0800)
committerMark Brown <broonie@kernel.org>
Wed, 27 Nov 2024 11:28:27 +0000 (11:28 +0000)
Intel SoundWire machine driver always uses Pin number 2 and above.
Currently, the pin number is used as the FW DAI index directly. As a
result, FW DAI 0 and 1 are never used. That worked fine because we use
up to 2 DAIs in a SDW link. Convert the topology pin index to ALH dai
index, the mapping is using 2-off indexing, iow, pin #2 is ALH dai #0.

The issue exists since beginning. And the Fixes tag is the first commit
that this commit can be applied.

Fixes: b66bfc3a9810 ("ASoC: SOF: sof-audio: Fix broken early bclk feature for SSP")
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://patch.msgid.link/20241127092955.20026-1-yung-chuan.liao@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc3-topology.c

index be61e377e59e03470e035bcd11500eb0745407d8..c2fce554a674bbd1f7092c493fa09bf7c99af8b7 100644 (file)
@@ -20,6 +20,9 @@
 /* size of tplg ABI in bytes */
 #define SOF_IPC3_TPLG_ABI_SIZE 3
 
+/* Base of SOF_DAI_INTEL_ALH, this should be aligned with SOC_SDW_INTEL_BIDIR_PDI_BASE */
+#define INTEL_ALH_DAI_INDEX_BASE 2
+
 struct sof_widget_data {
        int ctrl_type;
        int ipc_cmd;
@@ -1594,6 +1597,17 @@ static int sof_ipc3_widget_setup_comp_dai(struct snd_sof_widget *swidget)
        if (ret < 0)
                goto free;
 
+       /* Subtract the base to match the FW dai index. */
+       if (comp_dai->type == SOF_DAI_INTEL_ALH) {
+               if (comp_dai->dai_index < INTEL_ALH_DAI_INDEX_BASE) {
+                       dev_err(sdev->dev,
+                               "Invalid ALH dai index %d, only Pin numbers >= %d can be used\n",
+                               comp_dai->dai_index, INTEL_ALH_DAI_INDEX_BASE);
+                       return -EINVAL;
+               }
+               comp_dai->dai_index -= INTEL_ALH_DAI_INDEX_BASE;
+       }
+
        dev_dbg(scomp->dev, "dai %s: type %d index %d\n",
                swidget->widget->name, comp_dai->type, comp_dai->dai_index);
        sof_dbg_comp_config(scomp, &comp_dai->config);
@@ -2167,8 +2181,16 @@ static int sof_ipc3_dai_config(struct snd_sof_dev *sdev, struct snd_sof_widget *
        case SOF_DAI_INTEL_ALH:
                if (data) {
                        /* save the dai_index during hw_params and reuse it for hw_free */
-                       if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS)
-                               config->dai_index = data->dai_index;
+                       if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS) {
+                               /* Subtract the base to match the FW dai index. */
+                               if (data->dai_index < INTEL_ALH_DAI_INDEX_BASE) {
+                                       dev_err(sdev->dev,
+                                               "Invalid ALH dai index %d, only Pin numbers >= %d can be used\n",
+                                               config->dai_index, INTEL_ALH_DAI_INDEX_BASE);
+                                       return -EINVAL;
+                               }
+                               config->dai_index = data->dai_index - INTEL_ALH_DAI_INDEX_BASE;
+                       }
                        config->alh.stream_id = data->dai_data;
                }
                break;