Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.22 KB | None | 0 0
  1. static
  2. int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in,
  3. »       »       »        int *sysclk_idx, int *dac_idx, int *bclk_idx)
  4. {
  5. »       struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
  6. »       int sysclk, bclk, lrclk, freq_out;
  7. »       int diff, closest, best_freq_out;
  8. »       int i, j, k;
  9.  
  10. »       bclk = wm8960->bclk;
  11. »       lrclk = wm8960->lrclk;
  12. »       closest = freq_in;
  13.  
  14. »       best_freq_out = -EINVAL;
  15. »       *sysclk_idx = *dac_idx = *bclk_idx = -1;
  16.  
  17. »       for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) {
  18. »       »       if (sysclk_divs[i] == -1)
  19. »       »       »       continue;
  20. »       »       for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) {
  21. »       »       »       sysclk = lrclk * dac_divs[j];
  22. »       »       »       freq_out = sysclk * sysclk_divs[i];
  23.  
  24. »       »       »       for (k = 0; k < ARRAY_SIZE(bclk_divs); ++k) {
  25. »       »       »       »       if (!is_pll_freq_available(freq_in, freq_out))
  26. »       »       »       »       »       continue;
  27.  
  28. »       »       »       »       diff = sysclk - bclk * bclk_divs[k] / 10;
  29. »       »       »       »       if (diff == 0) {
  30. »       »       »       »       »       *sysclk_idx = i;
  31. »       »       »       »       »       *dac_idx = j;
  32. »       »       »       »       »       *bclk_idx = k;
  33. »       »       »       »       »       best_freq_out = freq_out;
  34. »       »       »       »       »       break;
  35. »       »       »       »       }
  36. »       »       »       »       if (diff > 0 && closest > diff) {
  37. »       »       »       »       »       *sysclk_idx = i;
  38. »       »       »       »       »       *dac_idx = j;
  39. »       »       »       »       »       *bclk_idx = k;
  40. »       »       »       »       »       closest = diff;
  41. »       »       »       »       »       best_freq_out = freq_out;
  42. »       »       »       »       }
  43. »       »       »       }
  44. »       »       »       if (k != ARRAY_SIZE(bclk_divs))
  45. »       »       »       »       break;
  46. »       »       }
  47. »       »       if (j != ARRAY_SIZE(dac_divs))
  48. »       »       »       break;
  49. »       }
  50.  
  51. »       return best_freq_out;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement