Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static
- int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in,
- » » » int *sysclk_idx, int *dac_idx, int *bclk_idx)
- {
- » struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
- » int sysclk, bclk, lrclk, freq_out;
- » int diff, closest, best_freq_out;
- » int i, j, k;
- » bclk = wm8960->bclk;
- » lrclk = wm8960->lrclk;
- » closest = freq_in;
- » best_freq_out = -EINVAL;
- » *sysclk_idx = *dac_idx = *bclk_idx = -1;
- » for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) {
- » » if (sysclk_divs[i] == -1)
- » » » continue;
- » » for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) {
- » » » sysclk = lrclk * dac_divs[j];
- » » » freq_out = sysclk * sysclk_divs[i];
- » » » for (k = 0; k < ARRAY_SIZE(bclk_divs); ++k) {
- » » » » if (!is_pll_freq_available(freq_in, freq_out))
- » » » » » continue;
- » » » » diff = sysclk - bclk * bclk_divs[k] / 10;
- » » » » if (diff == 0) {
- » » » » » *sysclk_idx = i;
- » » » » » *dac_idx = j;
- » » » » » *bclk_idx = k;
- » » » » » best_freq_out = freq_out;
- » » » » » break;
- » » » » }
- » » » » if (diff > 0 && closest > diff) {
- » » » » » *sysclk_idx = i;
- » » » » » *dac_idx = j;
- » » » » » *bclk_idx = k;
- » » » » » closest = diff;
- » » » » » best_freq_out = freq_out;
- » » » » }
- » » » }
- » » » if (k != ARRAY_SIZE(bclk_divs))
- » » » » break;
- » » }
- » » if (j != ARRAY_SIZE(dac_divs))
- » » » break;
- » }
- » return best_freq_out;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement