2019-04-19 13:21:57 +03:00
// SPDX-License-Identifier: GPL-2.0+
//
// Copyright (c) 2011 Samsung Electronics Co., Ltd
// http://www.samsung.com
2011-07-15 20:38:28 +04:00
# include <linux/module.h>
2011-06-20 12:29:29 +04:00
# include <sound/soc.h>
# include <sound/pcm.h>
# include <sound/pcm_params.h>
# include "../codecs/wm8994.h"
# include "pcm.h"
/*
* Board Settings :
* o ' 1 ' means ' ON '
* o ' 0 ' means ' OFF '
* o ' X ' means ' Don ' t care '
*
* SMDKC210 , SMDKV310 : CFG3 - 1001 , CFG5 - 1000 , CFG7 - 111111
*/
/*
* Configure audio route as : -
* $ amixer sset ' DAC1 ' on , on
* $ amixer sset ' Right Headphone Mux ' ' DAC '
* $ amixer sset ' Left Headphone Mux ' ' DAC '
* $ amixer sset ' DAC1R Mixer AIF1 .1 ' on
* $ amixer sset ' DAC1L Mixer AIF1 .1 ' on
* $ amixer sset ' IN2L ' on
* $ amixer sset ' IN2L PGA IN2LN ' on
* $ amixer sset ' MIXINL IN2L ' on
* $ amixer sset ' AIF1ADC1L Mixer ADC / DMIC ' on
* $ amixer sset ' IN2R ' on
* $ amixer sset ' IN2R PGA IN2RN ' on
* $ amixer sset ' MIXINR IN2R ' on
* $ amixer sset ' AIF1ADC1R Mixer ADC / DMIC ' on
*/
/* SMDK has a 16.9344MHZ crystal attached to WM8994 */
# define SMDK_WM8994_FREQ 16934400
static int smdk_wm8994_pcm_hw_params ( struct snd_pcm_substream * substream ,
struct snd_pcm_hw_params * params )
{
2020-07-20 04:18:14 +03:00
struct snd_soc_pcm_runtime * rtd = asoc_substream_to_rtd ( substream ) ;
2020-03-23 08:20:20 +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 ) ;
2011-06-20 12:29:29 +04:00
unsigned long mclk_freq ;
int rfs , ret ;
switch ( params_rate ( params ) ) {
case 8000 :
rfs = 512 ;
break ;
default :
dev_err ( cpu_dai - > dev , " %s:%d Sampling Rate %u not supported! \n " ,
__func__ , __LINE__ , params_rate ( params ) ) ;
return - EINVAL ;
}
mclk_freq = params_rate ( params ) * rfs ;
ret = snd_soc_dai_set_sysclk ( codec_dai , WM8994_SYSCLK_FLL1 ,
mclk_freq , SND_SOC_CLOCK_IN ) ;
if ( ret < 0 )
return ret ;
ret = snd_soc_dai_set_pll ( codec_dai , WM8994_FLL1 , WM8994_FLL_SRC_MCLK1 ,
SMDK_WM8994_FREQ , mclk_freq ) ;
if ( ret < 0 )
return ret ;
/* Set PCM source clock on CPU */
ret = snd_soc_dai_set_sysclk ( cpu_dai , S3C_PCM_CLKSRC_MUX ,
mclk_freq , SND_SOC_CLOCK_IN ) ;
if ( ret < 0 )
return ret ;
/* Set SCLK_DIV for making bclk */
ret = snd_soc_dai_set_clkdiv ( cpu_dai , S3C_PCM_SCLK_PER_FS , rfs ) ;
if ( ret < 0 )
return ret ;
return 0 ;
}
static struct snd_soc_ops smdk_wm8994_pcm_ops = {
. hw_params = smdk_wm8994_pcm_hw_params ,
} ;
2019-06-06 07:09:12 +03:00
SND_SOC_DAILINK_DEFS ( paif_pcm ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " samsung-pcm.0 " ) ) ,
DAILINK_COMP_ARRAY ( COMP_CODEC ( " wm8994-codec " , " wm8994-aif1 " ) ) ,
DAILINK_COMP_ARRAY ( COMP_PLATFORM ( " samsung-pcm.0 " ) ) ) ;
2011-06-20 12:29:29 +04:00
static struct snd_soc_dai_link smdk_dai [ ] = {
{
. name = " WM8994 PAIF PCM " ,
. stream_name = " Primary PCM " ,
2015-01-01 19:16:29 +03:00
. dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_IB_NF |
SND_SOC_DAIFMT_CBS_CFS ,
2011-06-20 12:29:29 +04:00
. ops = & smdk_wm8994_pcm_ops ,
2019-06-06 07:09:12 +03:00
SND_SOC_DAILINK_REG ( paif_pcm ) ,
2011-06-20 12:29:29 +04:00
} ,
} ;
static struct snd_soc_card smdk_pcm = {
. name = " SMDK-PCM " ,
2011-12-22 06:53:15 +04:00
. owner = THIS_MODULE ,
2011-06-20 12:29:29 +04:00
. dai_link = smdk_dai ,
. num_links = 1 ,
} ;
2012-12-07 18:26:15 +04:00
static int snd_smdk_probe ( struct platform_device * pdev )
2011-06-20 12:29:29 +04:00
{
int ret = 0 ;
smdk_pcm . dev = & pdev - > dev ;
2014-05-21 07:22:17 +04:00
ret = devm_snd_soc_register_card ( & pdev - > dev , & smdk_pcm ) ;
2020-02-28 13:11:20 +03:00
if ( ret & & ret ! = - EPROBE_DEFER )
2011-06-20 12:29:29 +04:00
dev_err ( & pdev - > dev , " snd_soc_register_card failed %d \n " , ret ) ;
2014-05-21 07:22:17 +04:00
return ret ;
2011-06-20 12:29:29 +04:00
}
static struct platform_driver snd_smdk_driver = {
. driver = {
. name = " samsung-smdk-pcm " ,
} ,
. probe = snd_smdk_probe ,
} ;
2011-11-28 14:53:57 +04:00
module_platform_driver ( snd_smdk_driver ) ;
2011-06-20 12:29:29 +04:00
MODULE_AUTHOR ( " Sangbeom Kim, <sbkim73@samsung.com> " ) ;
MODULE_DESCRIPTION ( " ALSA SoC SMDK WM8994 for PCM " ) ;
MODULE_LICENSE ( " GPL " ) ;