On Wed, 2019-10-30 at 10:27 +0900, Kuninori Morimoto wrote: > From: Kuninori Morimoto <kuninori.morimoto.gx@xxxxxxxxxxx> > > ALSA SoC has 2 functions. > snd_soc_register_dai() is used from topology > snd_soc_register_dais() is used from snd_soc_add_component() > > In general, people think like _dai() is called from _dais() > with for loop. But in reality, these are very similar > but different implementation. > We shouldn't have duplicated and confusing implementation. > > snd_soc_register_dai() is now used from topology. > But to reduce duplicated code, it should be used from _dais(), too. > > Because of topology side specific reason, > it is calling snd_soc_dapm_new_dai_widgets(), > but it is not needed _dais() side. > > This patch factorizes snd_soc_register_dai() to > topology / _dais() common part, and topology specific part. > And do topology specific part at soc-topology. > > Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@xxxxxxxxxxx> > --- > include/sound/soc.h | 6 +++--- > sound/soc/soc-core.c | 25 ++++++------------------- > sound/soc/soc-topology.c | 17 ++++++++++++++++- > 3 files changed, 25 insertions(+), 23 deletions(-) > > diff --git a/include/sound/soc.h b/include/sound/soc.h > index 766fa81..4e38ee6 100644 > --- a/include/sound/soc.h > +++ b/include/sound/soc.h > @@ -1326,9 +1326,9 @@ struct snd_soc_dai_link > *snd_soc_find_dai_link(struct snd_soc_card *card, > int id, const char > *name, > const char > *stream_name); > > -int snd_soc_register_dai(struct snd_soc_component *component, > - struct snd_soc_dai_driver *dai_drv, > - bool legacy_dai_naming); > +struct snd_soc_dai *snd_soc_register_dai(struct snd_soc_component > *component, > + struct snd_soc_dai_driver > *dai_drv, > + bool legacy_dai_naming); > void snd_soc_unregister_dai(struct snd_soc_dai *dai); > > struct snd_soc_dai *snd_soc_find_dai( > diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c > index 7bd38fb..8045f4f 100644 > --- a/sound/soc/soc-core.c > +++ b/sound/soc/soc-core.c > @@ -2606,37 +2606,24 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dai); > * These DAIs's widgets will be freed in the card cleanup and the > DAIs > * will be freed in the component cleanup. > */ > -int snd_soc_register_dai(struct snd_soc_component *component, > - struct snd_soc_dai_driver *dai_drv, > - bool legacy_dai_naming) > +struct snd_soc_dai *snd_soc_register_dai(struct snd_soc_component > *component, > + struct snd_soc_dai_driver > *dai_drv, > + bool legacy_dai_naming) > { > - struct snd_soc_dapm_context *dapm = > - snd_soc_component_get_dapm(component); > struct snd_soc_dai *dai; > - int ret; > > if (dai_drv->dobj.type != SND_SOC_DOBJ_PCM) { > dev_err(component->dev, "Invalid dai type %d\n", > dai_drv->dobj.type); > - return -EINVAL; > + return NULL; > } > > lockdep_assert_held(&client_mutex); > dai = soc_add_dai(component, dai_drv, legacy_dai_naming); Maybe you could just say "return soc_add_dai(component, dai_drv, legacy_dai_naming);" here? > if (!dai) > - return -ENOMEM; > - > - /* > - * Create the DAI widgets here. After adding DAIs, topology may > - * also add routes that need these widgets as source or sink. > - */ > - ret = snd_soc_dapm_new_dai_widgets(dapm, dai); > - if (ret != 0) { > - dev_err(component->dev, > - "Failed to create DAI widgets %d\n", ret); > - } > + return NULL; > > - return ret; > + return dai; > } > EXPORT_SYMBOL_GPL(snd_soc_register_dai); > > diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c > index b6e1456..81d2af0 100644 > --- a/sound/soc/soc-topology.c > +++ b/sound/soc/soc-topology.c > @@ -1800,6 +1800,9 @@ static int soc_tplg_dai_create(struct soc_tplg > *tplg, > struct snd_soc_dai_driver *dai_drv; > struct snd_soc_pcm_stream *stream; > struct snd_soc_tplg_stream_caps *caps; > + struct snd_soc_dai *dai; > + struct snd_soc_dapm_context *dapm = > + snd_soc_component_get_dapm(tplg->comp); > int ret; > > dai_drv = kzalloc(sizeof(struct snd_soc_dai_driver), > GFP_KERNEL); > @@ -1842,7 +1845,19 @@ static int soc_tplg_dai_create(struct soc_tplg > *tplg, > list_add(&dai_drv->dobj.list, &tplg->comp->dobj_list); > > /* register the DAI to the component */ > - return snd_soc_register_dai(tplg->comp, dai_drv, false); > + dai = snd_soc_register_dai(tplg->comp, dai_drv, false); > + if (!dai) > + return -ENOMEM; > + > + /* Create the DAI widgets here */ > + ret = snd_soc_dapm_new_dai_widgets(dapm, dai); > + if (ret != 0) { > + dev_err(dai->dev, "Failed to create DAI widgets %d\n", > ret); > + snd_soc_unregister_dai(dai); > + return ret; > + } > + > + return ret; > } > > static void set_link_flags(struct snd_soc_dai_link *link, _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx https://mailman.alsa-project.org/mailman/listinfo/alsa-devel