Commit 8931bf62 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown

ASoC: Add resource managed snd_soc_register_platform()

Simplify error handling and remove repetitive (and rarely executed) code
for unregistration by providing a devm_snd_soc_register_platform()
platform.
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent c9eaa447
...@@ -377,6 +377,8 @@ int snd_soc_resume(struct device *dev); ...@@ -377,6 +377,8 @@ int snd_soc_resume(struct device *dev);
int snd_soc_poweroff(struct device *dev); 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);
int devm_snd_soc_register_platform(struct device *dev,
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, 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);
......
...@@ -52,6 +52,40 @@ int devm_snd_soc_register_component(struct device *dev, ...@@ -52,6 +52,40 @@ int devm_snd_soc_register_component(struct device *dev,
} }
EXPORT_SYMBOL_GPL(devm_snd_soc_register_component); EXPORT_SYMBOL_GPL(devm_snd_soc_register_component);
static void devm_platform_release(struct device *dev, void *res)
{
snd_soc_unregister_platform(*(struct device **)res);
}
/**
* devm_snd_soc_register_platform - resource managed platform registration
* @dev: Device used to manage platform
* @platform: platform to register
*
* Register a platform driver with automatic unregistration when the device is
* unregistered.
*/
int devm_snd_soc_register_platform(struct device *dev,
const struct snd_soc_platform_driver *platform_drv)
{
struct device **ptr;
int ret;
ptr = devres_alloc(devm_platform_release, sizeof(*ptr), GFP_KERNEL);
if (!ptr)
return -ENOMEM;
ret = snd_soc_register_platform(dev, platform_drv);
if (ret == 0) {
*ptr = dev;
devres_add(dev, ptr);
} else {
devres_free(ptr);
}
return ret;
}
static void devm_card_release(struct device *dev, void *res) static void devm_card_release(struct device *dev, void *res)
{ {
snd_soc_unregister_card(*(struct snd_soc_card **)res); snd_soc_unregister_card(*(struct snd_soc_card **)res);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment