return -EINVAL;
        }
 
-       if (mode != old_mode) {
-               /* change rate and set CODECPDZ */
-               twl4030_codec_enable(codec, 0);
-               twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
-               twl4030_codec_enable(codec, 1);
-       }
-
        /* sample size */
        old_format = twl4030_read_reg_cache(codec, TWL4030_REG_AUDIO_IF);
        format = old_format;
                return -EINVAL;
        }
 
-       if (format != old_format) {
-
-               /* clear CODECPDZ before changing format (codec requirement) */
-               twl4030_codec_enable(codec, 0);
-
-               /* change format */
-               twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
-
-               /* set CODECPDZ afterwards */
-               twl4030_codec_enable(codec, 1);
+       if (format != old_format || mode != old_mode) {
+               if (twl4030->codec_powered) {
+                       /*
+                        * If the codec is powered, than we need to toggle the
+                        * codec power.
+                        */
+                       twl4030_codec_enable(codec, 0);
+                       twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
+                       twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
+                       twl4030_codec_enable(codec, 1);
+               } else {
+                       twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
+                       twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
+               }
        }
 
        /* Store the important parameters for the DAI configuration and set
                             unsigned int fmt)
 {
        struct snd_soc_codec *codec = codec_dai->codec;
+       struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
        u8 old_format, format;
 
        /* get format */
        }
 
        if (format != old_format) {
-
-               /* clear CODECPDZ before changing format (codec requirement) */
-               twl4030_codec_enable(codec, 0);
-
-               /* change format */
-               twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
-
-               /* set CODECPDZ afterwards */
-               twl4030_codec_enable(codec, 1);
+               if (twl4030->codec_powered) {
+                       /*
+                        * If the codec is powered, than we need to toggle the
+                        * codec power.
+                        */
+                       twl4030_codec_enable(codec, 0);
+                       twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
+                       twl4030_codec_enable(codec, 1);
+               } else {
+                       twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
+               }
        }
 
        return 0;
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_device *socdev = rtd->socdev;
        struct snd_soc_codec *codec = socdev->card->codec;
+       struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
        u8 old_mode, mode;
 
        /* Enable voice digital filters */
        }
 
        if (mode != old_mode) {
-               /* change rate and set CODECPDZ */
-               twl4030_codec_enable(codec, 0);
-               twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
-               twl4030_codec_enable(codec, 1);
+               if (twl4030->codec_powered) {
+                       /*
+                        * If the codec is powered, than we need to toggle the
+                        * codec power.
+                        */
+                       twl4030_codec_enable(codec, 0);
+                       twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
+                       twl4030_codec_enable(codec, 1);
+               } else {
+                       twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
+               }
        }
 
        return 0;
                unsigned int fmt)
 {
        struct snd_soc_codec *codec = codec_dai->codec;
+       struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
        u8 old_format, format;
 
        /* get format */
        }
 
        if (format != old_format) {
-               /* change format and set CODECPDZ */
-               twl4030_codec_enable(codec, 0);
-               twl4030_write(codec, TWL4030_REG_VOICE_IF, format);
-               twl4030_codec_enable(codec, 1);
+               if (twl4030->codec_powered) {
+                       /*
+                        * If the codec is powered, than we need to toggle the
+                        * codec power.
+                        */
+                       twl4030_codec_enable(codec, 0);
+                       twl4030_write(codec, TWL4030_REG_VOICE_IF, format);
+                       twl4030_codec_enable(codec, 1);
+               } else {
+                       twl4030_write(codec, TWL4030_REG_VOICE_IF, format);
+               }
        }
 
        return 0;
        socdev->card->codec = codec;
 
        twl4030_init_chip(pdev);
-       twl4030_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
 
        /* register pcms */
        ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
        codec->read = twl4030_read_reg_cache;
        codec->write = twl4030_write;
        codec->set_bias_level = twl4030_set_bias_level;
+       codec->idle_bias_off = 1;
        codec->dai = twl4030_dai;
        codec->num_dai = ARRAY_SIZE(twl4030_dai);
        codec->reg_cache_size = sizeof(twl4030_reg);