This will be need for some audio card, which maybe using the simple card and the off-CODEC widgets is needed.
Signed-off-by: Xiubo Li Li.Xiubo@freescale.com --- include/sound/soc.h | 10 ++++++++++ sound/soc/soc-core.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+)
diff --git a/include/sound/soc.h b/include/sound/soc.h index 03ce45b..23f9572 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -326,6 +326,7 @@ struct snd_soc_platform_driver; struct snd_soc_codec; struct snd_soc_codec_driver; struct snd_soc_component; +struct snd_soc_widgets; struct snd_soc_component_driver; struct soc_enum; struct snd_soc_jack; @@ -385,6 +386,8 @@ int devm_snd_soc_register_component(struct device *dev, const struct snd_soc_component_driver *cmpnt_drv, struct snd_soc_dai_driver *dai_drv, int num_dai); void snd_soc_unregister_component(struct device *dev); +int snd_soc_register_widgets(struct snd_soc_widgets *wdg); +void snd_soc_unregister_widgets(struct snd_soc_widgets *wdg); int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, unsigned int reg); int snd_soc_codec_readable_register(struct snd_soc_codec *codec, @@ -664,6 +667,13 @@ struct snd_soc_component { const struct snd_soc_component_driver *driver; };
+struct snd_soc_widgets { + const char *name; + struct list_head list; + const struct snd_soc_dapm_widget *widgets; + unsigned int cnt; +}; + /* SoC Audio Codec device */ struct snd_soc_codec { const char *name; diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 3a128f0..9adcada 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -3821,6 +3821,45 @@ int snd_soc_unregister_card(struct snd_soc_card *card) } EXPORT_SYMBOL_GPL(snd_soc_unregister_card);
+static DEFINE_MUTEX(widgets_mutex); +static LIST_HEAD(widgets_list); +/** + * snd_soc_register_widgets - Register off codec widgets with + * the ASoC core + * + * @wdg: widgets to register + * + */ +int snd_soc_register_widgets(struct snd_soc_widgets *wdg) +{ + int ret; + + if (!wdg) + return -EINVAL; + + mutex_lock(&widgets_mutex); + list_add(&wdg->list, &widgets_list); + mutex_unlock(&widgets_mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(snd_soc_register_widgets); + +/** + * snd_soc_unregister_widgets - Unregister off codec widgets with + * the ASoC core + * + * @wdg: widgets to unregister + * + */ +void snd_soc_unregister_widgets(struct snd_soc_widgets *wdg) +{ + mutex_lock(&widgets_mutex); + list_del(&wdg->list); + mutex_unlock(&widgets_mutex); +} +EXPORT_SYMBOL_GPL(snd_soc_unregister_widgets); + /* * Simplify DAI link configuration by removing ".-1" from device names * and sanitizing names.