2019-05-19 15:08:20 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2009-05-04 18:54:11 +04:00
# include <linux/module.h>
# include <sound/soc.h>
# include <asm/mach-types.h>
# include "../codecs/wm8940.h"
# include "pxa2xx-i2s.h"
static int imote2_asoc_hw_params ( struct snd_pcm_substream * substream ,
struct snd_pcm_hw_params * params )
{
2020-07-20 04:18:20 +03:00
struct snd_soc_pcm_runtime * rtd = asoc_substream_to_rtd ( substream ) ;
2020-03-23 08:19:49 +03:00
struct snd_soc_dai * codec_dai = asoc_rtd_to_codec ( rtd , 0 ) ;
struct snd_soc_dai * cpu_dai = asoc_rtd_to_cpu ( rtd , 0 ) ;
2009-05-04 18:54:11 +04:00
unsigned int clk = 0 ;
int ret ;
switch ( params_rate ( params ) ) {
case 8000 :
case 16000 :
case 48000 :
case 96000 :
clk = 12288000 ;
break ;
case 11025 :
case 22050 :
case 44100 :
clk = 11289600 ;
break ;
}
ret = snd_soc_dai_set_sysclk ( codec_dai , 0 , clk ,
SND_SOC_CLOCK_IN ) ;
if ( ret < 0 )
return ret ;
/* set the I2S system clock as input (unused) */
ret = snd_soc_dai_set_sysclk ( cpu_dai , PXA2XX_I2S_SYSCLK , clk ,
SND_SOC_CLOCK_OUT ) ;
return ret ;
}
2017-03-13 22:46:40 +03:00
static const struct snd_soc_ops imote2_asoc_ops = {
2009-05-04 18:54:11 +04:00
. hw_params = imote2_asoc_hw_params ,
} ;
2019-06-06 07:11:46 +03:00
SND_SOC_DAILINK_DEFS ( wm8940 ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " pxa2xx-i2s " ) ) ,
DAILINK_COMP_ARRAY ( COMP_CODEC ( " wm8940-codec.0-0034 " ,
" wm8940-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_PLATFORM ( " pxa-pcm-audio " ) ) ) ;
2009-05-04 18:54:11 +04:00
static struct snd_soc_dai_link imote2_dai = {
. name = " WM8940 " ,
. stream_name = " WM8940 " ,
2011-12-20 12:27:28 +04:00
. dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS ,
2009-05-04 18:54:11 +04:00
. ops = & imote2_asoc_ops ,
2019-06-06 07:11:46 +03:00
SND_SOC_DAILINK_REG ( wm8940 ) ,
2009-05-04 18:54:11 +04:00
} ;
2011-12-15 06:55:24 +04:00
static struct snd_soc_card imote2 = {
2009-05-04 18:54:11 +04:00
. name = " Imote2 " ,
2011-12-22 05:44:43 +04:00
. owner = THIS_MODULE ,
2009-05-04 18:54:11 +04:00
. dai_link = & imote2_dai ,
. num_links = 1 ,
} ;
2012-12-07 18:26:17 +04:00
static int imote2_probe ( struct platform_device * pdev )
2009-05-04 18:54:11 +04:00
{
2011-12-15 06:55:24 +04:00
struct snd_soc_card * card = & imote2 ;
2009-05-04 18:54:11 +04:00
int ret ;
2011-12-15 06:55:24 +04:00
card - > dev = & pdev - > dev ;
2009-05-04 18:54:11 +04:00
2015-09-01 05:32:59 +03:00
ret = devm_snd_soc_register_card ( & pdev - > dev , card ) ;
2009-05-04 18:54:11 +04:00
if ( ret )
2011-12-15 06:55:24 +04:00
dev_err ( & pdev - > dev , " snd_soc_register_card() failed: %d \n " ,
ret ) ;
2009-05-04 18:54:11 +04:00
return ret ;
}
2011-12-15 06:55:24 +04:00
static struct platform_driver imote2_driver = {
. driver = {
. name = " imote2-audio " ,
2013-10-17 14:01:37 +04:00
. pm = & snd_soc_pm_ops ,
2011-12-15 06:55:24 +04:00
} ,
. probe = imote2_probe ,
} ;
module_platform_driver ( imote2_driver ) ;
2009-05-04 18:54:11 +04:00
MODULE_AUTHOR ( " Jonathan Cameron " ) ;
MODULE_DESCRIPTION ( " ALSA SoC Imote 2 " ) ;
MODULE_LICENSE ( " GPL " ) ;
2011-12-15 06:55:24 +04:00
MODULE_ALIAS ( " platform:imote2-audio " ) ;