mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
		
							parent
							
								
									c9eaa447e7
								
							
						
					
					
						commit
						8931bf6208
					
				
					 2 changed files with 36 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -377,6 +377,8 @@ int snd_soc_resume(struct device *dev);
 | 
			
		|||
int snd_soc_poweroff(struct device *dev);
 | 
			
		||||
int snd_soc_register_platform(struct device *dev,
 | 
			
		||||
		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);
 | 
			
		||||
int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
 | 
			
		||||
		const struct snd_soc_platform_driver *platform_drv);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,6 +52,40 @@ int devm_snd_soc_register_component(struct device *dev,
 | 
			
		|||
}
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
	snd_soc_unregister_card(*(struct snd_soc_card **)res);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue