Advertisement
Guest User

Untitled

a guest
Mar 15th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.66 KB | None | 0 0
  1. From ff74ad639e81ccd39d132ba67329b9b74b1bdf3f Mon Sep 17 00:00:00 2001
  2. From: Daniel Baluta <daniel.baluta@nxp.com>
  3. Date: Mon, 13 Mar 2017 18:57:23 +0200
  4. Subject: [PATCH 1/2] MLK-14277: ASoC: codec: wm8960: Refactor sysclk freq
  5.  search
  6.  
  7. Add a separate function for finding (sysclk, lrclk, bclk)
  8. when the clock is auto or mclk. This makes code easier to
  9. read and reduces the indentation level in wm8960_configure_clocking.
  10.  
  11. Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
  12. ---
  13.  sound/soc/codecs/wm8960.c | 82 +++++++++++++++++++++++++++++++++++------------
  14.  1 file changed, 62 insertions(+), 20 deletions(-)
  15.  
  16. diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c
  17. index e1429e3..c01f3de 100644
  18. --- a/sound/soc/codecs/wm8960.c
  19. +++ b/sound/soc/codecs/wm8960.c
  20. @@ -604,12 +604,71 @@ static const int bclk_divs[] = {
  21.     120, 160, 220, 240, 320, 320, 320
  22.  };
  23.  
  24. +/**
  25. + * wm8960_configure_sysclk - checks if there is a sysclk frequency available
  26. + * The sysclk must be chosen such that:
  27. + *     - sysclk     = MCLK / sysclk_divs
  28. + *     - lrclk      = sysclk / dac_divs
  29. + *     - 10 * bclk  = sysclk / bclk_divs
  30. + *
  31. + * @wm8960_priv: wm8960 codec private data
  32. + * @mclk: MCLK used to derive sysclk
  33. + * @_i: sysclk_divs index for found sysclk
  34. + * @_j: dac_divs index for found lrclk
  35. + * @_k: bclk_divs index for found bclk
  36. + *
  37. + * Returns:
  38. + * -1, in case no sysclk frequency available found
  39. + *  0, in case an exact match is found. See @_i, @_j, @_k
  40. + *
  41. + */
  42. +int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk,
  43. +             int *_i, int *_j, int *_k)
  44. +{
  45. +   int sysclk, bclk, lrclk;
  46. +   int i, j, k;
  47. +   int diff;
  48. +
  49. +   bclk = wm8960->bclk;
  50. +   lrclk = wm8960->lrclk;
  51. +
  52. +   /* check if the sysclk frequency is available. */
  53. +   for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) {
  54. +       if (sysclk_divs[i] == -1)
  55. +           continue;
  56. +       sysclk = mclk / sysclk_divs[i];
  57. +       for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) {
  58. +           if (sysclk != dac_divs[j] * lrclk)
  59. +               continue;
  60. +           for (k = 0; k < ARRAY_SIZE(bclk_divs); ++k) {
  61. +               diff = sysclk - bclk * bclk_divs[k] / 10;
  62. +               if (diff == 0) {
  63. +                   *_i = i;
  64. +                   *_j = j;
  65. +                   *_k = k;
  66. +                   break;
  67. +               }
  68. +           }
  69. +           if (k != ARRAY_SIZE(bclk_divs))
  70. +               break;
  71. +       }
  72. +       if (j != ARRAY_SIZE(dac_divs))
  73. +           break;
  74. +   }
  75. +
  76. +   if (i != ARRAY_SIZE(sysclk_divs))
  77. +       return 0;
  78. +
  79. +   return -1;
  80. +}
  81. +
  82.  static int wm8960_configure_clocking(struct snd_soc_codec *codec)
  83.  {
  84.     struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
  85.     int sysclk, bclk, lrclk, freq_out, freq_in;
  86.     u16 iface1 = snd_soc_read(codec, WM8960_IFACE1);
  87.     int i, j, k;
  88. +   int ret;
  89.  
  90.     if (!(iface1 & (1<<6))) {
  91.         dev_dbg(codec->dev,
  92. @@ -643,27 +702,10 @@ static int wm8960_configure_clocking(struct snd_soc_codec *codec)
  93.     }
  94.  
  95.     if (wm8960->clk_id != WM8960_SYSCLK_PLL) {
  96. -       /* check if the sysclk frequency is available. */
  97. -       for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) {
  98. -           if (sysclk_divs[i] == -1)
  99. -               continue;
  100. -           sysclk = freq_out / sysclk_divs[i];
  101. -           for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) {
  102. -               if (sysclk != dac_divs[j] * lrclk)
  103. -                   continue;
  104. -               for (k = 0; k < ARRAY_SIZE(bclk_divs); ++k)
  105. -                   if (sysclk == bclk * bclk_divs[k] / 10)
  106. -                       break;
  107. -               if (k != ARRAY_SIZE(bclk_divs))
  108. -                   break;
  109. -           }
  110. -           if (j != ARRAY_SIZE(dac_divs))
  111. -               break;
  112. -       }
  113. -
  114. -       if (i != ARRAY_SIZE(sysclk_divs)) {
  115. +       ret = wm8960_configure_sysclk(wm8960, freq_out, &i, &j, &k);
  116. +       if (ret == 0)
  117.             goto configure_clock;
  118. -       } else if (wm8960->clk_id != WM8960_SYSCLK_AUTO) {
  119. +       else if (wm8960->clk_id != WM8960_SYSCLK_AUTO) {
  120.             dev_err(codec->dev, "failed to configure clock\n");
  121.             return -EINVAL;
  122.         }
  123. --
  124. 2.7.4
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement