Skip to content

Commit

Permalink
ASoC: imx-card: Fix DSD/PDM mclk frequency
Browse files Browse the repository at this point in the history
[ Upstream commit c0fabd1 ]

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: aa73670 ("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
TE-N-ShengjiuWang authored and gregkh committed Aug 17, 2022
1 parent 7c69f70 commit fd3adcb
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions sound/soc/fsl/imx-card.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@

#include "fsl_sai.h"

#define IMX_CARD_MCLK_22P5792MHZ 22579200
#define IMX_CARD_MCLK_24P576MHZ 24576000

enum codec_type {
CODEC_DUMMY = 0,
CODEC_AK5558 = 1,
Expand Down Expand Up @@ -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);
else
mclk_freq = params_rate(params) * slots * slot_width;
/* Use the maximum freq from DSD512 (512*44100 = 22579200) */
if (format_is_dsd(params))
mclk_freq = 22579200;

if (format_is_dsd(params)) {
/* 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,
SND_SOC_CLOCK_OUT);
Expand Down

0 comments on commit fd3adcb

Please sign in to comment.