mirror of https://gitee.com/openkylin/linux.git
ASoC: Add codec registration API
Another part of the backporting of Liam's ASoC v2 work. Using this is more complicated than the other registration types since currently the codec is instantiated during the probe of the ASoC device so we can't currently readily wait for the codec to register. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
1e5fa31f96
commit
0d0cf00a7f
|
@ -161,6 +161,8 @@ extern struct snd_ac97_bus_ops soc_ac97_ops;
|
||||||
|
|
||||||
int snd_soc_register_platform(struct snd_soc_platform *platform);
|
int snd_soc_register_platform(struct snd_soc_platform *platform);
|
||||||
void snd_soc_unregister_platform(struct snd_soc_platform *platform);
|
void snd_soc_unregister_platform(struct snd_soc_platform *platform);
|
||||||
|
int snd_soc_register_codec(struct snd_soc_codec *codec);
|
||||||
|
void snd_soc_unregister_codec(struct snd_soc_codec *codec);
|
||||||
|
|
||||||
/* pcm <-> DAI connect */
|
/* pcm <-> DAI connect */
|
||||||
void snd_soc_free_pcms(struct snd_soc_device *socdev);
|
void snd_soc_free_pcms(struct snd_soc_device *socdev);
|
||||||
|
@ -247,6 +249,9 @@ struct snd_soc_codec {
|
||||||
char *name;
|
char *name;
|
||||||
struct module *owner;
|
struct module *owner;
|
||||||
struct mutex mutex;
|
struct mutex mutex;
|
||||||
|
struct device *dev;
|
||||||
|
|
||||||
|
struct list_head list;
|
||||||
|
|
||||||
/* callbacks */
|
/* callbacks */
|
||||||
int (*set_bias_level)(struct snd_soc_codec *,
|
int (*set_bias_level)(struct snd_soc_codec *,
|
||||||
|
|
|
@ -47,6 +47,7 @@ static DEFINE_MUTEX(client_mutex);
|
||||||
static LIST_HEAD(card_list);
|
static LIST_HEAD(card_list);
|
||||||
static LIST_HEAD(dai_list);
|
static LIST_HEAD(dai_list);
|
||||||
static LIST_HEAD(platform_list);
|
static LIST_HEAD(platform_list);
|
||||||
|
static LIST_HEAD(codec_list);
|
||||||
|
|
||||||
static int snd_soc_register_card(struct snd_soc_card *card);
|
static int snd_soc_register_card(struct snd_soc_card *card);
|
||||||
static int snd_soc_unregister_card(struct snd_soc_card *card);
|
static int snd_soc_unregister_card(struct snd_soc_card *card);
|
||||||
|
@ -2224,6 +2225,48 @@ void snd_soc_unregister_platform(struct snd_soc_platform *platform)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(snd_soc_unregister_platform);
|
EXPORT_SYMBOL_GPL(snd_soc_unregister_platform);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* snd_soc_register_codec - Register a codec with the ASoC core
|
||||||
|
*
|
||||||
|
* @param codec codec to register
|
||||||
|
*/
|
||||||
|
int snd_soc_register_codec(struct snd_soc_codec *codec)
|
||||||
|
{
|
||||||
|
if (!codec->name)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* The device should become mandatory over time */
|
||||||
|
if (!codec->dev)
|
||||||
|
printk(KERN_WARNING "No device for codec %s\n", codec->name);
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&codec->list);
|
||||||
|
|
||||||
|
mutex_lock(&client_mutex);
|
||||||
|
list_add(&codec->list, &codec_list);
|
||||||
|
snd_soc_instantiate_cards();
|
||||||
|
mutex_unlock(&client_mutex);
|
||||||
|
|
||||||
|
pr_debug("Registered codec '%s'\n", codec->name);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(snd_soc_register_codec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* snd_soc_unregister_codec - Unregister a codec from the ASoC core
|
||||||
|
*
|
||||||
|
* @param codec codec to unregister
|
||||||
|
*/
|
||||||
|
void snd_soc_unregister_codec(struct snd_soc_codec *codec)
|
||||||
|
{
|
||||||
|
mutex_lock(&client_mutex);
|
||||||
|
list_del(&codec->list);
|
||||||
|
mutex_unlock(&client_mutex);
|
||||||
|
|
||||||
|
pr_debug("Unregistered codec '%s'\n", codec->name);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(snd_soc_unregister_codec);
|
||||||
|
|
||||||
static int __init snd_soc_init(void)
|
static int __init snd_soc_init(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
|
|
Loading…
Reference in New Issue