diff mbox series

[2/4] ASoC: wm8904: Automatically enable FLL when selected

Message ID 5353df1d654eae0bbbf26bc1a1d172e611c385db.1545249666.git.mirq-linux@rere.qmqm.pl (mailing list archive)
State New, archived
Headers show
Series ASoC: wm8904: prepare for use from audio-graph-card | expand

Commit Message

Michał Mirosław Dec. 19, 2018, 8:11 p.m. UTC
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@rere.qmqm.pl>
---
 sound/soc/codecs/wm8904.c | 21 ++++++++++++++++++---
 sound/soc/codecs/wm8904.h |  2 +-
 2 files changed, 19 insertions(+), 4 deletions(-)

Comments

Charles Keepax Dec. 21, 2018, 11:52 a.m. UTC | #1
On Wed, Dec 19, 2018 at 09:11:15PM +0100, Michał Mirosław wrote:
> 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@rere.qmqm.pl>
> ---

I wonder a little if this part is really suitable for use with
simple card.

>  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;
> +		}

What is your thinking on selecting a 12.28MHz clock? Will this
not cause issues with say 44.1k playback?

> +
>  		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

A little nervous about making CLK_FLL 0 that means that there is
no longer any concept of an undefined sysclk_src, perhaps we
should also initialise things in the driver to maintain that
concept.

>  
>  #define WM8904_FLL_MCLK          1
>  #define WM8904_FLL_BCLK          2
> -- 
> 2.19.2

Thanks,
Charles
Mark Brown Dec. 21, 2018, 11:58 a.m. UTC | #2
On Fri, Dec 21, 2018 at 11:52:27AM +0000, Charles Keepax wrote:
> On Wed, Dec 19, 2018 at 09:11:15PM +0100, Michał Mirosław wrote:

> > +		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;
> > +		}

> What is your thinking on selecting a 12.28MHz clock? Will this
> not cause issues with say 44.1k playback?

The driver just shouldn't be making decisions like this at all, either
generic code or a machine driver should do so.
Michał Mirosław Jan. 13, 2019, 12:37 p.m. UTC | #3
On Fri, Dec 21, 2018 at 11:58:31AM +0000, Mark Brown wrote:
> On Fri, Dec 21, 2018 at 11:52:27AM +0000, Charles Keepax wrote:
> > On Wed, Dec 19, 2018 at 09:11:15PM +0100, Michał Mirosław wrote:
> 
> > > +		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;
> > > +		}
> 
> > What is your thinking on selecting a 12.28MHz clock? Will this
> > not cause issues with say 44.1k playback?
> The driver just shouldn't be making decisions like this at all, either
> generic code or a machine driver should do so.

Sorry, I forgot about the hardcoded frequency. I'll have to rethink this
patch.

Will you take the other three patches as is, or should I resend the series?

Best Regards,
Michał Mirosław
diff mbox series

Patch

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