Unverified Commit 99067c07 authored by Shengjiu Wang's avatar Shengjiu Wang Committed by Mark Brown
Browse files

ASoC: wm8960: Remove bitclk relax condition in wm8960_configure_sysclk



The call sequence in wm8960_configure_clocking is

   ret = wm8960_configure_sysclk();
   if (ret >= 0)
        goto configure_clock;

   ....

   ret = wm8960_configure_pll();

configure_clock:
   ...

wm8960_configure_sysclk is called before wm8960_configure_pll, as
there is bitclk relax on both functions, so wm8960_configure_sysclk
always return success, then wm8960_configure_pll() never be called.

With this case:
aplay -Dhw:0,0 -d 5 -r 48000 -f S24_LE -c 2 audio48k24b2c.wav
the required bitclk is 48000 * 24 * 2 = 2304000, bitclk got from
wm8960_configure_sysclk is 3072000, but if go to wm8960_configure_pll.
it can get correct bitclk 2304000.

So bitclk relax condition should be removed in wm8960_configure_sysclk,
then wm8960_configure_pll can be called, and there is also bitclk relax
function in wm8960_configure_pll.

Fixes: 3c01b9ee ("ASoC: codec: wm8960: Relax bit clock computation")
Signed-off-by: default avatarShengjiu Wang <shengjiu.wang@nxp.com>
Signed-off-by: default avatarDaniel Baluta <daniel.baluta@nxp.com>
Acked-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/1614740862-30196-1-git-send-email-shengjiu.wang@nxp.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent df8077c6
Loading
Loading
Loading
Loading
+1 −11
Original line number Diff line number Diff line
@@ -608,10 +608,6 @@ static const int bclk_divs[] = {
 *		- lrclk      = sysclk / dac_divs
 *		- 10 * bclk  = sysclk / bclk_divs
 *
 *	If we cannot find an exact match for (sysclk, lrclk, bclk)
 *	triplet, we relax the bclk such that bclk is chosen as the
 *	closest available frequency greater than expected bclk.
 *
 * @wm8960: codec private data
 * @mclk: MCLK used to derive sysclk
 * @sysclk_idx: sysclk_divs index for found sysclk
@@ -629,7 +625,7 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk,
{
	int sysclk, bclk, lrclk;
	int i, j, k;
	int diff, closest = mclk;
	int diff;

	/* marker for no match */
	*bclk_idx = -1;
@@ -653,12 +649,6 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk,
					*bclk_idx = k;
					break;
				}
				if (diff > 0 && closest > diff) {
					*sysclk_idx = i;
					*dac_idx = j;
					*bclk_idx = k;
					closest = diff;
				}
			}
			if (k != ARRAY_SIZE(bclk_divs))
				break;