Unverified Commit 80e04fb7 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!15786 ASoC: SOF: ipc4-topology: Harden loops for looking up ALH copiers

Merge Pull Request from: @ci-robot 
 
PR sync from: Xiaomeng Zhang <zhangxiaomeng13@huawei.com>
https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/QW7XOETIZAJJJD4MQJQ2ZMARNUPAC7XC/ 
*** BLURB HERE ***

Peter Ujfalusi (1):
  ASoC: SOF: ipc4-topology: Harden loops for looking up ALH copiers

Pierre-Louis Bossart (1):
  ASoC: SOF: topology: dynamically allocate and store DAI
    widget->private

Ranjani Sridharan (1):

 
https://gitee.com/src-openeuler/kernel/issues/IBWVJF 
 
Link:https://gitee.com/openeuler/kernel/pulls/15786

 

Reviewed-by: default avatarYe Weihua <yeweihua4@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 3ee76087 c31f7740
Loading
Loading
Loading
Loading
+11 −2
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;
@@ -576,10 +577,16 @@ static int sof_ipc4_widget_setup_comp_dai(struct snd_sof_widget *swidget)
		}

		list_for_each_entry(w, &sdev->widget_list, list) {
			if (w->widget->sname &&
			struct snd_sof_dai *alh_dai;

			if (!WIDGET_IS_DAI(w->id) || !w->widget->sname ||
			    strcmp(w->widget->sname, swidget->widget->sname))
				continue;

			alh_dai = w->private;
			if (alh_dai->type != SOF_DAI_INTEL_ALH)
				continue;

			blob->alh_cfg.device_count++;
		}

@@ -1691,11 +1698,13 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
			 */
			i = 0;
			list_for_each_entry(w, &sdev->widget_list, list) {
				if (w->widget->sname &&
				if (!WIDGET_IS_DAI(w->id) || !w->widget->sname ||
				    strcmp(w->widget->sname, swidget->widget->sname))
					continue;

				dai = w->private;
				if (dai->type != SOF_DAI_INTEL_ALH)
					continue;
				alh_copier = (struct sof_ipc4_copier *)dai->private;
				alh_data = &alh_copier->data;
				blob->alh_cfg.mapping[i].device = alh_data->gtw_cfg.node_id;
+3 −5
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ static int sof_widget_free_unlocked(struct snd_sof_dev *sdev,
{
	const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
	struct snd_sof_pipeline *spipe = swidget->spipe;
	struct snd_sof_widget *pipe_widget;
	int err = 0;
	int ret;

@@ -60,8 +59,6 @@ static int sof_widget_free_unlocked(struct snd_sof_dev *sdev,
	if (--swidget->use_count)
		return 0;

	pipe_widget = swidget->spipe->pipe_widget;

	/* reset route setup status for all routes that contain this widget */
	sof_reset_route_setup_status(sdev, swidget);

@@ -110,8 +107,9 @@ static int sof_widget_free_unlocked(struct snd_sof_dev *sdev,
	 * free the scheduler widget (same as pipe_widget) associated with the current swidget.
	 * skip for static pipelines
	 */
	if (swidget->dynamic_pipeline_widget && swidget->id != snd_soc_dapm_scheduler) {
		ret = sof_widget_free_unlocked(sdev, pipe_widget);
	if (swidget->spipe && swidget->dynamic_pipeline_widget &&
	    swidget->id != snd_soc_dapm_scheduler) {
		ret = sof_widget_free_unlocked(sdev, swidget->spipe->pipe_widget);
		if (ret < 0 && !err)
			err = ret;
	}
+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;
+22 −3
Original line number Diff line number Diff line
@@ -2345,25 +2345,43 @@ 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 dai;
		struct snd_sof_dai *sdai;
		int ret;

		swidget = kzalloc(sizeof(*swidget), GFP_KERNEL);
		if (!swidget)
			return -ENOMEM;

		memset(&dai, 0, sizeof(dai));
		sdai = kzalloc(sizeof(*sdai), GFP_KERNEL);
		if (!sdai) {
			kfree(swidget);
			return -ENOMEM;
		}

		ret = sof_connect_dai_widget(scomp, w, tw, &dai);
		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);
			kfree(sdai);
			return ret;
		}

		swidget->scomp = scomp;
		swidget->widget = w;
		swidget->private = sdai;
		mutex_init(&swidget->setup_mutex);
		w->dobj.private = swidget;
		list_add(&swidget->list, &sdev->widget_list);
@@ -2387,6 +2405,7 @@ static int sof_dspless_widget_unload(struct snd_soc_component *scomp,

		/* remove and free swidget object */
		list_del(&swidget->list);
		kfree(swidget->private);
		kfree(swidget);
	}