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

ASoC: SOF: topology: replace sof_link_hda_process by sof_set_dai_config



Now we send ipc in sof_set_dai_config(), too. Therefore, we can use
sof_set_dai_config() in sof_link_hda_load() just like other link load
functions do.

Signed-off-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20200427172939.25848-4-ranjani.sridharan@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 744a3bb3
Loading
Loading
Loading
Loading
+3 −61
Original line number Original line Diff line number Diff line
@@ -3008,66 +3008,6 @@ static int sof_link_dmic_load(struct snd_soc_component *scomp, int index,
	return ret;
	return ret;
}
}


/*
 * for hda link, playback and capture are supported by different dai
 * in FW. Here get the dai_index, set dma channel of each dai
 * and send config to FW. In FW, each dai sets config by dai_index
 */
static int sof_link_hda_process(struct snd_sof_dev *sdev,
				struct snd_soc_dai_link *link,
				struct sof_ipc_dai_config *config)
{
	struct sof_ipc_reply reply;
	u32 size = sizeof(*config);
	struct snd_sof_dai *sof_dai;
	int found = 0;
	int ret;

	list_for_each_entry(sof_dai, &sdev->dai_list, list) {
		if (!sof_dai->name)
			continue;

		if (strcmp(link->name, sof_dai->name) == 0) {
			config->dai_index = sof_dai->comp_dai.dai_index;
			found = 1;

			config->hda.link_dma_ch = DMA_CHAN_INVALID;

			/* save config in dai component */
			sof_dai->dai_config = kmemdup(config, size, GFP_KERNEL);
			if (!sof_dai->dai_config)
				return -ENOMEM;

			sof_dai->cpu_dai_name = link->cpus->dai_name;

			/* send message to DSP */
			ret = sof_ipc_tx_message(sdev->ipc,
						 config->hdr.cmd, config, size,
						 &reply, sizeof(reply));

			if (ret < 0) {
				dev_err(sdev->dev, "error: failed to set DAI config for direction:%d of HDA dai %d\n",
					sof_dai->comp_dai.direction,
					config->dai_index);

				return ret;
			}
		}
	}

	/*
	 * machine driver may define a dai link with playback and capture
	 * dai enabled, but the dai link in topology would support both, one
	 * or none of them. Here print a warning message to notify user
	 */
	if (!found) {
		dev_warn(sdev->dev, "warning: failed to find dai for dai link %s",
			 link->name);
	}

	return 0;
}

static int sof_link_hda_load(struct snd_soc_component *scomp, int index,
static int sof_link_hda_load(struct snd_soc_component *scomp, int index,
			     struct snd_soc_dai_link *link,
			     struct snd_soc_dai_link *link,
			     struct snd_soc_tplg_link_config *cfg,
			     struct snd_soc_tplg_link_config *cfg,
@@ -3104,7 +3044,9 @@ static int sof_link_hda_load(struct snd_soc_component *scomp, int index,
		return -EINVAL;
		return -EINVAL;
	}
	}


	ret = sof_link_hda_process(sdev, link, config);
	config->hda.link_dma_ch = DMA_CHAN_INVALID;

	ret = sof_set_dai_config(sdev, size, link, config);
	if (ret < 0)
	if (ret < 0)
		dev_err(scomp->dev, "error: failed to process hda dai link %s",
		dev_err(scomp->dev, "error: failed to process hda dai link %s",
			link->name);
			link->name);