mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 11:50:43 +09:00
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: Shengjiu Wang <shengjiu.wang@nxp.com> Link: https://lore.kernel.org/r/1655451877-16382-2-git-send-email-shengjiu.wang@nxp.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
committed by
Mark Brown
parent
658e959530
commit
c111c2ddb3
@@ -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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
|||||||
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];
|
||||||
|
|||||||
Reference in New Issue
Block a user