Commit c111c2dd authored by Shengjiu Wang's avatar Shengjiu Wang Committed by Mark Brown

ASoC: fsl_sai: Add PDM daifmt support

PDM format is used for 1-bit stream, so clear the FBT and SYWD,
and the each dataline only has one channel data.
Signed-off-by: default avatarShengjiu Wang <shengjiu.wang@nxp.com>
Link: https://lore.kernel.org/r/1655451877-16382-2-git-send-email-shengjiu.wang@nxp.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 658e9595
...@@ -224,6 +224,7 @@ static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai, ...@@ -224,6 +224,7 @@ static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai,
if (!sai->is_lsb_first) if (!sai->is_lsb_first)
val_cr4 |= FSL_SAI_CR4_MF; val_cr4 |= FSL_SAI_CR4_MF;
sai->is_pdm_mode = false;
/* DAI mode */ /* DAI mode */
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_I2S: case SND_SOC_DAIFMT_I2S:
...@@ -262,6 +263,11 @@ static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai, ...@@ -262,6 +263,11 @@ static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai,
val_cr2 |= FSL_SAI_CR2_BCP; val_cr2 |= FSL_SAI_CR2_BCP;
sai->is_dsp_mode = true; sai->is_dsp_mode = true;
break; break;
case SND_SOC_DAIFMT_PDM:
val_cr2 |= FSL_SAI_CR2_BCP;
val_cr4 &= ~FSL_SAI_CR4_MF;
sai->is_pdm_mode = true;
break;
case SND_SOC_DAIFMT_RIGHT_J: case SND_SOC_DAIFMT_RIGHT_J:
/* To be done */ /* To be done */
default: default:
...@@ -470,6 +476,13 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream, ...@@ -470,6 +476,13 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
pins = DIV_ROUND_UP(channels, slots); pins = DIV_ROUND_UP(channels, slots);
/*
* PDM mode, channels are independent
* each channels are on one dataline/FIFO.
*/
if (sai->is_pdm_mode)
pins = channels;
if (!sai->is_consumer_mode) { if (!sai->is_consumer_mode) {
if (sai->bclk_ratio) if (sai->bclk_ratio)
ret = fsl_sai_set_bclk(cpu_dai, tx, ret = fsl_sai_set_bclk(cpu_dai, tx,
...@@ -492,13 +505,13 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream, ...@@ -492,13 +505,13 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
} }
} }
if (!sai->is_dsp_mode) if (!sai->is_dsp_mode && !sai->is_pdm_mode)
val_cr4 |= FSL_SAI_CR4_SYWD(slot_width); val_cr4 |= FSL_SAI_CR4_SYWD(slot_width);
val_cr5 |= FSL_SAI_CR5_WNW(slot_width); val_cr5 |= FSL_SAI_CR5_WNW(slot_width);
val_cr5 |= FSL_SAI_CR5_W0W(slot_width); val_cr5 |= FSL_SAI_CR5_W0W(slot_width);
if (sai->is_lsb_first) if (sai->is_lsb_first || sai->is_pdm_mode)
val_cr5 |= FSL_SAI_CR5_FBT(0); val_cr5 |= FSL_SAI_CR5_FBT(0);
else else
val_cr5 |= FSL_SAI_CR5_FBT(word_width - 1); val_cr5 |= FSL_SAI_CR5_FBT(word_width - 1);
......
...@@ -259,6 +259,7 @@ struct fsl_sai { ...@@ -259,6 +259,7 @@ struct fsl_sai {
bool is_consumer_mode; bool is_consumer_mode;
bool is_lsb_first; bool is_lsb_first;
bool is_dsp_mode; bool is_dsp_mode;
bool is_pdm_mode;
bool synchronous[2]; bool synchronous[2];
unsigned int mclk_id[2]; unsigned int mclk_id[2];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment