Unverified Commit e9db1b55 authored by Bard Liao's avatar Bard Liao Committed by Mark Brown
Browse files

ASoC: SOF: ipc3-topology: Convert the topology pin index to ALH dai index



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: b66bfc3a ("ASoC: SOF: sof-audio: Fix broken early bclk feature for SSP")
Signed-off-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarLiam Girdwood <liam.r.girdwood@intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://patch.msgid.link/20241127092955.20026-1-yung-chuan.liao@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 2f202032
Loading
Loading
Loading
Loading
+24 −2
Original line number Diff line number Diff line
@@ -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;