Re: [PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
On Fri, Apr 21, 2017 at 3:07 PM, Daniel Balutawrote: > Bitclk is derived from sysclk using bclk_divs. > Sysclk can be derived in two ways: > (1) directly from MLCK > (2) MCLK via PLL > > Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock > computation") > relaxed bitclk computation when sysclk is directly derived from MCLK. > > Lets do the same thing when sysclk is derived via PLL. > > Signed-off-by: Daniel Baluta > --- > Here, I forced the following harmless initialization: > > *sysclk_idx = *dac_idx = *bclk_idx = -1; > > otherwise I would trigger a gcc false positive warning: > > sound/soc/codecs/wm8960.c: In function 'wm8960_configure_clocking': > sound/soc/codecs/wm8960.c:810:46: warning: 'j' may be used uninitialized > in this function [-Wmaybe-uninitialized] > snd_soc_update_bits(codec, WM8960_CLOCK1, 0x7 << 6, j << 6); > ~~^~~~ > sound/soc/codecs/wm8960.c:806:44: warning: 'i' may be used uninitialized > in this function [-Wmaybe-uninitialized] > snd_soc_update_bits(codec, WM8960_CLOCK1, 3 << 1, i << 1); > ~~^~~~ I saw the same warning earlier, but it was gone after the rework I posted the other day. Please try if that works for you as well, I think that would be better than a bogus initialization. Arnd
Re: [PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
On Fri, Apr 21, 2017 at 3:07 PM, Daniel Baluta wrote: > Bitclk is derived from sysclk using bclk_divs. > Sysclk can be derived in two ways: > (1) directly from MLCK > (2) MCLK via PLL > > Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock > computation") > relaxed bitclk computation when sysclk is directly derived from MCLK. > > Lets do the same thing when sysclk is derived via PLL. > > Signed-off-by: Daniel Baluta > --- > Here, I forced the following harmless initialization: > > *sysclk_idx = *dac_idx = *bclk_idx = -1; > > otherwise I would trigger a gcc false positive warning: > > sound/soc/codecs/wm8960.c: In function 'wm8960_configure_clocking': > sound/soc/codecs/wm8960.c:810:46: warning: 'j' may be used uninitialized > in this function [-Wmaybe-uninitialized] > snd_soc_update_bits(codec, WM8960_CLOCK1, 0x7 << 6, j << 6); > ~~^~~~ > sound/soc/codecs/wm8960.c:806:44: warning: 'i' may be used uninitialized > in this function [-Wmaybe-uninitialized] > snd_soc_update_bits(codec, WM8960_CLOCK1, 3 << 1, i << 1); > ~~^~~~ I saw the same warning earlier, but it was gone after the rework I posted the other day. Please try if that works for you as well, I think that would be better than a bogus initialization. Arnd
[PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
Bitclk is derived from sysclk using bclk_divs. Sysclk can be derived in two ways: (1) directly from MLCK (2) MCLK via PLL Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock computation") relaxed bitclk computation when sysclk is directly derived from MCLK. Lets do the same thing when sysclk is derived via PLL. Signed-off-by: Daniel Baluta--- Here, I forced the following harmless initialization: *sysclk_idx = *dac_idx = *bclk_idx = -1; otherwise I would trigger a gcc false positive warning: sound/soc/codecs/wm8960.c: In function 'wm8960_configure_clocking': sound/soc/codecs/wm8960.c:810:46: warning: 'j' may be used uninitialized in this function [-Wmaybe-uninitialized] snd_soc_update_bits(codec, WM8960_CLOCK1, 0x7 << 6, j << 6); ~~^~~~ sound/soc/codecs/wm8960.c:806:44: warning: 'i' may be used uninitialized in this function [-Wmaybe-uninitialized] snd_soc_update_bits(codec, WM8960_CLOCK1, 3 << 1, i << 1); ~~^~~~ sound/soc/codecs/wm8960.c | 15 ++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 8c87153..60700d5 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -679,6 +679,10 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk, * - freq_out= sysclk * sysclk_divs * - 10 * sysclk = bclk * 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. + * * @codec: codec structure * @freq_in: input frequency used to derive freq out via PLL * @sysclk_idx: sysclk_divs index for found sysclk @@ -696,13 +700,15 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, { struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); int sysclk, bclk, lrclk, freq_out; - int diff, best_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) @@ -723,6 +729,13 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, 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; -- 2.7.4
[PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
Bitclk is derived from sysclk using bclk_divs. Sysclk can be derived in two ways: (1) directly from MLCK (2) MCLK via PLL Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock computation") relaxed bitclk computation when sysclk is directly derived from MCLK. Lets do the same thing when sysclk is derived via PLL. Signed-off-by: Daniel Baluta --- Here, I forced the following harmless initialization: *sysclk_idx = *dac_idx = *bclk_idx = -1; otherwise I would trigger a gcc false positive warning: sound/soc/codecs/wm8960.c: In function 'wm8960_configure_clocking': sound/soc/codecs/wm8960.c:810:46: warning: 'j' may be used uninitialized in this function [-Wmaybe-uninitialized] snd_soc_update_bits(codec, WM8960_CLOCK1, 0x7 << 6, j << 6); ~~^~~~ sound/soc/codecs/wm8960.c:806:44: warning: 'i' may be used uninitialized in this function [-Wmaybe-uninitialized] snd_soc_update_bits(codec, WM8960_CLOCK1, 3 << 1, i << 1); ~~^~~~ sound/soc/codecs/wm8960.c | 15 ++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 8c87153..60700d5 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -679,6 +679,10 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk, * - freq_out= sysclk * sysclk_divs * - 10 * sysclk = bclk * 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. + * * @codec: codec structure * @freq_in: input frequency used to derive freq out via PLL * @sysclk_idx: sysclk_divs index for found sysclk @@ -696,13 +700,15 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, { struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); int sysclk, bclk, lrclk, freq_out; - int diff, best_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) @@ -723,6 +729,13 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, 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; -- 2.7.4
[PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
Bitclk is derived from sysclk using bclk_divs. Sysclk can be derived in two ways: (1) directly from MLCK (2) MCLK via PLL Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock computation") relaxed bitclk computation when sysclk is directly derived from MCLK. Lets do the same thing when sysclk is derived via PLL. Signed-off-by: Daniel BalutaAcked-by: Charles Keepax --- sound/soc/codecs/wm8960.c | 16 ++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index ace69da..8ab9fa2 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -679,6 +679,10 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk, * - freq_out= sysclk * sysclk_divs * - 10 * sysclk = bclk * 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. + * * @codec: codec structure * @freq_in: input frequency used to derive freq out via PLL * @sysclk_idx: sysclk_divs index for found sysclk @@ -696,13 +700,14 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, { struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); int sysclk, bclk, lrclk, freq_out; - int diff, best_freq_out; + int diff, closest, best_freq_out = 0; int i, j, k; bclk = wm8960->bclk; lrclk = wm8960->lrclk; + closest = freq_in; - *bclk_idx = -1; + *bclk_idx = *dac_idx = *sysclk_idx = -1; for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) { if (sysclk_divs[i] == -1) @@ -723,6 +728,13 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, 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; -- 2.7.4
[PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
Bitclk is derived from sysclk using bclk_divs. Sysclk can be derived in two ways: (1) directly from MLCK (2) MCLK via PLL Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock computation") relaxed bitclk computation when sysclk is directly derived from MCLK. Lets do the same thing when sysclk is derived via PLL. Signed-off-by: Daniel Baluta Acked-by: Charles Keepax --- sound/soc/codecs/wm8960.c | 16 ++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index ace69da..8ab9fa2 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -679,6 +679,10 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk, * - freq_out= sysclk * sysclk_divs * - 10 * sysclk = bclk * 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. + * * @codec: codec structure * @freq_in: input frequency used to derive freq out via PLL * @sysclk_idx: sysclk_divs index for found sysclk @@ -696,13 +700,14 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, { struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); int sysclk, bclk, lrclk, freq_out; - int diff, best_freq_out; + int diff, closest, best_freq_out = 0; int i, j, k; bclk = wm8960->bclk; lrclk = wm8960->lrclk; + closest = freq_in; - *bclk_idx = -1; + *bclk_idx = *dac_idx = *sysclk_idx = -1; for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) { if (sysclk_divs[i] == -1) @@ -723,6 +728,13 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, 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; -- 2.7.4
Re: [PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
Hi Daniel, [auto build test WARNING on asoc/for-next] [also build test WARNING on next-20170405] [cannot apply to v4.11-rc5] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Daniel-Baluta/ASoC-codec-wm8960-Relax-bit-clock-computation-when-using-PLL/20170405-144647 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next config: i386-randconfig-s0-201714 (attached as .config) compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901 reproduce: # save the attached .config to linux build tree make ARCH=i386 Note: it may well be a FALSE warning. FWIW you are at least aware of it now. http://gcc.gnu.org/wiki/Better_Uninitialized_Warnings All warnings (new ones prefixed by >>): sound/soc/codecs/wm8960.c: In function 'wm8960_configure_clocking': >> sound/soc/codecs/wm8960.c:743:3: warning: 'best_freq_out' may be used >> uninitialized in this function [-Wmaybe-uninitialized] wm8960_set_pll(codec, freq_in, best_freq_out); ^ sound/soc/codecs/wm8960.c:703:21: note: 'best_freq_out' was declared here int diff, closest, best_freq_out; ^ sound/soc/codecs/wm8960.c:806:56: warning: 'j' may be used uninitialized in this function [-Wmaybe-uninitialized] snd_soc_update_bits(codec, WM8960_CLOCK1, 0x7 << 6, j << 6); ~~^~~~ sound/soc/codecs/wm8960.c:802:54: warning: 'i' may be used uninitialized in this function [-Wmaybe-uninitialized] snd_soc_update_bits(codec, WM8960_CLOCK1, 3 << 1, i << 1); ~~^~~~ vim +/best_freq_out +743 sound/soc/codecs/wm8960.c 6b662dee Daniel Baluta 2017-04-04 727 *bclk_idx = k; 6b662dee Daniel Baluta 2017-04-04 728 best_freq_out = freq_out; 6b662dee Daniel Baluta 2017-04-04 729 break; 6b662dee Daniel Baluta 2017-04-04 730 } 16c42f46 Daniel Baluta 2017-04-04 731 if (diff > 0 && closest > diff) { 16c42f46 Daniel Baluta 2017-04-04 732 *sysclk_idx = i; 16c42f46 Daniel Baluta 2017-04-04 733 *dac_idx = j; 16c42f46 Daniel Baluta 2017-04-04 734 *bclk_idx = k; 16c42f46 Daniel Baluta 2017-04-04 735 closest = diff; 16c42f46 Daniel Baluta 2017-04-04 736 best_freq_out = freq_out; 16c42f46 Daniel Baluta 2017-04-04 737 } 6b662dee Daniel Baluta 2017-04-04 738 } 6b662dee Daniel Baluta 2017-04-04 739 } 6b662dee Daniel Baluta 2017-04-04 740 } 6b662dee Daniel Baluta 2017-04-04 741 6b662dee Daniel Baluta 2017-04-04 742 if (*bclk_idx != -1) 6b662dee Daniel Baluta 2017-04-04 @743 wm8960_set_pll(codec, freq_in, best_freq_out); 6b662dee Daniel Baluta 2017-04-04 744 6b662dee Daniel Baluta 2017-04-04 745 return *bclk_idx; 6b662dee Daniel Baluta 2017-04-04 746 } 3176bf2d Zidan Wang2015-08-11 747 static int wm8960_configure_clocking(struct snd_soc_codec *codec) 0e50b51a Zidan Wang2015-05-12 748 { 0e50b51a Zidan Wang2015-05-12 749 struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); 6b662dee Daniel Baluta 2017-04-04 750 int freq_out, freq_in; 0e50b51a Zidan Wang2015-05-12 751 u16 iface1 = snd_soc_read(codec, WM8960_IFACE1); :: The code at line 743 was first introduced by commit :: 6b662deec0da0ad4f9dce8112d01828ed72b5a4c ASoC: codec: wm9860: Refactor PLL out freq search :: TO: Daniel Baluta:: CC: 0day robot --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip
Re: [PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
Hi Daniel, [auto build test WARNING on asoc/for-next] [also build test WARNING on next-20170405] [cannot apply to v4.11-rc5] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Daniel-Baluta/ASoC-codec-wm8960-Relax-bit-clock-computation-when-using-PLL/20170405-144647 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next config: i386-randconfig-s0-201714 (attached as .config) compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901 reproduce: # save the attached .config to linux build tree make ARCH=i386 Note: it may well be a FALSE warning. FWIW you are at least aware of it now. http://gcc.gnu.org/wiki/Better_Uninitialized_Warnings All warnings (new ones prefixed by >>): sound/soc/codecs/wm8960.c: In function 'wm8960_configure_clocking': >> sound/soc/codecs/wm8960.c:743:3: warning: 'best_freq_out' may be used >> uninitialized in this function [-Wmaybe-uninitialized] wm8960_set_pll(codec, freq_in, best_freq_out); ^ sound/soc/codecs/wm8960.c:703:21: note: 'best_freq_out' was declared here int diff, closest, best_freq_out; ^ sound/soc/codecs/wm8960.c:806:56: warning: 'j' may be used uninitialized in this function [-Wmaybe-uninitialized] snd_soc_update_bits(codec, WM8960_CLOCK1, 0x7 << 6, j << 6); ~~^~~~ sound/soc/codecs/wm8960.c:802:54: warning: 'i' may be used uninitialized in this function [-Wmaybe-uninitialized] snd_soc_update_bits(codec, WM8960_CLOCK1, 3 << 1, i << 1); ~~^~~~ vim +/best_freq_out +743 sound/soc/codecs/wm8960.c 6b662dee Daniel Baluta 2017-04-04 727 *bclk_idx = k; 6b662dee Daniel Baluta 2017-04-04 728 best_freq_out = freq_out; 6b662dee Daniel Baluta 2017-04-04 729 break; 6b662dee Daniel Baluta 2017-04-04 730 } 16c42f46 Daniel Baluta 2017-04-04 731 if (diff > 0 && closest > diff) { 16c42f46 Daniel Baluta 2017-04-04 732 *sysclk_idx = i; 16c42f46 Daniel Baluta 2017-04-04 733 *dac_idx = j; 16c42f46 Daniel Baluta 2017-04-04 734 *bclk_idx = k; 16c42f46 Daniel Baluta 2017-04-04 735 closest = diff; 16c42f46 Daniel Baluta 2017-04-04 736 best_freq_out = freq_out; 16c42f46 Daniel Baluta 2017-04-04 737 } 6b662dee Daniel Baluta 2017-04-04 738 } 6b662dee Daniel Baluta 2017-04-04 739 } 6b662dee Daniel Baluta 2017-04-04 740 } 6b662dee Daniel Baluta 2017-04-04 741 6b662dee Daniel Baluta 2017-04-04 742 if (*bclk_idx != -1) 6b662dee Daniel Baluta 2017-04-04 @743 wm8960_set_pll(codec, freq_in, best_freq_out); 6b662dee Daniel Baluta 2017-04-04 744 6b662dee Daniel Baluta 2017-04-04 745 return *bclk_idx; 6b662dee Daniel Baluta 2017-04-04 746 } 3176bf2d Zidan Wang2015-08-11 747 static int wm8960_configure_clocking(struct snd_soc_codec *codec) 0e50b51a Zidan Wang2015-05-12 748 { 0e50b51a Zidan Wang2015-05-12 749 struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); 6b662dee Daniel Baluta 2017-04-04 750 int freq_out, freq_in; 0e50b51a Zidan Wang2015-05-12 751 u16 iface1 = snd_soc_read(codec, WM8960_IFACE1); :: The code at line 743 was first introduced by commit :: 6b662deec0da0ad4f9dce8112d01828ed72b5a4c ASoC: codec: wm9860: Refactor PLL out freq search :: TO: Daniel Baluta :: CC: 0day robot --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip
Re: [PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
On Tue, Apr 04, 2017 at 07:45:14PM +0300, Daniel Baluta wrote: > Bitclk is derived from sysclk using bclk_divs. > Sysclk can be derived in two ways: > (1) directly from MLCK > (2) MCLK via PLL > > Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock computation") > relaxed bitclk computation when sysclk is directly derived from MCLK. > > Lets do the same thing when sysclk is derived via PLL. > > Signed-off-by: Daniel Baluta> --- Acked-by: Charles Keepax Thanks, Charles
Re: [PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
On Tue, Apr 04, 2017 at 07:45:14PM +0300, Daniel Baluta wrote: > Bitclk is derived from sysclk using bclk_divs. > Sysclk can be derived in two ways: > (1) directly from MLCK > (2) MCLK via PLL > > Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock computation") > relaxed bitclk computation when sysclk is directly derived from MCLK. > > Lets do the same thing when sysclk is derived via PLL. > > Signed-off-by: Daniel Baluta > --- Acked-by: Charles Keepax Thanks, Charles
[PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
Bitclk is derived from sysclk using bclk_divs. Sysclk can be derived in two ways: (1) directly from MLCK (2) MCLK via PLL Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock computation") relaxed bitclk computation when sysclk is directly derived from MCLK. Lets do the same thing when sysclk is derived via PLL. Signed-off-by: Daniel Baluta--- sound/soc/codecs/wm8960.c | 14 +- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 36c8454..e8cb764 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -679,6 +679,10 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk, * - freq_out= sysclk * sysclk_divs * - 10 * sysclk = bclk * 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. + * * @codec: codec structure * @freq_in: input frequency used to derive freq out via PLL * @sysclk_idx: sysclk_divs index for found sysclk @@ -696,11 +700,12 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, { struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); int sysclk, bclk, lrclk, freq_out; - int diff, best_freq_out; + int diff, closest, best_freq_out; int i, j, k; bclk = wm8960->bclk; lrclk = wm8960->lrclk; + closest = freq_in; *bclk_idx = -1; @@ -723,6 +728,13 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, 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; + } } } } -- 2.7.4
[PATCH 2/2] ASoC: codec: wm8960: Relax bit clock computation when using PLL
Bitclk is derived from sysclk using bclk_divs. Sysclk can be derived in two ways: (1) directly from MLCK (2) MCLK via PLL Commit 3c01b9ee2ab9d0d ("ASoC: codec: wm8960: Relax bit clock computation") relaxed bitclk computation when sysclk is directly derived from MCLK. Lets do the same thing when sysclk is derived via PLL. Signed-off-by: Daniel Baluta --- sound/soc/codecs/wm8960.c | 14 +- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 36c8454..e8cb764 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -679,6 +679,10 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk, * - freq_out= sysclk * sysclk_divs * - 10 * sysclk = bclk * 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. + * * @codec: codec structure * @freq_in: input frequency used to derive freq out via PLL * @sysclk_idx: sysclk_divs index for found sysclk @@ -696,11 +700,12 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, { struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); int sysclk, bclk, lrclk, freq_out; - int diff, best_freq_out; + int diff, closest, best_freq_out; int i, j, k; bclk = wm8960->bclk; lrclk = wm8960->lrclk; + closest = freq_in; *bclk_idx = -1; @@ -723,6 +728,13 @@ int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, 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; + } } } } -- 2.7.4