]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ASoC: wm8962: Don't automatically enable and disable FLL
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 27 Jan 2012 19:54:03 +0000 (19:54 +0000)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:35:59 +0000 (08:35 +0200)
Only enable and disable the FLL when explicitly told to, supporting some
additional use cases and making the driver behaviour more standard.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Nicolin Chen <b42378@freescale.com>
(cherry picked from commit a968d9db3b3a9329587b09bd15f4981473c63a9d)

sound/soc/codecs/wm8962.c

index 9acae3004c725db71b4eb4fcf13f145e19679564..969479c09aec4696dedb2eb3027fdcfe849e8493 100644 (file)
@@ -2337,61 +2337,6 @@ SOC_SINGLE_TLV("SPKOUTR Mixer DACR Volume", WM8962_SPEAKER_MIXER_5,
               4, 1, 0, inmix_tlv),
 };
 
-static int sysclk_event(struct snd_soc_dapm_widget *w,
-                       struct snd_kcontrol *kcontrol, int event)
-{
-       struct snd_soc_codec *codec = w->codec;
-       struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
-       unsigned long timeout;
-       int src;
-       int fll;
-
-       src = snd_soc_read(codec, WM8962_CLOCKING2) & WM8962_SYSCLK_SRC_MASK;
-
-       switch (src) {
-       case 0:      /* MCLK */
-               fll = 0;
-               break;
-       case 0x200:  /* FLL */
-               fll = 1;
-               break;
-       default:
-               dev_err(codec->dev, "Unknown SYSCLK source %x\n", src);
-               return -EINVAL;
-       }
-
-       switch (event) {
-       case SND_SOC_DAPM_PRE_PMU:
-               if (fll) {
-                       try_wait_for_completion(&wm8962->fll_lock);
-
-                       snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
-                                           WM8962_FLL_ENA, WM8962_FLL_ENA);
-
-                       timeout = msecs_to_jiffies(5);
-                       timeout = wait_for_completion_timeout(&wm8962->fll_lock,
-                                                             timeout);
-
-                       if (wm8962->irq && timeout == 0)
-                               dev_err(codec->dev,
-                                       "Timed out starting FLL\n");
-               }
-               break;
-
-       case SND_SOC_DAPM_POST_PMD:
-               if (fll)
-                       snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
-                                           WM8962_FLL_ENA, 0);
-               break;
-
-       default:
-               BUG();
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
 static int cp_event(struct snd_soc_dapm_widget *w,
                    struct snd_kcontrol *kcontrol, int event)
 {
@@ -2677,8 +2622,7 @@ SND_SOC_DAPM_INPUT("DMICDAT"),
 SND_SOC_DAPM_SUPPLY("MICBIAS", WM8962_PWR_MGMT_1, 1, 0, NULL, 0),
 
 SND_SOC_DAPM_SUPPLY("Class G", WM8962_CHARGE_PUMP_B, 0, 1, NULL, 0),
-SND_SOC_DAPM_SUPPLY("SYSCLK", WM8962_CLOCKING2, 5, 0, sysclk_event,
-                   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+SND_SOC_DAPM_SUPPLY("SYSCLK", WM8962_CLOCKING2, 5, 0, NULL, 0),
 SND_SOC_DAPM_SUPPLY("Charge Pump", WM8962_CHARGE_PUMP_1, 0, 0, cp_event,
                    SND_SOC_DAPM_POST_PMU),
 SND_SOC_DAPM_SUPPLY("TOCLK", WM8962_ADDITIONAL_CONTROL_1, 0, 0, NULL, 0),
@@ -3418,7 +3362,7 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
        struct _fll_div fll_div = {0};
        unsigned long timeout;
        int ret;
-       int fll1 = snd_soc_read(codec, WM8962_FLL_CONTROL_1) & WM8962_FLL_ENA;
+       int fll1 = 0;
 
        /* Any change? */
        if (source == wm8962->fll_src && Fref == wm8962->fll_fref &&
@@ -3441,6 +3385,9 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
        if (ret != 0)
                return ret;
 
+       /* Parameters good, disable so we can reprogram */
+       snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, WM8962_FLL_ENA, 0);
+
        switch (fll_id) {
        case WM8962_FLL_MCLK:
        case WM8962_FLL_BCLK:
@@ -3481,7 +3428,7 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
 
        snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
                            WM8962_FLL_FRAC | WM8962_FLL_REFCLK_SRC_MASK |
-                           WM8962_FLL_ENA, fll1);
+                           WM8962_FLL_ENA, fll1 | WM8962_FLL_ENA);
 
        dev_dbg(codec->dev, "FLL configured for %dHz->%dHz\n", Fref, Fout);