All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ASoC: Refcount WM8996 bandgap from FLL too
@ 2011-09-19 17:56 Mark Brown
  2011-09-20 11:19 ` Liam Girdwood
  0 siblings, 1 reply; 2+ messages in thread
From: Mark Brown @ 2011-09-19 17:56 UTC (permalink / raw)
  To: Liam Girdwood; +Cc: alsa-devel, patches, Mark Brown

For digital only paths we need to make sure the bandgap is enabled prior
to starting the FLL which isn't tied into DAPM.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
 sound/soc/codecs/wm8996.c |   46 +++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c
index c587b4d..071dda0 100644
--- a/sound/soc/codecs/wm8996.c
+++ b/sound/soc/codecs/wm8996.c
@@ -72,6 +72,7 @@ struct wm8996_priv {
 	struct regulator_bulk_data supplies[WM8996_NUM_SUPPLIES];
 	struct notifier_block disable_nb[WM8996_NUM_SUPPLIES];
 	struct regulator *cpvdd;
+	int bg_ena;
 
 	struct wm8996_pdata pdata;
 
@@ -667,14 +668,40 @@ SOC_SINGLE_TLV("DSP2 EQ B5 Volume", WM8996_DSP2_RX_EQ_GAINS_2, 6, 31, 0,
 	       eq_tlv),
 };
 
+static void wm8996_bg_enable(struct snd_soc_codec *codec)
+{
+	struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec);
+
+	wm8996->bg_ena++;
+	if (wm8996->bg_ena == 1) {
+		snd_soc_update_bits(codec, WM8996_POWER_MANAGEMENT_1,
+				    WM8996_BG_ENA, WM8996_BG_ENA);
+		msleep(2);
+	}
+}
+
+static void wm8996_bg_disable(struct snd_soc_codec *codec)
+{
+	struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec);
+
+	wm8996->bg_ena--;
+	if (!wm8996->bg_ena)
+		snd_soc_update_bits(codec, WM8996_POWER_MANAGEMENT_1,
+				    WM8996_BG_ENA, 0);
+}
+
 static int bg_event(struct snd_soc_dapm_widget *w,
 		    struct snd_kcontrol *kcontrol, int event)
 {
+	struct snd_soc_codec *codec = w->codec;
 	int ret = 0;
 
 	switch (event) {
-	case SND_SOC_DAPM_POST_PMU:
-		msleep(2);
+	case SND_SOC_DAPM_PRE_PMU:
+		wm8996_bg_enable(codec);
+		break;
+	case SND_SOC_DAPM_POST_PMD:
+		wm8996_bg_disable(codec);
 		break;
 	default:
 		BUG();
@@ -1015,10 +1042,10 @@ SND_SOC_DAPM_SUPPLY_S("SYSCLK", 1, WM8996_AIF_CLOCKING_1, 0, 0, NULL, 0),
 SND_SOC_DAPM_SUPPLY_S("SYSDSPCLK", 2, WM8996_CLOCKING_1, 1, 0, NULL, 0),
 SND_SOC_DAPM_SUPPLY_S("AIFCLK", 2, WM8996_CLOCKING_1, 2, 0, NULL, 0),
 SND_SOC_DAPM_SUPPLY_S("Charge Pump", 2, WM8996_CHARGE_PUMP_1, 15, 0, cp_event,
-		      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
-		      SND_SOC_DAPM_POST_PMD),
-SND_SOC_DAPM_SUPPLY("Bandgap", WM8996_POWER_MANAGEMENT_1, WM8996_BG_ENA_SHIFT,
-		    0, bg_event, SND_SOC_DAPM_POST_PMU),
+		      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+SND_SOC_DAPM_SUPPLY("Bandgap", SND_SOC_NOPM, 0, 0, bg_event,
+		    SND_SOC_DAPM_POST_PMU |
+		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 SND_SOC_DAPM_SUPPLY("LDO2", WM8996_POWER_MANAGEMENT_2, 1, 0, NULL, 0),
 SND_SOC_DAPM_SUPPLY("MICB1 Audio", WM8996_MICBIAS_1, 4, 1, NULL, 0),
 SND_SOC_DAPM_SUPPLY("MICB2 Audio", WM8996_MICBIAS_2, 4, 1, NULL, 0),
@@ -2095,6 +2122,8 @@ static int wm8996_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
 		snd_soc_update_bits(codec, WM8996_FLL_CONTROL_1,
 				    WM8996_FLL_ENA, 0);
 
+		wm8996_bg_disable(codec);
+
 		return 0;
 	}
 
@@ -2149,6 +2178,11 @@ static int wm8996_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
 
 	snd_soc_write(codec, WM8996_FLL_EFS_1, fll_div.lambda);
 
+	/* Enable the bandgap if it's not already enabled */
+	ret = snd_soc_read(codec, WM8996_FLL_CONTROL_1);
+	if (!(ret & WM8996_FLL_ENA))
+		wm8996_bg_enable(codec);
+
 	/* Clear any pending completions (eg, from failed startups) */
 	try_wait_for_completion(&wm8996->fll_lock);
 
-- 
1.7.6.3

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

* Re: [PATCH] ASoC: Refcount WM8996 bandgap from FLL too
  2011-09-19 17:56 [PATCH] ASoC: Refcount WM8996 bandgap from FLL too Mark Brown
@ 2011-09-20 11:19 ` Liam Girdwood
  0 siblings, 0 replies; 2+ messages in thread
From: Liam Girdwood @ 2011-09-20 11:19 UTC (permalink / raw)
  To: Mark Brown; +Cc: alsa-devel, patches

