ASoC: pcm512x: Fix clocking calculations when not using the PLL
authorDimitris Papavasiliou <dpapavas@gmail.com>
Sat, 26 Jan 2019 13:23:45 +0000 (15:23 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 28 Jan 2019 12:34:14 +0000 (12:34 +0000)
The rationale behind the current calculation is somewhat obscure [1]
and can yield slightly wrong dividers in certain cases, which the
machine drivers for some boards (like the HiFiBerry DAC+ Pro)
seemingly try to circumvent, by updating the rate fraction so as to
suit this calculation.

The updated calculation should correctly yield the smallest bit clock
rate that would fit the frame.

[1] http://mailman.alsa-project.org/pipermail/alsa-devel/2019-January/144219.html

Signed-off-by: Dimitris Papavasiliou <dpapavas@gmail.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/pcm512x.c

index ce8c5dbd21641e9a06b57c7d9461f9679a14c65b..ae3bd533eadb5ac69d6373f0f4e9e779b46a5294 100644 (file)
@@ -929,8 +929,8 @@ static int pcm512x_set_dividers(struct snd_soc_dai *dai,
 
        if (!pcm512x->pll_out) {
                sck_rate = clk_get_rate(pcm512x->sclk);
-               bclk_div = params->rate_den * 64 / lrclk_div;
-               bclk_rate = DIV_ROUND_CLOSEST(sck_rate, bclk_div);
+               bclk_rate = params_rate(params) * lrclk_div;
+               bclk_div = DIV_ROUND_CLOSEST(sck_rate, bclk_rate);
 
                mck_rate = sck_rate;
        } else {