Commit 38cb6fd8 authored by Ranjani Sridharan's avatar Ranjani Sridharan Committed by Xiaomeng Zhang
Browse files

ASoC: SOF: topology: Parse DAI type token for dspless mode

mainline inclusion
from mainline-v6.9-rc1
commit f9618ff105a0f6f5a6beed3edc557ea6a7d26df6
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IBWVJF
CVE: CVE-2025-21870

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f9618ff105a0f6f5a6beed3edc557ea6a7d26df6



--------------------------------

Starting with LunarLake, the dspless mode can handle SoundWire/ALH,
DMIC and SSPs, so we need to identify the dai type from topology.

Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://msgid.link/r/20240213101247.28887-12-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Conflicts:
	sound/soc/sof/topology.c
	sound/soc/sof/ipc4-topology.c
[The conflicts were due to some minor issue.]
Signed-off-by: default avatarXiaomeng Zhang <zhangxiaomeng13@huawei.com>
parent 51587cd9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -534,6 +534,7 @@ static int sof_ipc4_widget_setup_comp_dai(struct snd_sof_widget *swidget)
	dev_dbg(scomp->dev, "dai %s node_type %u dai_type %u dai_index %d\n", swidget->widget->name,
		node_type, ipc4_copier->dai_type, ipc4_copier->dai_index);

	dai->type = ipc4_copier->dai_type;
	ipc4_copier->data.gtw_cfg.node_id = SOF_IPC4_NODE_TYPE(node_type);

	pipe_widget = swidget->spipe->pipe_widget;
+1 −0
Original line number Diff line number Diff line
@@ -514,6 +514,7 @@ struct snd_sof_route {
struct snd_sof_dai {
	struct snd_soc_component *scomp;
	const char *name;
	u32 type;

	int number_configs;
	int current_config;
+12 −0
Original line number Diff line number Diff line
@@ -2345,7 +2345,10 @@ static int sof_dspless_widget_ready(struct snd_soc_component *scomp, int index,
				    struct snd_soc_tplg_dapm_widget *tw)
{
	if (WIDGET_IS_DAI(w->id)) {
		static const struct sof_topology_token dai_tokens[] = {
			{SOF_TKN_DAI_TYPE, SND_SOC_TPLG_TUPLE_TYPE_STRING, get_token_dai_type, 0}};
		struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
		struct snd_soc_tplg_private *priv = &tw->priv;
		struct snd_sof_widget *swidget;
		struct snd_sof_dai *sdai;
		int ret;
@@ -2360,6 +2363,15 @@ static int sof_dspless_widget_ready(struct snd_soc_component *scomp, int index,
			return -ENOMEM;
		}

		ret = sof_parse_tokens(scomp, &sdai->type, dai_tokens, ARRAY_SIZE(dai_tokens),
				       priv->array, le32_to_cpu(priv->size));
		if (ret < 0) {
			dev_err(scomp->dev, "Failed to parse DAI tokens for %s\n", tw->name);
			kfree(swidget);
			kfree(sdai);
			return ret;
		}

		ret = sof_connect_dai_widget(scomp, w, tw, sdai);
		if (ret) {
			kfree(swidget);