public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ASoC: wm8804: Allow fine-grained control of the PLL generation
@ 2014-01-08 21:36 Daniel Matuschek
  2014-01-09 14:20 ` Mark Brown
  2014-01-09 14:27 ` [alsa-devel] " Charles Keepax
  0 siblings, 2 replies; 6+ messages in thread
From: Daniel Matuschek @ 2014-01-08 21:36 UTC (permalink / raw)
  To: alsa-devel, Liam Girdwood, Dimitris.Papastamos, Mark Brown,
	Jaroslav Kysela, Takashi Iwai, Grant Likely, Rob Herring, patches,
	linux-kernel, devicetree-discuss

Signed-off-by: Daniel Matuschek <daniel@matuschek.net>

  WM8804 can run
  with PLL frequencies of 256xfs and 128xfs for most sample
  rates. At 192kHz only 128xfs is supported. The existing
  driver selects 128xfs automatically for some lower samples
  rates. By using the "pllid" argument of the "set_pll"
  function is is now possible to control the behaviour. This
  allows using 256xfs PLL frequency on all sample rates up to
  96kHz. It should allow lower jitter and better signal
  quality. When pllid=0, the behaviour of the driver does not
  change.

---
  sound/soc/codecs/wm8804.c |   18 +++++++++++++-----
  sound/soc/codecs/wm8804.h |    7 +++++++
  2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/sound/soc/codecs/wm8804.c b/sound/soc/codecs/wm8804.c
index 1704b1e..e79c408 100644
--- a/sound/soc/codecs/wm8804.c
+++ b/sound/soc/codecs/wm8804.c
@@ -2,6 +2,8 @@
   * wm8804.c  --  WM8804 S/PDIF transceiver driver
   *
   * Copyright 2010-11 Wolfson Microelectronics plc
+ * patched by Daniel Matuschek <info@crazyaudio.com> to allow
+ * fine-grained control of PLL
   *
   * Author: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
   *
@@ -318,7 +320,7 @@ static struct {

  #define FIXED_PLL_SIZE ((1ULL << 22) * 10)
  static int pll_factors(struct pll_div *pll_div, unsigned int target,
-		       unsigned int source)
+		       unsigned int source, int mclk_div)
  {
  	u64 Kpart;
  	unsigned long int K, Ndiv, Nmod, tmp;
@@ -332,9 +334,15 @@ static int pll_factors(struct pll_div *pll_div, unsigned int target,
  		tmp = target * post_table[i].div;
  		if (tmp >= 90000000 && tmp <= 100000000) {
  			pll_div->freqmode = post_table[i].freqmode;
-			pll_div->mclkdiv = post_table[i].mclkdiv;
-			target *= post_table[i].div;
-			break;
+			if ((mclk_div == WM8804_MCLKDIV_DONTCARE) ||
+			    ((post_table[i].mclkdiv == 1) &&
+				(mclk_div == WM8804_MCLKDIV_1)) ||
+			    ((post_table[i].mclkdiv == 0) &&
+				(mclk_div == WM8804_MCLKDIV_0))) {
+				pll_div->mclkdiv = post_table[i].mclkdiv;
+				target *= post_table[i].div;
+				break;
+			}
  		}
  	}

@@ -388,7 +396,7 @@ static int wm8804_set_pll(struct snd_soc_dai *dai, int pll_id,
  		int ret;
  		struct pll_div pll_div;

-		ret = pll_factors(&pll_div, freq_out, freq_in);
+		ret = pll_factors(&pll_div, freq_out, freq_in, pll_id);
  		if (ret)
  			return ret;

diff --git a/sound/soc/codecs/wm8804.h b/sound/soc/codecs/wm8804.h
index 8ec14f5..0365177 100644
--- a/sound/soc/codecs/wm8804.h
+++ b/sound/soc/codecs/wm8804.h
@@ -58,4 +58,11 @@

  #define WM8804_CLKOUT_DIV			1

+#define WM8804_MCLKDIV_DONTCARE			0
+#define WM8804_MCLKDIV_0			1
+#define WM8804_MCLKDIV_1			2
+#define WM8804_PLL_MCLKDIV_DONTCARE		WM8804_MCLKDIV_DONTCARE
+#define WM8804_PLL_MCLKDIV_0			WM8804_MCLKDIV_0
+#define WM8804_PLL_MCLKDIV_1			WM8804_MCLKDIV_1
+
  #endif  /* _WM8804_H */
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-01-09 17:24 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-08 21:36 [PATCH] ASoC: wm8804: Allow fine-grained control of the PLL generation Daniel Matuschek
2014-01-09 14:20 ` Mark Brown
2014-01-09 14:27 ` [alsa-devel] " Charles Keepax
2014-01-09 15:29   ` Daniel Matuschek
2014-01-09 17:14     ` Trent Piepho
2014-01-09 17:23       ` Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox