2008-09-27 16:57:26 +08:00
/*
* ad73311 . c - - ALSA Soc AD73311 codec support
*
* Copyright : Analog Device Inc .
* Author : Cliff Cai < cliff . cai @ analog . com >
*
* 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/init.h>
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/device.h>
# include <sound/core.h>
# include <sound/pcm.h>
# include <sound/ac97_codec.h>
# include <sound/initval.h>
# include <sound/soc.h>
# include "ad73311.h"
struct snd_soc_dai ad73311_dai = {
. name = " AD73311 " ,
. playback = {
. stream_name = " Playback " ,
. channels_min = 1 ,
. channels_max = 1 ,
. rates = SNDRV_PCM_RATE_8000 ,
. formats = SNDRV_PCM_FMTBIT_S16_LE , } ,
. capture = {
. stream_name = " Capture " ,
. channels_min = 1 ,
. channels_max = 1 ,
. rates = SNDRV_PCM_RATE_8000 ,
. formats = SNDRV_PCM_FMTBIT_S16_LE , } ,
} ;
EXPORT_SYMBOL_GPL ( ad73311_dai ) ;
static int ad73311_soc_probe ( struct platform_device * pdev )
{
struct snd_soc_device * socdev = platform_get_drvdata ( pdev ) ;
struct snd_soc_codec * codec ;
int ret = 0 ;
codec = kzalloc ( sizeof ( struct snd_soc_codec ) , GFP_KERNEL ) ;
if ( codec = = NULL )
return - ENOMEM ;
mutex_init ( & codec - > mutex ) ;
codec - > name = " AD73311 " ;
codec - > owner = THIS_MODULE ;
codec - > dai = & ad73311_dai ;
codec - > num_dai = 1 ;
2009-01-23 22:55:23 +00:00
socdev - > card - > codec = codec ;
2008-09-27 16:57:26 +08:00
INIT_LIST_HEAD ( & codec - > dapm_widgets ) ;
INIT_LIST_HEAD ( & codec - > dapm_paths ) ;
/* register pcms */
ret = snd_soc_new_pcms ( socdev , SNDRV_DEFAULT_IDX1 , SNDRV_DEFAULT_STR1 ) ;
if ( ret < 0 ) {
printk ( KERN_ERR " ad73311: failed to create pcms \n " ) ;
goto pcm_err ;
}
2008-11-28 11:49:07 +00:00
ret = snd_soc_init_card ( socdev ) ;
2008-09-27 16:57:26 +08:00
if ( ret < 0 ) {
printk ( KERN_ERR " ad73311: failed to register card \n " ) ;
goto register_err ;
}
return ret ;
register_err :
snd_soc_free_pcms ( socdev ) ;
pcm_err :
2009-01-23 22:55:23 +00:00
kfree ( socdev - > card - > codec ) ;
socdev - > card - > codec = NULL ;
2008-09-27 16:57:26 +08:00
return ret ;
}
static int ad73311_soc_remove ( struct platform_device * pdev )
{
struct snd_soc_device * socdev = platform_get_drvdata ( pdev ) ;
2009-01-23 22:55:23 +00:00
struct snd_soc_codec * codec = socdev - > card - > codec ;
2008-09-27 16:57:26 +08:00
if ( codec = = NULL )
return 0 ;
snd_soc_free_pcms ( socdev ) ;
kfree ( codec ) ;
return 0 ;
}
struct snd_soc_codec_device soc_codec_dev_ad73311 = {
. probe = ad73311_soc_probe ,
. remove = ad73311_soc_remove ,
} ;
EXPORT_SYMBOL_GPL ( soc_codec_dev_ad73311 ) ;
2008-12-10 07:47:22 +01:00
static int __init ad73311_init ( void )
2008-12-08 19:17:58 +00:00
{
return snd_soc_register_dai ( & ad73311_dai ) ;
}
module_init ( ad73311_init ) ;
static void __exit ad73311_exit ( void )
{
snd_soc_unregister_dai ( & ad73311_dai ) ;
}
module_exit ( ad73311_exit ) ;
2008-09-27 16:57:26 +08:00
MODULE_DESCRIPTION ( " ASoC ad73311 driver " ) ;
MODULE_AUTHOR ( " Cliff Cai " ) ;
MODULE_LICENSE ( " GPL " ) ;