On Mon, 2011-09-19 at 18:56 +0100, Mark Brown wrote:
> For digital only paths we need to make sure the bandgap is enabled prior
> to starting the FLL which isn't tied into DAPM.
> 
> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
> ---
>  sound/soc/codecs/wm8996.c |   46 +++++++++++++++++++++++++++++++++++++++-----
>  1 files changed, 40 insertions(+), 6 deletions(-)
> 
> diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c
> index c587b4d..071dda0 100644
> --- a/sound/soc/codecs/wm8996.c
> +++ b/sound/soc/codecs/wm8996.c
> @@ -72,6 +72,7 @@ struct wm8996_priv {
>  	struct regulator_bulk_data supplies[WM8996_NUM_SUPPLIES];
>  	struct notifier_block disable_nb[WM8996_NUM_SUPPLIES];
>  	struct regulator *cpvdd;
> +	int bg_ena;
>  
>  	struct wm8996_pdata pdata;
>  
> @@ -667,14 +668,40 @@ SOC_SINGLE_TLV("DSP2 EQ B5 Volume", WM8996_DSP2_RX_EQ_GAINS_2, 6, 31, 0,
>  	       eq_tlv),
>  };
>  
> +static void wm8996_bg_enable(struct snd_soc_codec *codec)
> +{
> +	struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec);
> +
> +	wm8996->bg_ena++;
> +	if (wm8996->bg_ena == 1) {
> +		snd_soc_update_bits(codec, WM8996_POWER_MANAGEMENT_1,
> +				    WM8996_BG_ENA, WM8996_BG_ENA);
> +		msleep(2);
> +	}
> +}
> +
> +static void wm8996_bg_disable(struct snd_soc_codec *codec)
> +{
> +	struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec);
> +
> +	wm8996->bg_ena--;
> +	if (!wm8996->bg_ena)
> +		snd_soc_update_bits(codec, WM8996_POWER_MANAGEMENT_1,
> +				    WM8996_BG_ENA, 0);
> +}
> +
>  static int bg_event(struct snd_soc_dapm_widget *w,
>  		    struct snd_kcontrol *kcontrol, int event)
>  {
> +	struct snd_soc_codec *codec = w->codec;
>  	int ret = 0;
>  
>  	switch (event) {
> -	case SND_SOC_DAPM_POST_PMU:
> -		msleep(2);
> +	case SND_SOC_DAPM_PRE_PMU:
> +		wm8996_bg_enable(codec);
> +		break;
> +	case SND_SOC_DAPM_POST_PMD:
> +		wm8996_bg_disable(codec);
>  		break;
>  	default:
>  		BUG();
> @@ -1015,10 +1042,10 @@ SND_SOC_DAPM_SUPPLY_S("SYSCLK", 1, WM8996_AIF_CLOCKING_1, 0, 0, NULL, 0),
>  SND_SOC_DAPM_SUPPLY_S("SYSDSPCLK", 2, WM8996_CLOCKING_1, 1, 0, NULL, 0),
>  SND_SOC_DAPM_SUPPLY_S("AIFCLK", 2, WM8996_CLOCKING_1, 2, 0, NULL, 0),
>  SND_SOC_DAPM_SUPPLY_S("Charge Pump", 2, WM8996_CHARGE_PUMP_1, 15, 0, cp_event,
> -		      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
> -		      SND_SOC_DAPM_POST_PMD),
> -SND_SOC_DAPM_SUPPLY("Bandgap", WM8996_POWER_MANAGEMENT_1, WM8996_BG_ENA_SHIFT,
> -		    0, bg_event, SND_SOC_DAPM_POST_PMU),
> +		      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
> +SND_SOC_DAPM_SUPPLY("Bandgap", SND_SOC_NOPM, 0, 0, bg_event,
> +		    SND_SOC_DAPM_POST_PMU |
> +		    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
>  SND_SOC_DAPM_SUPPLY("LDO2", WM8996_POWER_MANAGEMENT_2, 1, 0, NULL, 0),
>  SND_SOC_DAPM_SUPPLY("MICB1 Audio", WM8996_MICBIAS_1, 4, 1, NULL, 0),
>  SND_SOC_DAPM_SUPPLY("MICB2 Audio", WM8996_MICBIAS_2, 4, 1, NULL, 0),
> @@ -2095,6 +2122,8 @@ static int wm8996_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
>  		snd_soc_update_bits(codec, WM8996_FLL_CONTROL_1,
>  				    WM8996_FLL_ENA, 0);
>  
> +		wm8996_bg_disable(codec);
> +
>  		return 0;
>  	}
>  
> @@ -2149,6 +2178,11 @@ static int wm8996_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
>  
>  	snd_soc_write(codec, WM8996_FLL_EFS_1, fll_div.lambda);
>  
> +	/* Enable the bandgap if it's not already enabled */
> +	ret = snd_soc_read(codec, WM8996_FLL_CONTROL_1);
> +	if (!(ret & WM8996_FLL_ENA))
> +		wm8996_bg_enable(codec);
> +
>  	/* Clear any pending completions (eg, from failed startups) */
>  	try_wait_for_completion(&wm8996->fll_lock);
>  

Acked-by: Liam Girdwood <lrg@ti.com>

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

end of thread, other threads:[~2011-09-20 11:20 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-19 17:56 [PATCH] ASoC: Refcount WM8996 bandgap from FLL too Mark Brown
2011-09-20 11:19 ` Liam Girdwood

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.