@@ -1157,13 +1157,31 @@ static int da7213_hw_params(struct snd_pcm_substream *substream,
1157
1157
{
1158
1158
struct snd_soc_component * component = dai -> component ;
1159
1159
struct da7213_priv * da7213 = snd_soc_component_get_drvdata (component );
1160
+ u8 dai_clk_mode = DA7213_DAI_BCLKS_PER_WCLK_64 ;
1160
1161
u8 dai_ctrl = 0 ;
1161
1162
u8 fs ;
1162
1163
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
+
1163
1180
/* Set DAI format */
1164
1181
switch (params_width (params )) {
1165
1182
case 16 :
1166
1183
dai_ctrl |= DA7213_DAI_WORD_LENGTH_S16_LE ;
1184
+ dai_clk_mode = DA7213_DAI_BCLKS_PER_WCLK_32 ; /* 32bit for 1ch and 2ch */
1167
1185
break ;
1168
1186
case 20 :
1169
1187
dai_ctrl |= DA7213_DAI_WORD_LENGTH_S20_LE ;
@@ -1224,8 +1242,11 @@ static int da7213_hw_params(struct snd_pcm_substream *substream,
1224
1242
return - EINVAL ;
1225
1243
}
1226
1244
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 );
1229
1250
snd_soc_component_write (component , DA7213_SR , fs );
1230
1251
1231
1252
return 0 ;
@@ -1300,19 +1321,24 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1300
1321
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK ) {
1301
1322
case SND_SOC_DAIFMT_I2S :
1302
1323
dai_ctrl |= DA7213_DAI_FORMAT_I2S_MODE ;
1324
+ da7213 -> fmt = DA7213_DAI_FORMAT_I2S_MODE ;
1303
1325
break ;
1304
1326
case SND_SOC_DAIFMT_LEFT_J :
1305
1327
dai_ctrl |= DA7213_DAI_FORMAT_LEFT_J ;
1328
+ da7213 -> fmt = DA7213_DAI_FORMAT_LEFT_J ;
1306
1329
break ;
1307
1330
case SND_SOC_DAIFMT_RIGHT_J :
1308
1331
dai_ctrl |= DA7213_DAI_FORMAT_RIGHT_J ;
1332
+ da7213 -> fmt = DA7213_DAI_FORMAT_RIGHT_J ;
1309
1333
break ;
1310
1334
case SND_SOC_DAI_FORMAT_DSP_A : /* L data MSB after FRM LRC */
1311
1335
dai_ctrl |= DA7213_DAI_FORMAT_DSP ;
1312
1336
dai_offset = 1 ;
1337
+ da7213 -> fmt = DA7213_DAI_FORMAT_DSP ;
1313
1338
break ;
1314
1339
case SND_SOC_DAI_FORMAT_DSP_B : /* L data MSB during FRM LRC */
1315
1340
dai_ctrl |= DA7213_DAI_FORMAT_DSP ;
1341
+ da7213 -> fmt = DA7213_DAI_FORMAT_DSP ;
1316
1342
break ;
1317
1343
default :
1318
1344
return - EINVAL ;
0 commit comments