Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: wm8960: Fix WM8960_SYSCLK_PLL mode

With the introduction of WM8960_SYSCLK_AUTO mode, WM8960_SYSCLK_PLL mode was
made unusable. Ensure we're not PLL mode before trying to use MCLK.

Fixes: 3176bf2d7ccd ("ASoC: wm8960: update pll and clock setting function")
Signed-off-by: Stuart Henderson <stuart.henderson@cirrus.com>
Reviewed-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Stuart Henderson and committed by
Mark Brown
6bb74514 95826a37

+17 -15
+17 -15
sound/soc/codecs/wm8960.c
··· 631 631 return -EINVAL; 632 632 } 633 633 634 - /* check if the sysclk frequency is available. */ 635 - for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) { 636 - if (sysclk_divs[i] == -1) 637 - continue; 638 - sysclk = freq_out / sysclk_divs[i]; 639 - for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) { 640 - if (sysclk == dac_divs[j] * lrclk) { 634 + if (wm8960->clk_id != WM8960_SYSCLK_PLL) { 635 + /* check if the sysclk frequency is available. */ 636 + for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) { 637 + if (sysclk_divs[i] == -1) 638 + continue; 639 + sysclk = freq_out / sysclk_divs[i]; 640 + for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) { 641 + if (sysclk != dac_divs[j] * lrclk) 642 + continue; 641 643 for (k = 0; k < ARRAY_SIZE(bclk_divs); ++k) 642 644 if (sysclk == bclk * bclk_divs[k] / 10) 643 645 break; 644 646 if (k != ARRAY_SIZE(bclk_divs)) 645 647 break; 646 648 } 649 + if (j != ARRAY_SIZE(dac_divs)) 650 + break; 647 651 } 648 - if (j != ARRAY_SIZE(dac_divs)) 649 - break; 650 - } 651 652 652 - if (i != ARRAY_SIZE(sysclk_divs)) { 653 - goto configure_clock; 654 - } else if (wm8960->clk_id != WM8960_SYSCLK_AUTO) { 655 - dev_err(codec->dev, "failed to configure clock\n"); 656 - return -EINVAL; 653 + if (i != ARRAY_SIZE(sysclk_divs)) { 654 + goto configure_clock; 655 + } else if (wm8960->clk_id != WM8960_SYSCLK_AUTO) { 656 + dev_err(codec->dev, "failed to configure clock\n"); 657 + return -EINVAL; 658 + } 657 659 } 658 660 /* get a available pll out frequency and set pll */ 659 661 for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) {