@@ -1157,13 +1157,31 @@ static int da7213_hw_params(struct snd_pcm_substream *substream,
11571157{
11581158 struct snd_soc_component * component = dai -> component ;
11591159 struct da7213_priv * da7213 = snd_soc_component_get_drvdata (component );
1160+ u8 dai_clk_mode = DA7213_DAI_BCLKS_PER_WCLK_64 ;
11601161 u8 dai_ctrl = 0 ;
11611162 u8 fs ;
11621163
1164+ /* Set channels */
1165+ switch (params_channels (params )) {
1166+ case 1 :
1167+ if (da7213 -> fmt != DA7213_DAI_FORMAT_DSP ) {
1168+ dev_err (component -> dev , "Mono supported only in DSP mode\n" );
1169+ return - EINVAL ;
1170+ }
1171+ dai_ctrl |= DA7213_DAI_MONO_MODE_EN ;
1172+ break ;
1173+ case 2 :
1174+ dai_ctrl &= ~(DA7213_DAI_MONO_MODE_EN );
1175+ break ;
1176+ default :
1177+ return - EINVAL ;
1178+ }
1179+
11631180 /* Set DAI format */
11641181 switch (params_width (params )) {
11651182 case 16 :
11661183 dai_ctrl |= DA7213_DAI_WORD_LENGTH_S16_LE ;
1184+ dai_clk_mode = DA7213_DAI_BCLKS_PER_WCLK_32 ; /* 32bit for 1ch and 2ch */
11671185 break ;
11681186 case 20 :
11691187 dai_ctrl |= DA7213_DAI_WORD_LENGTH_S20_LE ;
@@ -1224,8 +1242,11 @@ static int da7213_hw_params(struct snd_pcm_substream *substream,
12241242 return - EINVAL ;
12251243 }
12261244
1227- snd_soc_component_update_bits (component , DA7213_DAI_CTRL , DA7213_DAI_WORD_LENGTH_MASK ,
1228- dai_ctrl );
1245+ snd_soc_component_update_bits (component , DA7213_DAI_CLK_MODE ,
1246+ DA7213_DAI_BCLKS_PER_WCLK_MASK , dai_clk_mode );
1247+
1248+ snd_soc_component_update_bits (component , DA7213_DAI_CTRL ,
1249+ DA7213_DAI_WORD_LENGTH_MASK | DA7213_DAI_MONO_MODE_MASK , dai_ctrl );
12291250 snd_soc_component_write (component , DA7213_SR , fs );
12301251
12311252 return 0 ;
@@ -1300,19 +1321,24 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
13001321 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK ) {
13011322 case SND_SOC_DAIFMT_I2S :
13021323 dai_ctrl |= DA7213_DAI_FORMAT_I2S_MODE ;
1324+ da7213 -> fmt = DA7213_DAI_FORMAT_I2S_MODE ;
13031325 break ;
13041326 case SND_SOC_DAIFMT_LEFT_J :
13051327 dai_ctrl |= DA7213_DAI_FORMAT_LEFT_J ;
1328+ da7213 -> fmt = DA7213_DAI_FORMAT_LEFT_J ;
13061329 break ;
13071330 case SND_SOC_DAIFMT_RIGHT_J :
13081331 dai_ctrl |= DA7213_DAI_FORMAT_RIGHT_J ;
1332+ da7213 -> fmt = DA7213_DAI_FORMAT_RIGHT_J ;
13091333 break ;
13101334 case SND_SOC_DAI_FORMAT_DSP_A : /* L data MSB after FRM LRC */
13111335 dai_ctrl |= DA7213_DAI_FORMAT_DSP ;
13121336 dai_offset = 1 ;
1337+ da7213 -> fmt = DA7213_DAI_FORMAT_DSP ;
13131338 break ;
13141339 case SND_SOC_DAI_FORMAT_DSP_B : /* L data MSB during FRM LRC */
13151340 dai_ctrl |= DA7213_DAI_FORMAT_DSP ;
1341+ da7213 -> fmt = DA7213_DAI_FORMAT_DSP ;
13161342 break ;
13171343 default :
13181344 return - EINVAL ;
0 commit comments