2009-11-02 23:21:44 +03:00
/*
* DB1200 ASoC audio fabric support code .
*
2011-07-25 15:45:03 +04:00
* ( c ) 2008 - 2011 Manuel Lauss < manuel . lauss @ googlemail . com >
2009-11-02 23:21:44 +03:00
*
*/
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <linux/timer.h>
# include <linux/interrupt.h>
# include <linux/platform_device.h>
# include <sound/core.h>
# include <sound/pcm.h>
# include <sound/soc.h>
# include <asm/mach-au1x00/au1000.h>
# include <asm/mach-au1x00/au1xxx_psc.h>
# include <asm/mach-au1x00/au1xxx_dbdma.h>
# include <asm/mach-db1x00/bcsr.h>
# include "../codecs/wm8731.h"
# include "psc.h"
2011-07-25 15:45:03 +04:00
static struct platform_device_id db1200_pids [ ] = {
{
. name = " db1200-ac97 " ,
. driver_data = 0 ,
} , {
. name = " db1200-i2s " ,
. driver_data = 1 ,
} ,
{ } ,
} ;
2009-11-02 23:21:44 +03:00
/*------------------------- AC97 PART ---------------------------*/
static struct snd_soc_dai_link db1200_ac97_dai = {
. name = " AC97 " ,
. stream_name = " AC97 HiFi " ,
2010-03-17 23:15:21 +03:00
. codec_dai_name = " ac97-hifi " ,
2010-08-26 16:53:51 +04:00
. cpu_dai_name = " au1xpsc_ac97.1 " ,
. platform_name = " au1xpsc-pcm.1 " ,
. codec_name = " ac97-codec.1 " ,
2009-11-02 23:21:44 +03:00
} ;
static struct snd_soc_card db1200_ac97_machine = {
. name = " DB1200_AC97 " ,
. dai_link = & db1200_ac97_dai ,
. num_links = 1 ,
} ;
/*------------------------- I2S PART ---------------------------*/
static int db1200_i2s_startup ( struct snd_pcm_substream * substream )
{
struct snd_soc_pcm_runtime * rtd = substream - > private_data ;
2010-03-17 23:15:21 +03:00
struct snd_soc_dai * codec_dai = rtd - > codec_dai ;
struct snd_soc_dai * cpu_dai = rtd - > cpu_dai ;
2009-11-02 23:21:44 +03:00
int ret ;
/* WM8731 has its own 12MHz crystal */
2010-08-18 02:40:24 +04:00
snd_soc_dai_set_sysclk ( codec_dai , WM8731_SYSCLK_XTAL ,
2009-11-02 23:21:44 +03:00
12000000 , SND_SOC_CLOCK_IN ) ;
/* codec is bitclock and lrclk master */
ret = snd_soc_dai_set_fmt ( codec_dai , SND_SOC_DAIFMT_LEFT_J |
SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM ) ;
if ( ret < 0 )
goto out ;
ret = snd_soc_dai_set_fmt ( cpu_dai , SND_SOC_DAIFMT_LEFT_J |
SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM ) ;
if ( ret < 0 )
goto out ;
ret = 0 ;
out :
return ret ;
}
static struct snd_soc_ops db1200_i2s_wm8731_ops = {
. startup = db1200_i2s_startup ,
} ;
static struct snd_soc_dai_link db1200_i2s_dai = {
. name = " WM8731 " ,
. stream_name = " WM8731 PCM " ,
2010-08-26 16:53:51 +04:00
. codec_dai_name = " wm8731-hifi " ,
. cpu_dai_name = " au1xpsc_i2s.1 " ,
. platform_name = " au1xpsc-pcm.1 " ,
2011-03-27 17:35:15 +04:00
. codec_name = " wm8731.0-001b " ,
2009-11-02 23:21:44 +03:00
. ops = & db1200_i2s_wm8731_ops ,
} ;
static struct snd_soc_card db1200_i2s_machine = {
. name = " DB1200_I2S " ,
. dai_link = & db1200_i2s_dai ,
. num_links = 1 ,
} ;
/*------------------------- COMMON PART ---------------------------*/
2011-07-25 15:45:03 +04:00
static struct snd_soc_card * db1200_cards [ ] __devinitdata = {
& db1200_ac97_machine ,
& db1200_i2s_machine ,
} ;
2009-11-02 23:21:44 +03:00
2011-07-25 15:45:03 +04:00
static int __devinit db1200_audio_probe ( struct platform_device * pdev )
2009-11-02 23:21:44 +03:00
{
2011-07-25 15:45:03 +04:00
const struct platform_device_id * pid = platform_get_device_id ( pdev ) ;
struct snd_soc_card * card ;
2009-11-02 23:21:44 +03:00
2011-07-25 15:45:03 +04:00
card = db1200_cards [ pid - > driver_data ] ;
card - > dev = & pdev - > dev ;
return snd_soc_register_card ( card ) ;
}
2009-11-02 23:21:44 +03:00
2011-07-25 15:45:03 +04:00
static int __devexit db1200_audio_remove ( struct platform_device * pdev )
{
struct snd_soc_card * card = platform_get_drvdata ( pdev ) ;
snd_soc_unregister_card ( card ) ;
return 0 ;
}
2009-11-02 23:21:44 +03:00
2011-07-25 15:45:03 +04:00
static struct platform_driver db1200_audio_driver = {
. driver = {
. name = " db1200-ac97 " ,
. owner = THIS_MODULE ,
. pm = & snd_soc_pm_ops ,
} ,
. id_table = db1200_pids ,
. probe = db1200_audio_probe ,
. remove = __devexit_p ( db1200_audio_remove ) ,
} ;
2009-11-02 23:21:44 +03:00
2011-07-25 15:45:03 +04:00
static int __init db1200_audio_load ( void )
{
return platform_driver_register ( & db1200_audio_driver ) ;
2009-11-02 23:21:44 +03:00
}
static void __exit db1200_audio_unload ( void )
{
2011-07-25 15:45:03 +04:00
platform_driver_unregister ( & db1200_audio_driver ) ;
2009-11-02 23:21:44 +03:00
}
module_init ( db1200_audio_load ) ;
module_exit ( db1200_audio_unload ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " DB1200 ASoC audio support " ) ;
MODULE_AUTHOR ( " Manuel Lauss " ) ;