2019-05-19 15:08:20 +03:00
// SPDX-License-Identifier: GPL-2.0-only
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"
2015-05-01 19:00:11 +03:00
static const struct platform_device_id db1200_pids [ ] = {
2011-07-25 15:45:03 +04:00
{
. 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 ---------------------------*/
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_DEFS ( db1200_ac97 ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " au1xpsc_ac97.1 " ) ) ,
DAILINK_COMP_ARRAY ( COMP_CODEC ( " ac97-codec.1 " , " ac97-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_PLATFORM ( " au1xpsc-pcm.1 " ) ) ) ;
2009-11-02 23:21:44 +03:00
static struct snd_soc_dai_link db1200_ac97_dai = {
. name = " AC97 " ,
. stream_name = " AC97 HiFi " ,
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_REG ( db1200_ac97 ) ,
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 ,
} ;
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_DEFS ( db1300_ac97 ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " au1xpsc_ac97.1 " ) ) ,
DAILINK_COMP_ARRAY ( COMP_CODEC ( " wm9712-codec.1 " , " wm9712-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_PLATFORM ( " au1xpsc-pcm.1 " ) ) ) ;
2011-11-10 16:03:26 +04:00
static struct snd_soc_dai_link db1300_ac97_dai = {
. name = " AC97 " ,
. stream_name = " AC97 HiFi " ,
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_REG ( db1300_ac97 ) ,
2011-11-10 16:03:26 +04:00
} ;
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 )
{
2020-07-20 04:19:19 +03:00
struct snd_soc_pcm_runtime * rtd = asoc_substream_to_rtd ( substream ) ;
2020-03-23 08:17:47 +03:00
struct snd_soc_dai * codec_dai = asoc_rtd_to_codec ( rtd , 0 ) ;
2009-11-02 23:21:44 +03:00
/* 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 ) ;
2015-01-01 19:16:11 +03:00
return 0 ;
2009-11-02 23:21:44 +03:00
}
2017-08-16 19:59:24 +03:00
static const struct snd_soc_ops db1200_i2s_wm8731_ops = {
2009-11-02 23:21:44 +03:00
. startup = db1200_i2s_startup ,
} ;
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_DEFS ( db1200_i2s ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " au1xpsc_i2s.1 " ) ) ,
DAILINK_COMP_ARRAY ( COMP_CODEC ( " wm8731.0-001b " , " wm8731-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_PLATFORM ( " au1xpsc-pcm.1 " ) ) ) ;
2009-11-02 23:21:44 +03:00
static struct snd_soc_dai_link db1200_i2s_dai = {
. name = " WM8731 " ,
. stream_name = " WM8731 PCM " ,
2015-01-01 19:16:11 +03:00
. dai_fmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM ,
2009-11-02 23:21:44 +03:00
. ops = & db1200_i2s_wm8731_ops ,
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_REG ( db1200_i2s ) ,
2009-11-02 23:21:44 +03:00
} ;
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 ,
} ;
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_DEFS ( db1300_i2s ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " au1xpsc_i2s.2 " ) ) ,
DAILINK_COMP_ARRAY ( COMP_CODEC ( " wm8731.0-001b " , " wm8731-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_PLATFORM ( " au1xpsc-pcm.2 " ) ) ) ;
2011-11-10 16:03:26 +04:00
static struct snd_soc_dai_link db1300_i2s_dai = {
. name = " WM8731 " ,
. stream_name = " WM8731 PCM " ,
2015-09-25 12:07:04 +03:00
. dai_fmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM ,
2011-11-10 16:03:26 +04:00
. ops = & db1200_i2s_wm8731_ops ,
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_REG ( db1300_i2s ) ,
2011-11-10 16:03:26 +04:00
} ;
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 ,
} ;
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_DEFS ( db1550_i2s ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " au1xpsc_i2s.3 " ) ) ,
DAILINK_COMP_ARRAY ( COMP_CODEC ( " wm8731.0-001b " , " wm8731-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_PLATFORM ( " au1xpsc-pcm.3 " ) ) ) ;
2011-11-10 16:06:16 +04:00
static struct snd_soc_dai_link db1550_i2s_dai = {
. name = " WM8731 " ,
. stream_name = " WM8731 PCM " ,
2015-09-25 12:07:04 +03:00
. dai_fmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM ,
2011-11-10 16:06:16 +04:00
. ops = & db1200_i2s_wm8731_ops ,
2019-06-06 07:14:13 +03:00
SND_SOC_DAILINK_REG ( db1550_i2s ) ,
2011-11-10 16:06:16 +04:00
} ;
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 ;
2015-08-30 12:16:01 +03:00
return devm_snd_soc_register_card ( & pdev - > dev , card ) ;
2011-07-25 15:45:03 +04:00
}
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 ,
} ;
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 " ) ;