On Wed, 2019-10-30 at 10:27 +0900, Kuninori Morimoto wrote:
From: Kuninori Morimoto kuninori.morimoto.gx@renesas.com
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@renesas.com
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,