Commit 743eb6c6 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Mark Brown

ASoC: SOF: topology: dynamically allocate and store DAI widget->private

For dspless mode, we need to allocate and store an 'sdai'
structure. The existing code allocate the data on the stack and does
not set the widget->private pointer.

This minor change should not have any impact on existing DAIs, even
when the DSP is used.
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@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-10-peter.ujfalusi@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent daa09d06
...@@ -46,7 +46,6 @@ static int sof_widget_free_unlocked(struct snd_sof_dev *sdev, ...@@ -46,7 +46,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); const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
struct snd_sof_pipeline *spipe = swidget->spipe; struct snd_sof_pipeline *spipe = swidget->spipe;
struct snd_sof_widget *pipe_widget;
int err = 0; int err = 0;
int ret; int ret;
...@@ -59,8 +58,6 @@ static int sof_widget_free_unlocked(struct snd_sof_dev *sdev, ...@@ -59,8 +58,6 @@ static int sof_widget_free_unlocked(struct snd_sof_dev *sdev,
if (--swidget->use_count) if (--swidget->use_count)
return 0; return 0;
pipe_widget = swidget->spipe->pipe_widget;
/* reset route setup status for all routes that contain this widget */ /* reset route setup status for all routes that contain this widget */
sof_reset_route_setup_status(sdev, swidget); sof_reset_route_setup_status(sdev, swidget);
...@@ -109,8 +106,9 @@ static int sof_widget_free_unlocked(struct snd_sof_dev *sdev, ...@@ -109,8 +106,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. * free the scheduler widget (same as pipe_widget) associated with the current swidget.
* skip for static pipelines * skip for static pipelines
*/ */
if (swidget->dynamic_pipeline_widget && swidget->id != snd_soc_dapm_scheduler) { if (swidget->spipe && swidget->dynamic_pipeline_widget &&
ret = sof_widget_free_unlocked(sdev, pipe_widget); swidget->id != snd_soc_dapm_scheduler) {
ret = sof_widget_free_unlocked(sdev, swidget->spipe->pipe_widget);
if (ret < 0 && !err) if (ret < 0 && !err)
err = ret; err = ret;
} }
......
...@@ -2356,23 +2356,29 @@ static int sof_dspless_widget_ready(struct snd_soc_component *scomp, int index, ...@@ -2356,23 +2356,29 @@ static int sof_dspless_widget_ready(struct snd_soc_component *scomp, int index,
if (WIDGET_IS_DAI(w->id)) { if (WIDGET_IS_DAI(w->id)) {
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp); struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
struct snd_sof_widget *swidget; struct snd_sof_widget *swidget;
struct snd_sof_dai dai; struct snd_sof_dai *sdai;
int ret; int ret;
swidget = kzalloc(sizeof(*swidget), GFP_KERNEL); swidget = kzalloc(sizeof(*swidget), GFP_KERNEL);
if (!swidget) if (!swidget)
return -ENOMEM; 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_connect_dai_widget(scomp, w, tw, sdai);
if (ret) { if (ret) {
kfree(swidget); kfree(swidget);
kfree(sdai);
return ret; return ret;
} }
swidget->scomp = scomp; swidget->scomp = scomp;
swidget->widget = w; swidget->widget = w;
swidget->private = sdai;
mutex_init(&swidget->setup_mutex); mutex_init(&swidget->setup_mutex);
w->dobj.private = swidget; w->dobj.private = swidget;
list_add(&swidget->list, &sdev->widget_list); list_add(&swidget->list, &sdev->widget_list);
...@@ -2396,6 +2402,7 @@ static int sof_dspless_widget_unload(struct snd_soc_component *scomp, ...@@ -2396,6 +2402,7 @@ static int sof_dspless_widget_unload(struct snd_soc_component *scomp,
/* remove and free swidget object */ /* remove and free swidget object */
list_del(&swidget->list); list_del(&swidget->list);
kfree(swidget->private);
kfree(swidget); kfree(swidget);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment