Skip to content

Commit c89e652

Browse files
David Raubroonie
David Rau
authored andcommitted
ASoC: da7213: Add support for mono, set frame width to 32 when possible
This adds the DAI mono mode support and set the frame width to 32 Signed-off-by: Piotr Wojtaszczyk <[email protected]> Tested-by: David Rau <[email protected]> Signed-off-by: David Rau <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 3f58ff6 commit c89e652

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

sound/soc/codecs/da7213.c

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

sound/soc/codecs/da7213.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@
195195
#define DA7213_DAI_WORD_LENGTH_S24_LE (0x2 << 2)
196196
#define DA7213_DAI_WORD_LENGTH_S32_LE (0x3 << 2)
197197
#define DA7213_DAI_WORD_LENGTH_MASK (0x3 << 2)
198+
#define DA7213_DAI_MONO_MODE_EN (0x1 << 4)
199+
#define DA7213_DAI_MONO_MODE_MASK (0x1 << 4)
198200
#define DA7213_DAI_EN_SHIFT 7
199201

200202
/* DA7213_DIG_ROUTING_DAI = 0x21 */
@@ -542,6 +544,7 @@ struct da7213_priv {
542544
bool alc_en;
543545
bool fixed_clk_auto_pll;
544546
struct da7213_platform_data *pdata;
547+
int fmt;
545548
};
546549

547550
#endif /* _DA7213_H */

0 commit comments

Comments
 (0)