.symmetric_rates = 1,
 };
 
-#ifdef CONFIG_PM
-static int wm8904_suspend(struct snd_soc_codec *codec)
-{
-       wm8904_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
-       return 0;
-}
-
-static int wm8904_resume(struct snd_soc_codec *codec)
-{
-       wm8904_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
-       return 0;
-}
-#else
-#define wm8904_suspend NULL
-#define wm8904_resume NULL
-#endif
-
 static void wm8904_handle_retune_mobile_pdata(struct snd_soc_codec *codec)
 {
        struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
                goto err_enable;
        }
 
+       /* Can leave the device powered off until we need it */
        regcache_cache_only(wm8904->regmap, true);
+       regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), wm8904->supplies);
+
        /* Change some default settings - latch VU and enable ZC */
        snd_soc_update_bits(codec, WM8904_ADC_DIGITAL_VOLUME_LEFT,
                            WM8904_ADC_VU, WM8904_ADC_VU);
        snd_soc_update_bits(codec, WM8904_BIAS_CONTROL_0,
                            WM8904_POBCTRL, 0);
 
-       wm8904_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
-       /* Bias level configuration will have done an extra enable */
-       regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), wm8904->supplies);
-
        wm8904_handle_pdata(codec);
 
        wm8904_add_widgets(codec);
 {
        struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
 
-       wm8904_set_bias_level(codec, SND_SOC_BIAS_OFF);
        regulator_bulk_free(ARRAY_SIZE(wm8904->supplies), wm8904->supplies);
        kfree(wm8904->retune_mobile_texts);
        kfree(wm8904->drc_texts);
 static struct snd_soc_codec_driver soc_codec_dev_wm8904 = {
        .probe =        wm8904_probe,
        .remove =       wm8904_remove,
-       .suspend =      wm8904_suspend,
-       .resume =       wm8904_resume,
        .set_bias_level = wm8904_set_bias_level,
        .idle_bias_off = true,
 };