pr_err("Failed to stop FLL\n");
                        return ret;
                }
+               break;
+
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+static int speyside_set_bias_level_post(struct snd_soc_card *card,
+                                       struct snd_soc_dapm_context *dapm,
+                                       enum snd_soc_bias_level level)
+{
+       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+       int ret;
+
+       if (dapm->dev != codec_dai->dev)
+               return 0;
+
+       switch (level) {
+       case SND_SOC_BIAS_PREPARE:
+               if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) {
+                       ret = snd_soc_dai_set_pll(codec_dai, 0,
+                                                 WM8915_FLL_MCLK2,
+                                                 32768, 48000 * 256);
+                       if (ret < 0) {
+                               pr_err("Failed to start FLL\n");
+                               return ret;
+                       }
+
+                       ret = snd_soc_dai_set_sysclk(codec_dai,
+                                                    WM8915_SYSCLK_FLL,
+                                                    48000 * 256,
+                                                    SND_SOC_CLOCK_IN);
+                       if (ret < 0)
+                               return ret;
+               }
+               break;
 
        default:
                break;
        }
 
+       card->dapm.bias_level = level;
+
        return 0;
 }
 
        if (ret < 0)
                return ret;
 
-       ret = snd_soc_dai_set_pll(codec_dai, 0, WM8915_FLL_MCLK2,
-                                 32768, 256 * 48000);
-       if (ret < 0)
-               return ret;
-
-       ret = snd_soc_dai_set_sysclk(codec_dai, WM8915_SYSCLK_FLL,
-                                    256 * 48000, SND_SOC_CLOCK_IN);
-       if (ret < 0)
-               return ret;
-
        return 0;
 }