提交 71a45cda 编写于 作者: L Lars-Peter Clausen 提交者: Mark Brown

ASoC: Add snd_soc_{add, remove}_platform

snd_soc_{add,remove}_platform are similar to snd_soc_register_platform and
snd_soc_unregister_platform with the difference that they won't allocate and
free the snd_soc_platform structure.

Also add snd_soc_lookup_platform which looks up a platform by the device it has
been registered for.
Signed-off-by: NLars-Peter Clausen <lars@metafoo.de>
Tested-by: NStephen Warren <swarren@nvidia.com>
Tested-by: NShawn Guo <shawn.guo@linaro.org>
Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
上级 8b1b054f
...@@ -373,6 +373,10 @@ int snd_soc_poweroff(struct device *dev); ...@@ -373,6 +373,10 @@ int snd_soc_poweroff(struct device *dev);
int snd_soc_register_platform(struct device *dev, int snd_soc_register_platform(struct device *dev,
const struct snd_soc_platform_driver *platform_drv); const struct snd_soc_platform_driver *platform_drv);
void snd_soc_unregister_platform(struct device *dev); void snd_soc_unregister_platform(struct device *dev);
int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
const struct snd_soc_platform_driver *platform_drv);
void snd_soc_remove_platform(struct snd_soc_platform *platform);
struct snd_soc_platform *snd_soc_lookup_platform(struct device *dev);
int snd_soc_register_codec(struct device *dev, int snd_soc_register_codec(struct device *dev,
const struct snd_soc_codec_driver *codec_drv, const struct snd_soc_codec_driver *codec_drv,
struct snd_soc_dai_driver *dai_drv, int num_dai); struct snd_soc_dai_driver *dai_drv, int num_dai);
......
...@@ -3901,21 +3901,14 @@ void snd_soc_unregister_dais(struct device *dev, size_t count) ...@@ -3901,21 +3901,14 @@ void snd_soc_unregister_dais(struct device *dev, size_t count)
EXPORT_SYMBOL_GPL(snd_soc_unregister_dais); EXPORT_SYMBOL_GPL(snd_soc_unregister_dais);
/** /**
* snd_soc_register_platform - Register a platform with the ASoC core * snd_soc_add_platform - Add a platform to the ASoC core
* * @dev: The parent device for the platform
* @platform: platform to register * @platform: The platform to add
* @platform_driver: The driver for the platform
*/ */
int snd_soc_register_platform(struct device *dev, int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
const struct snd_soc_platform_driver *platform_drv) const struct snd_soc_platform_driver *platform_drv)
{ {
struct snd_soc_platform *platform;
dev_dbg(dev, "ASoC: platform register %s\n", dev_name(dev));
platform = kzalloc(sizeof(struct snd_soc_platform), GFP_KERNEL);
if (platform == NULL)
return -ENOMEM;
/* create platform component name */ /* create platform component name */
platform->name = fmt_single_name(dev, &platform->id); platform->name = fmt_single_name(dev, &platform->id);
if (platform->name == NULL) { if (platform->name == NULL) {
...@@ -3938,30 +3931,76 @@ int snd_soc_register_platform(struct device *dev, ...@@ -3938,30 +3931,76 @@ int snd_soc_register_platform(struct device *dev,
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(snd_soc_register_platform); EXPORT_SYMBOL_GPL(snd_soc_add_platform);
/** /**
* snd_soc_unregister_platform - Unregister a platform from the ASoC core * snd_soc_register_platform - Register a platform with the ASoC core
* *
* @platform: platform to unregister * @platform: platform to register
*/ */
void snd_soc_unregister_platform(struct device *dev) int snd_soc_register_platform(struct device *dev,
const struct snd_soc_platform_driver *platform_drv)
{ {
struct snd_soc_platform *platform; struct snd_soc_platform *platform;
int ret;
list_for_each_entry(platform, &platform_list, list) { dev_dbg(dev, "ASoC: platform register %s\n", dev_name(dev));
if (dev == platform->dev)
goto found;
}
return;
found: platform = kzalloc(sizeof(struct snd_soc_platform), GFP_KERNEL);
if (platform == NULL)
return -ENOMEM;
ret = snd_soc_add_platform(dev, platform, platform_drv);
if (ret)
kfree(platform);
return ret;
}
EXPORT_SYMBOL_GPL(snd_soc_register_platform);
/**
* snd_soc_remove_platform - Remove a platform from the ASoC core
* @platform: the platform to remove
*/
void snd_soc_remove_platform(struct snd_soc_platform *platform)
{
mutex_lock(&client_mutex); mutex_lock(&client_mutex);
list_del(&platform->list); list_del(&platform->list);
mutex_unlock(&client_mutex); mutex_unlock(&client_mutex);
dev_dbg(dev, "ASoC: Unregistered platform '%s'\n", platform->name); dev_dbg(platform->dev, "ASoC: Unregistered platform '%s'\n",
platform->name);
kfree(platform->name); kfree(platform->name);
}
EXPORT_SYMBOL_GPL(snd_soc_remove_platform);
struct snd_soc_platform *snd_soc_lookup_platform(struct device *dev)
{
struct snd_soc_platform *platform;
list_for_each_entry(platform, &platform_list, list) {
if (dev == platform->dev)
return platform;
}
return NULL;
}
EXPORT_SYMBOL_GPL(snd_soc_lookup_platform);
/**
* snd_soc_unregister_platform - Unregister a platform from the ASoC core
*
* @platform: platform to unregister
*/
void snd_soc_unregister_platform(struct device *dev)
{
struct snd_soc_platform *platform;
platform = snd_soc_lookup_platform(dev);
if (!platform)
return;
snd_soc_remove_platform(platform);
kfree(platform); kfree(platform);
} }
EXPORT_SYMBOL_GPL(snd_soc_unregister_platform); EXPORT_SYMBOL_GPL(snd_soc_unregister_platform);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册