2013-09-04 23:37:34 +04:00
/*
* soc - devres . c - - ALSA SoC Audio Layer devres functions
*
* Copyright ( C ) 2013 Linaro Ltd
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation ; either version 2 of the License , or ( at your
* option ) any later version .
*/
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <sound/soc.h>
2013-11-28 11:50:32 +04:00
# include <sound/dmaengine_pcm.h>
2013-09-04 23:37:34 +04:00
static void devm_component_release ( struct device * dev , void * res )
{
snd_soc_unregister_component ( * ( struct device * * ) res ) ;
}
/**
* devm_snd_soc_register_component - resource managed component registration
* @ dev : Device used to manage component
* @ cmpnt_drv : Component driver
* @ dai_drv : DAI driver
* @ num_dai : Number of DAIs to register
*
* Register a component with automatic unregistration when the device is
* unregistered .
*/
int devm_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 device * * ptr ;
int ret ;
ptr = devres_alloc ( devm_component_release , sizeof ( * ptr ) , GFP_KERNEL ) ;
if ( ! ptr )
return - ENOMEM ;
ret = snd_soc_register_component ( dev , cmpnt_drv , dai_drv , num_dai ) ;
if ( ret = = 0 ) {
* ptr = dev ;
devres_add ( dev , ptr ) ;
} else {
devres_free ( ptr ) ;
}
return ret ;
}
EXPORT_SYMBOL_GPL ( devm_snd_soc_register_component ) ;
2013-09-16 21:02:05 +04:00
2014-04-16 16:46:11 +04:00
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
2015-01-28 06:44:27 +03:00
* @ platform_drv : platform to register
2014-04-16 16:46:11 +04:00
*
* 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 ;
}
2014-04-23 00:58:41 +04:00
EXPORT_SYMBOL_GPL ( devm_snd_soc_register_platform ) ;
2014-04-16 16:46:11 +04:00
2013-09-16 21:02:05 +04:00
static void devm_card_release ( struct device * dev , void * res )
{
snd_soc_unregister_card ( * ( struct snd_soc_card * * ) res ) ;
}
/**
* devm_snd_soc_register_card - resource managed card registration
* @ dev : Device used to manage card
* @ card : Card to register
*
* Register a card with automatic unregistration when the device is
* unregistered .
*/
int devm_snd_soc_register_card ( struct device * dev , struct snd_soc_card * card )
{
2013-12-02 09:26:50 +04:00
struct snd_soc_card * * ptr ;
2013-09-16 21:02:05 +04:00
int ret ;
ptr = devres_alloc ( devm_card_release , sizeof ( * ptr ) , GFP_KERNEL ) ;
if ( ! ptr )
return - ENOMEM ;
ret = snd_soc_register_card ( card ) ;
if ( ret = = 0 ) {
2013-12-02 09:26:50 +04:00
* ptr = card ;
2013-09-16 21:02:05 +04:00
devres_add ( dev , ptr ) ;
} else {
devres_free ( ptr ) ;
}
return ret ;
}
EXPORT_SYMBOL_GPL ( devm_snd_soc_register_card ) ;
2013-11-28 11:50:32 +04:00
# ifdef CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM
static void devm_dmaengine_pcm_release ( struct device * dev , void * res )
{
snd_dmaengine_pcm_unregister ( * ( struct device * * ) res ) ;
}
/**
* devm_snd_dmaengine_pcm_register - resource managed dmaengine PCM registration
* @ dev : The parent device for the PCM device
* @ config : Platform specific PCM configuration
* @ flags : Platform specific quirks
*
* Register a dmaengine based PCM device with automatic unregistration when the
* device is unregistered .
*/
int devm_snd_dmaengine_pcm_register ( struct device * dev ,
const struct snd_dmaengine_pcm_config * config , unsigned int flags )
{
struct device * * ptr ;
int ret ;
ptr = devres_alloc ( devm_dmaengine_pcm_release , sizeof ( * ptr ) , GFP_KERNEL ) ;
if ( ! ptr )
return - ENOMEM ;
ret = snd_dmaengine_pcm_register ( dev , config , flags ) ;
if ( ret = = 0 ) {
* ptr = dev ;
devres_add ( dev , ptr ) ;
} else {
devres_free ( ptr ) ;
}
return ret ;
}
EXPORT_SYMBOL_GPL ( devm_snd_dmaengine_pcm_register ) ;
# endif