ASoC: wm8960: Remove bitclk relax condition in wm8960_configure_sysclk
authorShengjiu Wang <shengjiu.wang@nxp.com>
Wed, 3 Mar 2021 03:07:42 +0000 (11:07 +0800)
committerMark Brown <broonie@kernel.org>
Thu, 25 Mar 2021 13:59:00 +0000 (13:59 +0000)
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: 3c01b9ee2ab9 ("ASoC: codec: wm8960: Relax bit clock computation")
Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/1614740862-30196-1-git-send-email-shengjiu.wang@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm8960.c

index df35151..847ca16 100644 (file)
@@ -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;