[alsa-devel] [PATCH 2/4] ASoC: wm8904: Automatically enable FLL when selected

Michał Mirosław mirq-linux at rere.qmqm.pl
Wed Dec 19 21:11:15 CET 2018


This makes FLL the clock used from audio-graph-card platform driver
(it explicitly uses clock id 0).  Other platform drivers select the
clock manually.

Signed-off-by: Michał Mirosław <mirq-linux at rere.qmqm.pl>
---
 sound/soc/codecs/wm8904.c | 21 ++++++++++++++++++---
 sound/soc/codecs/wm8904.h |  2 +-
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c
index 2a3e5fbd04e4..f8a17fcdfdeb 100644
--- a/sound/soc/codecs/wm8904.c
+++ b/sound/soc/codecs/wm8904.c
@@ -315,6 +315,9 @@ static bool wm8904_readable_register(struct device *dev, unsigned int reg)
 	}
 }
 
+static int wm8904_set_fll(struct snd_soc_component *component, int fll_id, int source,
+			  unsigned int Fref, unsigned int Fout);
+
 static int wm8904_configure_clocking(struct snd_soc_component *component)
 {
 	struct wm8904_priv *wm8904 = snd_soc_component_get_drvdata(component);
@@ -339,6 +342,13 @@ static int wm8904_configure_clocking(struct snd_soc_component *component)
 		break;
 
 	case WM8904_CLK_FLL:
+		if (!wm8904->fll_fout) {
+			int ret = wm8904_set_fll(component, WM8904_FLL_MCLK, WM8904_FLL_MCLK,
+						 clk_get_rate(wm8904->mclk), 12288000);
+			if (ret)
+				return ret;
+		}
+
 		dev_dbg(component->dev, "Using %dHz FLL clock\n",
 			wm8904->fll_fout);
 
@@ -1675,10 +1685,9 @@ static int fll_factors(struct _fll_div *fll_div, unsigned int Fref,
 	return 0;
 }
 
-static int wm8904_set_fll(struct snd_soc_dai *dai, int fll_id, int source,
+static int wm8904_set_fll(struct snd_soc_component *component, int fll_id, int source,
 			  unsigned int Fref, unsigned int Fout)
 {
-	struct snd_soc_component *component = dai->component;
 	struct wm8904_priv *wm8904 = snd_soc_component_get_drvdata(component);
 	struct _fll_div fll_div;
 	int ret, val;
@@ -1814,6 +1823,12 @@ static int wm8904_set_fll(struct snd_soc_dai *dai, int fll_id, int source,
 	return 0;
 }
 
+static int wm8904_set_dai_fll(struct snd_soc_dai *dai, int fll_id, int source,
+			      unsigned int Fref, unsigned int Fout)
+{
+	return wm8904_set_fll(dai->component, fll_id, source, Fref, Fout);
+}
+
 static int wm8904_digital_mute(struct snd_soc_dai *codec_dai, int mute)
 {
 	struct snd_soc_component *component = codec_dai->component;
@@ -1921,7 +1936,7 @@ static const struct snd_soc_dai_ops wm8904_dai_ops = {
 	.set_sysclk = wm8904_set_sysclk,
 	.set_fmt = wm8904_set_fmt,
 	.set_tdm_slot = wm8904_set_tdm_slot,
-	.set_pll = wm8904_set_fll,
+	.set_pll = wm8904_set_dai_fll,
 	.hw_params = wm8904_hw_params,
 	.digital_mute = wm8904_digital_mute,
 };
diff --git a/sound/soc/codecs/wm8904.h b/sound/soc/codecs/wm8904.h
index c29a0e8131ca..ed3260bcae62 100644
--- a/sound/soc/codecs/wm8904.h
+++ b/sound/soc/codecs/wm8904.h
@@ -13,8 +13,8 @@
 #ifndef _WM8904_H
 #define _WM8904_H
 
+#define WM8904_CLK_FLL  0
 #define WM8904_CLK_MCLK 1
-#define WM8904_CLK_FLL  2
 
 #define WM8904_FLL_MCLK          1
 #define WM8904_FLL_BCLK          2
-- 
2.19.2



More information about the Alsa-devel mailing list