mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
ASoC: add snd_soc_register_component()
Current ASoC has register function for platform/codec/dai/card, but doesn't have for cpu. It often produces confusion and fault on ASoC. As result of ASoC community discussion, we consider new struct snd_soc_component for CPU/CODEC, and will switch over to use it. This patch adds very basic struct snd_soc_component, and register function for it. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Acked-by: Liam Girdwood <liam.r.girdwood@linux.intel.com> Reviewed-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
f6161aa153
commit
030e79f658
@ -324,6 +324,8 @@ struct snd_soc_dai_link;
|
||||
struct snd_soc_platform_driver;
|
||||
struct snd_soc_codec;
|
||||
struct snd_soc_codec_driver;
|
||||
struct snd_soc_component;
|
||||
struct snd_soc_component_driver;
|
||||
struct soc_enum;
|
||||
struct snd_soc_jack;
|
||||
struct snd_soc_jack_zone;
|
||||
@ -377,6 +379,10 @@ int snd_soc_register_codec(struct device *dev,
|
||||
const struct snd_soc_codec_driver *codec_drv,
|
||||
struct snd_soc_dai_driver *dai_drv, int num_dai);
|
||||
void snd_soc_unregister_codec(struct device *dev);
|
||||
int 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_codec_volatile_register(struct snd_soc_codec *codec,
|
||||
unsigned int reg);
|
||||
int snd_soc_codec_readable_register(struct snd_soc_codec *codec,
|
||||
@ -841,6 +847,19 @@ struct snd_soc_platform {
|
||||
#endif
|
||||
};
|
||||
|
||||
struct snd_soc_component_driver {
|
||||
};
|
||||
|
||||
struct snd_soc_component {
|
||||
const char *name;
|
||||
int id;
|
||||
int num_dai;
|
||||
struct device *dev;
|
||||
struct list_head list;
|
||||
|
||||
const struct snd_soc_component_driver *driver;
|
||||
};
|
||||
|
||||
struct snd_soc_dai_link {
|
||||
/* config - must be set by machine driver */
|
||||
const char *name; /* Codec name */
|
||||
|
@ -58,6 +58,7 @@ static DEFINE_MUTEX(client_mutex);
|
||||
static LIST_HEAD(dai_list);
|
||||
static LIST_HEAD(platform_list);
|
||||
static LIST_HEAD(codec_list);
|
||||
static LIST_HEAD(component_list);
|
||||
|
||||
/*
|
||||
* This is a timeout to do a DAPM powerdown after a stream is closed().
|
||||
@ -4137,6 +4138,82 @@ found:
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_unregister_codec);
|
||||
|
||||
|
||||
/**
|
||||
* snd_soc_register_component - Register a component with the ASoC core
|
||||
*
|
||||
*/
|
||||
int 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)
|
||||
{
|
||||
struct snd_soc_component *cmpnt;
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "component register %s\n", dev_name(dev));
|
||||
|
||||
cmpnt = devm_kzalloc(dev, sizeof(*cmpnt), GFP_KERNEL);
|
||||
if (!cmpnt) {
|
||||
dev_err(dev, "ASoC: Failed to allocate memory\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
cmpnt->name = fmt_single_name(dev, &cmpnt->id);
|
||||
if (!cmpnt->name) {
|
||||
dev_err(dev, "ASoC: Failed to simplifying name\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
cmpnt->dev = dev;
|
||||
cmpnt->driver = cmpnt_drv;
|
||||
cmpnt->num_dai = num_dai;
|
||||
|
||||
ret = snd_soc_register_dais(dev, dai_drv, num_dai);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "ASoC: Failed to regster DAIs: %d\n", ret);
|
||||
goto error_component_name;
|
||||
}
|
||||
|
||||
mutex_lock(&client_mutex);
|
||||
list_add(&cmpnt->list, &component_list);
|
||||
mutex_unlock(&client_mutex);
|
||||
|
||||
dev_dbg(cmpnt->dev, "ASoC: Registered component '%s'\n", cmpnt->name);
|
||||
|
||||
return ret;
|
||||
|
||||
error_component_name:
|
||||
kfree(cmpnt->name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_unregister_component - Unregister a component from the ASoC core
|
||||
*
|
||||
*/
|
||||
void snd_soc_unregister_component(struct device *dev)
|
||||
{
|
||||
struct snd_soc_component *cmpnt;
|
||||
|
||||
list_for_each_entry(cmpnt, &component_list, list) {
|
||||
if (dev == cmpnt->dev)
|
||||
goto found;
|
||||
}
|
||||
return;
|
||||
|
||||
found:
|
||||
snd_soc_unregister_dais(dev, cmpnt->num_dai);
|
||||
|
||||
mutex_lock(&client_mutex);
|
||||
list_del(&cmpnt->list);
|
||||
mutex_unlock(&client_mutex);
|
||||
|
||||
dev_dbg(dev, "ASoC: Unregistered component '%s'\n", cmpnt->name);
|
||||
kfree(cmpnt->name);
|
||||
}
|
||||
|
||||
/* Retrieve a card's name from device tree */
|
||||
int snd_soc_of_parse_card_name(struct snd_soc_card *card,
|
||||
const char *propname)
|
||||
|
Loading…
x
Reference in New Issue
Block a user