2009-11-02 23:21:44 +03:00
/*
2011-11-10 16:06:16 +04:00
* DB1200 / DB1300 / DB1550 ASoC audio fabric support code .
2009-11-02 23:21:44 +03:00
*
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 ,
2011-11-10 16:03:26 +04:00
} , {
. name = " db1300-ac97 " ,
. driver_data = 2 ,
} , {
. name = " db1300-i2s " ,
. driver_data = 3 ,
2011-11-10 16:06:16 +04:00
} , {
. name = " db1550-ac97 " ,
. driver_data = 4 ,
} , {
. name = " db1550-i2s " ,
. driver_data = 5 ,
2011-07-25 15:45:03 +04:00
} ,
{ } ,
} ;
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 " ,
2011-12-23 05:53:55 +04:00
. owner = THIS_MODULE ,
2009-11-02 23:21:44 +03:00
. dai_link = & db1200_ac97_dai ,
. num_links = 1 ,
} ;
2011-11-10 16:03:26 +04:00
static struct snd_soc_dai_link db1300_ac97_dai = {
. name = " AC97 " ,
. stream_name = " AC97 HiFi " ,
. codec_dai_name = " wm9712-hifi " ,
. cpu_dai_name = " au1xpsc_ac97.1 " ,
. platform_name = " au1xpsc-pcm.1 " ,
. codec_name = " wm9712-codec.1 " ,
} ;
static struct snd_soc_card db1300_ac97_machine = {
. name = " DB1300_AC97 " ,
2013-07-02 13:19:25 +04:00
. owner = THIS_MODULE ,
2011-11-10 16:03:26 +04:00
. dai_link = & db1300_ac97_dai ,
. num_links = 1 ,
} ;
2011-11-10 16:06:16 +04:00
static struct snd_soc_card db1550_ac97_machine = {
. name = " DB1550_AC97 " ,
2013-07-02 13:19:25 +04:00
. owner = THIS_MODULE ,
2011-11-10 16:06:16 +04:00
. dai_link = & db1200_ac97_dai ,
. num_links = 1 ,
} ;
2009-11-02 23:21:44 +03:00
/*------------------------- 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 " ,
2011-12-23 05:53:55 +04:00
. owner = THIS_MODULE ,
2009-11-02 23:21:44 +03:00
. dai_link = & db1200_i2s_dai ,
. num_links = 1 ,
} ;
2011-11-10 16:03:26 +04:00
static struct snd_soc_dai_link db1300_i2s_dai = {
. name = " WM8731 " ,
. stream_name = " WM8731 PCM " ,
. codec_dai_name = " wm8731-hifi " ,
. cpu_dai_name = " au1xpsc_i2s.2 " ,
. platform_name = " au1xpsc-pcm.2 " ,
. codec_name = " wm8731.0-001b " ,
. ops = & db1200_i2s_wm8731_ops ,
} ;
static struct snd_soc_card db1300_i2s_machine = {
. name = " DB1300_I2S " ,
2013-07-02 13:19:25 +04:00
. owner = THIS_MODULE ,
2011-11-10 16:03:26 +04:00
. dai_link = & db1300_i2s_dai ,
. num_links = 1 ,
} ;
2011-11-10 16:06:16 +04:00
static struct snd_soc_dai_link db1550_i2s_dai = {
. name = " WM8731 " ,
. stream_name = " WM8731 PCM " ,
. codec_dai_name = " wm8731-hifi " ,
. cpu_dai_name = " au1xpsc_i2s.3 " ,
. platform_name = " au1xpsc-pcm.3 " ,
. codec_name = " wm8731.0-001b " ,
. ops = & db1200_i2s_wm8731_ops ,
} ;
static struct snd_soc_card db1550_i2s_machine = {
. name = " DB1550_I2S " ,
2013-07-02 13:19:25 +04:00
. owner = THIS_MODULE ,
2011-11-10 16:06:16 +04:00
. dai_link = & db1550_i2s_dai ,
. num_links = 1 ,
} ;
2009-11-02 23:21:44 +03:00
/*------------------------- COMMON PART ---------------------------*/
2012-12-07 18:26:22 +04:00
static struct snd_soc_card * db1200_cards [ ] = {
2011-07-25 15:45:03 +04:00
& db1200_ac97_machine ,
& db1200_i2s_machine ,
2011-11-10 16:03:26 +04:00
& db1300_ac97_machine ,
& db1300_i2s_machine ,
2011-11-10 16:06:16 +04:00
& db1550_ac97_machine ,
& db1550_i2s_machine ,
2011-07-25 15:45:03 +04:00
} ;
2009-11-02 23:21:44 +03:00
2012-12-07 18:26:22 +04:00
static int 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
2012-12-07 18:26:22 +04:00
static int db1200_audio_remove ( struct platform_device * pdev )
2011-07-25 15:45:03 +04:00
{
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 " ,
. pm = & snd_soc_pm_ops ,
} ,
. id_table = db1200_pids ,
. probe = db1200_audio_probe ,
2012-12-07 18:26:22 +04:00
. remove = db1200_audio_remove ,
2011-07-25 15:45:03 +04:00
} ;
2009-11-02 23:21:44 +03:00
2011-11-25 06:06:59 +04:00
module_platform_driver ( db1200_audio_driver ) ;
2009-11-02 23:21:44 +03:00
MODULE_LICENSE ( " GPL " ) ;
2011-11-10 16:06:16 +04:00
MODULE_DESCRIPTION ( " DB1200/DB1300/DB1550 ASoC audio support " ) ;
2009-11-02 23:21:44 +03:00
MODULE_AUTHOR ( " Manuel Lauss " ) ;