ASoC: imx-card: Fix DSD/PDM mclk frequency

The DSD/PDM rate not only DSD64/128/256/512, which are the
multiple rate of 44.1kHz,  but also support the multiple
rate of 8kHz, so can't force all mclk frequency to be
22579200Hz, need to assign the frequency according to
rate.

Fixes: aa736700f4 ("ASoC: imx-card: Add imx-card machine driver")
Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Link: https://lore.kernel.org/r/1657100575-8261-1-git-send-email-shengjiu.wang@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Shengjiu Wang 2022-07-06 17:42:55 +08:00 committed by Mark Brown
parent 676c6cc50d
commit c0fabd12a8
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
1 changed files with 11 additions and 3 deletions

View File

@ -17,6 +17,9 @@
#include "fsl_sai.h" #include "fsl_sai.h"
#define IMX_CARD_MCLK_22P5792MHZ 22579200
#define IMX_CARD_MCLK_24P576MHZ 24576000
enum codec_type { enum codec_type {
CODEC_DUMMY = 0, CODEC_DUMMY = 0,
CODEC_AK5558 = 1, CODEC_AK5558 = 1,
@ -353,9 +356,14 @@ static int imx_aif_hw_params(struct snd_pcm_substream *substream,
mclk_freq = akcodec_get_mclk_rate(substream, params, slots, slot_width); mclk_freq = akcodec_get_mclk_rate(substream, params, slots, slot_width);
else else
mclk_freq = params_rate(params) * slots * slot_width; mclk_freq = params_rate(params) * slots * slot_width;
/* Use the maximum freq from DSD512 (512*44100 = 22579200) */
if (format_is_dsd(params)) if (format_is_dsd(params)) {
mclk_freq = 22579200; /* Use the maximum freq from DSD512 (512*44100 = 22579200) */
if (!(params_rate(params) % 11025))
mclk_freq = IMX_CARD_MCLK_22P5792MHZ;
else
mclk_freq = IMX_CARD_MCLK_24P576MHZ;
}
ret = snd_soc_dai_set_sysclk(cpu_dai, link_data->cpu_sysclk_id, mclk_freq, ret = snd_soc_dai_set_sysclk(cpu_dai, link_data->cpu_sysclk_id, mclk_freq,
SND_SOC_CLOCK_OUT); SND_SOC_CLOCK_OUT);