mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 19:07:52 +00:00
ASoC: SOF: Don't set up widgets during topology parsing
In preparation for supporting dynamic pipelines, move the widget setup, DAI config IPCs to the complete callback during topology loading. For current topology where all the pipelines are static, all the pipelines will be set up during complete. For topologies with dynamic and static pipelines, this will enable setting up only the static ones during topology loading. Reuse the sof_restore_pipelines() function for this purpose and rename it to sof_set_up_pipelines(). Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Link: https://lore.kernel.org/r/20210927120517.20505-9-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
5f3aad73fc
commit
1b7d57d717
4 changed files with 43 additions and 245 deletions
|
@ -157,7 +157,7 @@ static int sof_resume(struct device *dev, bool runtime_resume)
|
|||
}
|
||||
|
||||
/* restore pipelines */
|
||||
ret = sof_restore_pipelines(sdev->dev);
|
||||
ret = sof_set_up_pipelines(sdev->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev,
|
||||
"error: failed to restore pipeline after resume %d\n",
|
||||
|
|
|
@ -248,7 +248,7 @@ const struct sof_ipc_pipe_new *snd_sof_pipeline_find(struct snd_sof_dev *sdev,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int sof_restore_pipelines(struct device *dev)
|
||||
int sof_set_up_pipelines(struct device *dev)
|
||||
{
|
||||
struct snd_sof_dev *sdev = dev_get_drvdata(dev);
|
||||
struct snd_sof_widget *swidget;
|
||||
|
|
|
@ -242,7 +242,7 @@ int snd_sof_ipc_set_get_comp_data(struct snd_sof_control *scontrol,
|
|||
int sof_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, struct snd_pcm_hw_params *params);
|
||||
|
||||
/* PM */
|
||||
int sof_restore_pipelines(struct device *dev);
|
||||
int sof_set_up_pipelines(struct device *dev);
|
||||
void sof_tear_down_pipelines(struct device *dev);
|
||||
int sof_set_hw_params_upon_resume(struct device *dev);
|
||||
bool snd_sof_stream_suspend_ignored(struct snd_sof_dev *sdev);
|
||||
|
|
|
@ -1519,10 +1519,8 @@ static struct sof_ipc_comp *sof_comp_alloc(struct snd_sof_widget *swidget,
|
|||
static int sof_widget_load_dai(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r,
|
||||
struct snd_sof_dai *dai)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_comp_dai *comp_dai;
|
||||
size_t ipc_size = sizeof(*comp_dai);
|
||||
|
@ -1559,10 +1557,7 @@ static int sof_widget_load_dai(struct snd_soc_component *scomp, int index,
|
|||
swidget->widget->name, comp_dai->type, comp_dai->dai_index);
|
||||
sof_dbg_comp_config(scomp, &comp_dai->config);
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, comp_dai->comp.hdr.cmd,
|
||||
comp_dai, ipc_size, r, sizeof(*r));
|
||||
|
||||
if (ret == 0 && dai) {
|
||||
if (dai) {
|
||||
dai->scomp = scomp;
|
||||
|
||||
/*
|
||||
|
@ -1584,10 +1579,8 @@ static int sof_widget_load_dai(struct snd_soc_component *scomp, int index,
|
|||
|
||||
static int sof_widget_load_buffer(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_buffer *buffer;
|
||||
int ret;
|
||||
|
@ -1619,15 +1612,7 @@ static int sof_widget_load_buffer(struct snd_soc_component *scomp, int index,
|
|||
|
||||
swidget->private = buffer;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, buffer->comp.hdr.cmd, buffer,
|
||||
sizeof(*buffer), r, sizeof(*r));
|
||||
if (ret < 0) {
|
||||
dev_err(scomp->dev, "error: buffer %s load failed\n",
|
||||
swidget->widget->name);
|
||||
kfree(buffer);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* bind PCM ID to host component ID */
|
||||
|
@ -1656,10 +1641,8 @@ static int spcm_bind(struct snd_soc_component *scomp, struct snd_sof_pcm *spcm,
|
|||
static int sof_widget_load_pcm(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
enum sof_ipc_stream_direction dir,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_comp_host *host;
|
||||
size_t ipc_size = sizeof(*host);
|
||||
|
@ -1698,10 +1681,7 @@ static int sof_widget_load_pcm(struct snd_soc_component *scomp, int index,
|
|||
|
||||
swidget->private = host;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, host->comp.hdr.cmd, host,
|
||||
ipc_size, r, sizeof(*r));
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
return 0;
|
||||
err:
|
||||
kfree(host);
|
||||
return ret;
|
||||
|
@ -1730,8 +1710,7 @@ int sof_load_pipeline_ipc(struct device *dev,
|
|||
|
||||
static int sof_widget_load_pipeline(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_pipe_new *pipeline;
|
||||
|
@ -1786,10 +1765,7 @@ static int sof_widget_load_pipeline(struct snd_soc_component *scomp, int index,
|
|||
|
||||
swidget->private = pipeline;
|
||||
|
||||
/* send ipc's to create pipeline comp and power up schedule core */
|
||||
ret = sof_load_pipeline_ipc(scomp->dev, pipeline, r);
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
return 0;
|
||||
err:
|
||||
kfree(pipeline);
|
||||
return ret;
|
||||
|
@ -1801,10 +1777,8 @@ static int sof_widget_load_pipeline(struct snd_soc_component *scomp, int index,
|
|||
|
||||
static int sof_widget_load_mixer(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_comp_mixer *mixer;
|
||||
size_t ipc_size = sizeof(*mixer);
|
||||
|
@ -1833,12 +1807,7 @@ static int sof_widget_load_mixer(struct snd_soc_component *scomp, int index,
|
|||
|
||||
swidget->private = mixer;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, mixer->comp.hdr.cmd, mixer,
|
||||
ipc_size, r, sizeof(*r));
|
||||
if (ret < 0)
|
||||
kfree(mixer);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1846,10 +1815,8 @@ static int sof_widget_load_mixer(struct snd_soc_component *scomp, int index,
|
|||
*/
|
||||
static int sof_widget_load_mux(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_comp_mux *mux;
|
||||
size_t ipc_size = sizeof(*mux);
|
||||
|
@ -1878,12 +1845,7 @@ static int sof_widget_load_mux(struct snd_soc_component *scomp, int index,
|
|||
|
||||
swidget->private = mux;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, mux->comp.hdr.cmd, mux,
|
||||
ipc_size, r, sizeof(*r));
|
||||
if (ret < 0)
|
||||
kfree(mux);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1892,8 +1854,7 @@ static int sof_widget_load_mux(struct snd_soc_component *scomp, int index,
|
|||
|
||||
static int sof_widget_load_pga(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
|
@ -1953,10 +1914,7 @@ static int sof_widget_load_pga(struct snd_soc_component *scomp, int index,
|
|||
}
|
||||
}
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, volume->comp.hdr.cmd, volume,
|
||||
ipc_size, r, sizeof(*r));
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
return 0;
|
||||
err:
|
||||
kfree(volume);
|
||||
return ret;
|
||||
|
@ -1968,10 +1926,8 @@ static int sof_widget_load_pga(struct snd_soc_component *scomp, int index,
|
|||
|
||||
static int sof_widget_load_src(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_comp_src *src;
|
||||
size_t ipc_size = sizeof(*src);
|
||||
|
@ -2010,10 +1966,7 @@ static int sof_widget_load_src(struct snd_soc_component *scomp, int index,
|
|||
|
||||
swidget->private = src;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, src->comp.hdr.cmd, src,
|
||||
ipc_size, r, sizeof(*r));
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
return 0;
|
||||
err:
|
||||
kfree(src);
|
||||
return ret;
|
||||
|
@ -2025,10 +1978,8 @@ static int sof_widget_load_src(struct snd_soc_component *scomp, int index,
|
|||
|
||||
static int sof_widget_load_asrc(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_comp_asrc *asrc;
|
||||
size_t ipc_size = sizeof(*asrc);
|
||||
|
@ -2069,10 +2020,7 @@ static int sof_widget_load_asrc(struct snd_soc_component *scomp, int index,
|
|||
|
||||
swidget->private = asrc;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, asrc->comp.hdr.cmd, asrc,
|
||||
ipc_size, r, sizeof(*r));
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
return 0;
|
||||
err:
|
||||
kfree(asrc);
|
||||
return ret;
|
||||
|
@ -2084,10 +2032,8 @@ static int sof_widget_load_asrc(struct snd_soc_component *scomp, int index,
|
|||
|
||||
static int sof_widget_load_siggen(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_comp_tone *tone;
|
||||
size_t ipc_size = sizeof(*tone);
|
||||
|
@ -2126,10 +2072,7 @@ static int sof_widget_load_siggen(struct snd_soc_component *scomp, int index,
|
|||
|
||||
swidget->private = tone;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, tone->comp.hdr.cmd, tone,
|
||||
ipc_size, r, sizeof(*r));
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
return 0;
|
||||
err:
|
||||
kfree(tone);
|
||||
return ret;
|
||||
|
@ -2211,10 +2154,8 @@ static int sof_get_control_data(struct snd_soc_component *scomp,
|
|||
static int sof_process_load(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r,
|
||||
int type)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_dapm_widget *widget = swidget->widget;
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_comp_process *process;
|
||||
|
@ -2288,33 +2229,6 @@ static int sof_process_load(struct snd_soc_component *scomp, int index,
|
|||
|
||||
process->size = ipc_data_size;
|
||||
swidget->private = process;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, process->comp.hdr.cmd, process,
|
||||
ipc_size, r, sizeof(*r));
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(scomp->dev, "error: create process failed\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* we sent the data in single message so return */
|
||||
if (ipc_data_size)
|
||||
goto out;
|
||||
|
||||
/* send control data with large message supported method */
|
||||
for (i = 0; i < widget->num_kcontrols; i++) {
|
||||
wdata[i].control->readback_offset = 0;
|
||||
ret = snd_sof_ipc_set_get_comp_data(wdata[i].control,
|
||||
wdata[i].ipc_cmd,
|
||||
wdata[i].ctrl_type,
|
||||
wdata[i].control->cmd,
|
||||
true);
|
||||
if (ret != 0) {
|
||||
dev_err(scomp->dev, "error: send control failed\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
if (ret < 0)
|
||||
kfree(process);
|
||||
|
@ -2330,8 +2244,7 @@ static int sof_process_load(struct snd_soc_component *scomp, int index,
|
|||
|
||||
static int sof_widget_load_process(struct snd_soc_component *scomp, int index,
|
||||
struct snd_sof_widget *swidget,
|
||||
struct snd_soc_tplg_dapm_widget *tw,
|
||||
struct sof_ipc_comp_reply *r)
|
||||
struct snd_soc_tplg_dapm_widget *tw)
|
||||
{
|
||||
struct snd_soc_tplg_private *private = &tw->priv;
|
||||
struct sof_ipc_comp_process config;
|
||||
|
@ -2357,8 +2270,7 @@ static int sof_widget_load_process(struct snd_soc_component *scomp, int index,
|
|||
}
|
||||
|
||||
/* now load process specific data and send IPC */
|
||||
ret = sof_process_load(scomp, index, swidget, tw, r,
|
||||
find_process_comp_type(config.type));
|
||||
ret = sof_process_load(scomp, index, swidget, tw, find_process_comp_type(config.type));
|
||||
if (ret < 0) {
|
||||
dev_err(scomp->dev, "error: process loading failed\n");
|
||||
return ret;
|
||||
|
@ -2407,8 +2319,6 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
|
|||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_sof_widget *swidget;
|
||||
struct snd_sof_dai *dai;
|
||||
struct sof_ipc_comp_reply reply;
|
||||
struct snd_sof_control *scontrol;
|
||||
struct sof_ipc_comp comp = {
|
||||
.core = SOF_DSP_PRIMARY_CORE,
|
||||
};
|
||||
|
@ -2425,7 +2335,6 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
|
|||
swidget->id = w->id;
|
||||
swidget->pipeline_id = index;
|
||||
swidget->private = NULL;
|
||||
memset(&reply, 0, sizeof(reply));
|
||||
|
||||
dev_dbg(scomp->dev, "tplg: ready widget id %d pipe %d type %d name : %s stream %s\n",
|
||||
swidget->comp_id, index, swidget->id, tw->name,
|
||||
|
@ -2444,14 +2353,6 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
|
|||
|
||||
swidget->core = comp.core;
|
||||
|
||||
/* default is primary core, safe to call for already enabled cores */
|
||||
ret = sof_core_enable(sdev, comp.core);
|
||||
if (ret < 0) {
|
||||
dev_err(scomp->dev, "error: enable core: %d\n", ret);
|
||||
kfree(swidget);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = sof_parse_tokens(scomp, &swidget->comp_ext, comp_ext_tokens,
|
||||
ARRAY_SIZE(comp_ext_tokens), tw->priv.array,
|
||||
le32_to_cpu(tw->priv.size));
|
||||
|
@ -2472,7 +2373,7 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = sof_widget_load_dai(scomp, index, swidget, tw, &reply, dai);
|
||||
ret = sof_widget_load_dai(scomp, index, swidget, tw, dai);
|
||||
if (ret == 0) {
|
||||
sof_connect_dai_widget(scomp, w, tw, dai);
|
||||
list_add(&dai->list, &sdev->dai_list);
|
||||
|
@ -2482,47 +2383,40 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
|
|||
}
|
||||
break;
|
||||
case snd_soc_dapm_mixer:
|
||||
ret = sof_widget_load_mixer(scomp, index, swidget, tw, &reply);
|
||||
ret = sof_widget_load_mixer(scomp, index, swidget, tw);
|
||||
break;
|
||||
case snd_soc_dapm_pga:
|
||||
ret = sof_widget_load_pga(scomp, index, swidget, tw, &reply);
|
||||
/* Find scontrol for this pga and set readback offset*/
|
||||
list_for_each_entry(scontrol, &sdev->kcontrol_list, list) {
|
||||
if (scontrol->comp_id == swidget->comp_id) {
|
||||
scontrol->readback_offset = reply.offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret = sof_widget_load_pga(scomp, index, swidget, tw);
|
||||
break;
|
||||
case snd_soc_dapm_buffer:
|
||||
ret = sof_widget_load_buffer(scomp, index, swidget, tw, &reply);
|
||||
ret = sof_widget_load_buffer(scomp, index, swidget, tw);
|
||||
break;
|
||||
case snd_soc_dapm_scheduler:
|
||||
ret = sof_widget_load_pipeline(scomp, index, swidget, tw, &reply);
|
||||
ret = sof_widget_load_pipeline(scomp, index, swidget, tw);
|
||||
break;
|
||||
case snd_soc_dapm_aif_out:
|
||||
ret = sof_widget_load_pcm(scomp, index, swidget,
|
||||
SOF_IPC_STREAM_CAPTURE, tw, &reply);
|
||||
SOF_IPC_STREAM_CAPTURE, tw);
|
||||
break;
|
||||
case snd_soc_dapm_aif_in:
|
||||
ret = sof_widget_load_pcm(scomp, index, swidget,
|
||||
SOF_IPC_STREAM_PLAYBACK, tw, &reply);
|
||||
SOF_IPC_STREAM_PLAYBACK, tw);
|
||||
break;
|
||||
case snd_soc_dapm_src:
|
||||
ret = sof_widget_load_src(scomp, index, swidget, tw, &reply);
|
||||
ret = sof_widget_load_src(scomp, index, swidget, tw);
|
||||
break;
|
||||
case snd_soc_dapm_asrc:
|
||||
ret = sof_widget_load_asrc(scomp, index, swidget, tw, &reply);
|
||||
ret = sof_widget_load_asrc(scomp, index, swidget, tw);
|
||||
break;
|
||||
case snd_soc_dapm_siggen:
|
||||
ret = sof_widget_load_siggen(scomp, index, swidget, tw, &reply);
|
||||
ret = sof_widget_load_siggen(scomp, index, swidget, tw);
|
||||
break;
|
||||
case snd_soc_dapm_effect:
|
||||
ret = sof_widget_load_process(scomp, index, swidget, tw, &reply);
|
||||
ret = sof_widget_load_process(scomp, index, swidget, tw);
|
||||
break;
|
||||
case snd_soc_dapm_mux:
|
||||
case snd_soc_dapm_demux:
|
||||
ret = sof_widget_load_mux(scomp, index, swidget, tw, &reply);
|
||||
ret = sof_widget_load_mux(scomp, index, swidget, tw);
|
||||
break;
|
||||
case snd_soc_dapm_switch:
|
||||
case snd_soc_dapm_dai_link:
|
||||
|
@ -2533,12 +2427,12 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
|
|||
}
|
||||
|
||||
/* check IPC reply */
|
||||
if (ret < 0 || reply.rhdr.error < 0) {
|
||||
if (ret < 0) {
|
||||
dev_err(scomp->dev,
|
||||
"error: DSP failed to add widget id %d type %d name : %s stream %s reply %d\n",
|
||||
"error: failed to add widget id %d type %d name : %s stream %s\n",
|
||||
tw->shift, swidget->id, tw->name,
|
||||
strnlen(tw->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0
|
||||
? tw->sname : "none", reply.rhdr.error);
|
||||
? tw->sname : "none");
|
||||
kfree(swidget);
|
||||
return ret;
|
||||
}
|
||||
|
@ -2844,9 +2738,6 @@ static int sof_set_dai_config_multi(struct snd_sof_dev *sdev, u32 size,
|
|||
continue;
|
||||
|
||||
if (strcmp(link->name, dai->name) == 0) {
|
||||
struct sof_ipc_reply reply;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* the same dai config will be applied to all DAIs in
|
||||
* the same dai link. We have to ensure that the ipc
|
||||
|
@ -2858,18 +2749,6 @@ static int sof_set_dai_config_multi(struct snd_sof_dev *sdev, u32 size,
|
|||
|
||||
dev_dbg(sdev->dev, "set DAI config for %s index %d\n",
|
||||
dai->name, config[curr_conf].dai_index);
|
||||
/* send message to DSP */
|
||||
ret = sof_ipc_tx_message(sdev->ipc,
|
||||
config[curr_conf].hdr.cmd,
|
||||
&config[curr_conf], size,
|
||||
&reply, sizeof(reply));
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev,
|
||||
"error: failed to set DAI config for %s index %d\n",
|
||||
dai->name, config[curr_conf].dai_index);
|
||||
return ret;
|
||||
}
|
||||
|
||||
dai->number_configs = num_conf;
|
||||
dai->current_config = curr_conf;
|
||||
|
@ -3399,7 +3278,6 @@ static int sof_route_load(struct snd_soc_component *scomp, int index,
|
|||
struct snd_sof_widget *source_swidget, *sink_swidget;
|
||||
struct snd_soc_dobj *dobj = &route->dobj;
|
||||
struct snd_sof_route *sroute;
|
||||
struct sof_ipc_reply reply;
|
||||
int ret = 0;
|
||||
|
||||
/* allocate memory for sroute and connect */
|
||||
|
@ -3474,36 +3352,11 @@ static int sof_route_load(struct snd_soc_component *scomp, int index,
|
|||
route->source, route->sink);
|
||||
goto err;
|
||||
} else {
|
||||
ret = sof_ipc_tx_message(sdev->ipc,
|
||||
connect->hdr.cmd,
|
||||
connect, sizeof(*connect),
|
||||
&reply, sizeof(reply));
|
||||
|
||||
/* check IPC return value */
|
||||
if (ret < 0) {
|
||||
dev_err(scomp->dev, "error: failed to add route sink %s control %s source %s\n",
|
||||
route->sink,
|
||||
route->control ? route->control : "none",
|
||||
route->source);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* check IPC reply */
|
||||
if (reply.error < 0) {
|
||||
dev_err(scomp->dev, "error: DSP failed to add route sink %s control %s source %s result %d\n",
|
||||
route->sink,
|
||||
route->control ? route->control : "none",
|
||||
route->source, reply.error);
|
||||
ret = reply.error;
|
||||
goto err;
|
||||
}
|
||||
|
||||
sroute->route = route;
|
||||
dobj->private = sroute;
|
||||
sroute->private = connect;
|
||||
sroute->src_widget = source_swidget;
|
||||
sroute->sink_widget = sink_swidget;
|
||||
sroute->setup = true;
|
||||
|
||||
/* add route to route list */
|
||||
list_add(&sroute->list, &sdev->route_list);
|
||||
|
@ -3517,50 +3370,6 @@ static int sof_route_load(struct snd_soc_component *scomp, int index,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Function to set the initial value of SOF kcontrols.
|
||||
* The value will be stored in scontrol->control_data
|
||||
*/
|
||||
static int snd_sof_cache_kcontrol_val(struct snd_soc_component *scomp)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_sof_control *scontrol = NULL;
|
||||
int ipc_cmd, ctrl_type;
|
||||
int ret = 0;
|
||||
|
||||
list_for_each_entry(scontrol, &sdev->kcontrol_list, list) {
|
||||
|
||||
/* notify DSP of kcontrol values */
|
||||
switch (scontrol->cmd) {
|
||||
case SOF_CTRL_CMD_VOLUME:
|
||||
case SOF_CTRL_CMD_ENUM:
|
||||
case SOF_CTRL_CMD_SWITCH:
|
||||
ipc_cmd = SOF_IPC_COMP_GET_VALUE;
|
||||
ctrl_type = SOF_CTRL_TYPE_VALUE_CHAN_GET;
|
||||
break;
|
||||
case SOF_CTRL_CMD_BINARY:
|
||||
ipc_cmd = SOF_IPC_COMP_GET_DATA;
|
||||
ctrl_type = SOF_CTRL_TYPE_DATA_GET;
|
||||
break;
|
||||
default:
|
||||
dev_err(scomp->dev,
|
||||
"error: Invalid scontrol->cmd: %d\n",
|
||||
scontrol->cmd);
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = snd_sof_ipc_set_get_comp_data(scontrol,
|
||||
ipc_cmd, ctrl_type,
|
||||
scontrol->cmd,
|
||||
false);
|
||||
if (ret < 0) {
|
||||
dev_warn(scomp->dev,
|
||||
"error: kcontrol value get for widget: %d\n",
|
||||
scontrol->comp_id);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int snd_sof_complete_pipeline(struct device *dev,
|
||||
struct snd_sof_widget *swidget)
|
||||
{
|
||||
|
@ -3626,19 +3435,10 @@ static int sof_complete(struct snd_soc_component *scomp)
|
|||
struct snd_sof_widget *swidget, *comp_swidget;
|
||||
int ret;
|
||||
|
||||
/* some widget types require completion notificattion */
|
||||
/* set the pipe_widget and apply the dynamic_pipeline_widget_flag */
|
||||
list_for_each_entry(swidget, &sdev->widget_list, list) {
|
||||
if (swidget->complete)
|
||||
continue;
|
||||
|
||||
switch (swidget->id) {
|
||||
case snd_soc_dapm_scheduler:
|
||||
ret = snd_sof_complete_pipeline(scomp->dev, swidget);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
swidget->complete = ret;
|
||||
|
||||
/*
|
||||
* Apply the dynamic_pipeline_widget flag and set the pipe_widget field
|
||||
* for all widgets that have the same pipeline ID as the scheduler widget
|
||||
|
@ -3654,11 +3454,9 @@ static int sof_complete(struct snd_soc_component *scomp)
|
|||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* cache initial values of SOF kcontrols by reading DSP value over
|
||||
* IPC. It may be overwritten by alsa-mixer after booting up
|
||||
*/
|
||||
return snd_sof_cache_kcontrol_val(scomp);
|
||||
|
||||
/* set up static pipelines */
|
||||
return sof_set_up_pipelines(scomp->dev);
|
||||
}
|
||||
|
||||
/* manifest - optional to inform component of manifest */
|
||||
|
|
Loading…
Reference in a new issue