ASoC: rt5514: Move the auto disable DSP function to set_bias_level()
authoroder_chiou@realtek.com <oder_chiou@realtek.com>
Mon, 10 Jul 2017 02:03:12 +0000 (10:03 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 17 Jul 2017 11:05:47 +0000 (12:05 +0100)
Move the auto disable DSP function from the widget event "DAPM Pre" to
the set_bias_level() function to avoid the unexpected behavior. While the
SPI was recording using the DAI "rt5514-dsp-cpu-dai", the event "DAPM Pre"
would be manipulated even the DAPM widgets were not connected, and it also
would power off the DSP that cause the DSP buffered data lost. So the auto
disable DSP function should move to the set_bias_level() function to make
sure that it is only manipulated by the DAPM widgets are connected.

Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5514.c

index 1b6796c4c471cc536e5d2dc6e3a10fb23d6bff66..a71e63097aaf4d024ae6f56744aec60aacc20be0 100644 (file)
@@ -471,35 +471,6 @@ static int rt5514_is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
                return 0;
 }
 
-static int rt5514_pre_event(struct snd_soc_dapm_widget *w,
-       struct snd_kcontrol *kcontrol, int event)
-{
-       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
-       struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec);
-
-       switch (event) {
-       case SND_SOC_DAPM_PRE_PMU:
-               /**
-                * If the DSP is enabled in start of recording, the DSP
-                * should be disabled, and sync back to normal recording
-                * settings to make sure recording properly.
-               */
-               if (rt5514->dsp_enabled) {
-                       rt5514->dsp_enabled = 0;
-                       regmap_multi_reg_write(rt5514->i2c_regmap,
-                               rt5514_i2c_patch, ARRAY_SIZE(rt5514_i2c_patch));
-                       regcache_mark_dirty(rt5514->regmap);
-                       regcache_sync(rt5514->regmap);
-               }
-               break;
-
-       default:
-               return 0;
-       }
-
-       return 0;
-}
-
 static const struct snd_soc_dapm_widget rt5514_dapm_widgets[] = {
        /* Input Lines */
        SND_SOC_DAPM_INPUT("DMIC1L"),
@@ -607,8 +578,6 @@ static const struct snd_soc_dapm_widget rt5514_dapm_widgets[] = {
 
        /* Audio Interface */
        SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
-
-       SND_SOC_DAPM_PRE("DAPM Pre", rt5514_pre_event),
 };
 
 static const struct snd_soc_dapm_route rt5514_dapm_routes[] = {
@@ -975,6 +944,24 @@ static int rt5514_set_bias_level(struct snd_soc_codec *codec,
                }
                break;
 
+       case SND_SOC_BIAS_STANDBY:
+               if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
+                       /*
+                        * If the DSP is enabled in start of recording, the DSP
+                        * should be disabled, and sync back to normal recording
+                        * settings to make sure recording properly.
+                        */
+                       if (rt5514->dsp_enabled) {
+                               rt5514->dsp_enabled = 0;
+                               regmap_multi_reg_write(rt5514->i2c_regmap,
+                                       rt5514_i2c_patch,
+                                       ARRAY_SIZE(rt5514_i2c_patch));
+                               regcache_mark_dirty(rt5514->regmap);
+                               regcache_sync(rt5514->regmap);
+                       }
+               }
+               break;
+
        default:
                break;
        }