mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 15:41:52 +02:00
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: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Link: https://msgid.link/r/20240213101247.28887-10-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
daa09d0615
commit
743eb6c68d
|
|
@ -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);
|
||||
struct snd_sof_pipeline *spipe = swidget->spipe;
|
||||
struct snd_sof_widget *pipe_widget;
|
||||
int err = 0;
|
||||
int ret;
|
||||
|
||||
|
|
@ -59,8 +58,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);
|
||||
|
||||
|
|
@ -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.
|
||||
* 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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2356,23 +2356,29 @@ static int sof_dspless_widget_ready(struct snd_soc_component *scomp, int index,
|
|||
if (WIDGET_IS_DAI(w->id)) {
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
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_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);
|
||||
|
|
@ -2396,6 +2402,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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user