summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/imx-ak4458.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/fsl/imx-ak4458.c')
-rw-r--r--sound/soc/fsl/imx-ak4458.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sound/soc/fsl/imx-ak4458.c b/sound/soc/fsl/imx-ak4458.c
index 0dd3e8a15983..f99c9d71229c 100644
--- a/sound/soc/fsl/imx-ak4458.c
+++ b/sound/soc/fsl/imx-ak4458.c
@@ -24,6 +24,7 @@
#include <sound/soc-dapm.h>
#include "fsl_sai.h"
+#include "fsl_dsd.h"
struct imx_ak4458_data {
struct snd_soc_card card;
@@ -148,18 +149,24 @@ static int imx_aif_hw_params(struct snd_pcm_substream *substream,
unsigned int channels = params_channels(params);
unsigned int fmt = SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS;
unsigned long mclk_freq;
+ bool is_dsd = fsl_is_dsd(params);
int ret, i;
- if (data->tdm_mode) {
+ if (is_dsd) {
+ channels = 1;
+ data->slots = 1;
+ data->slot_width = params_width(params);
+ fmt |= SND_SOC_DAIFMT_PDM;
+ } else if (data->tdm_mode) {
data->slots = 8;
data->slot_width = 32;
+ fmt |= SND_SOC_DAIFMT_DSP_B;
} else {
data->slots = 2;
data->slot_width = params_physical_width(params);
+ fmt |= SND_SOC_DAIFMT_I2S;
}
- fmt |= data->tdm_mode ? SND_SOC_DAIFMT_DSP_B : SND_SOC_DAIFMT_I2S;
-
ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
if (ret) {
dev_err(dev, "failed to set cpu dai fmt: %d\n", ret);