Index: firmware/drivers/audio/wm8758.c
===================================================================
--- firmware/drivers/audio/wm8758.c	(revision 29993)
+++ firmware/drivers/audio/wm8758.c	(working copy)
@@ -121,7 +121,7 @@
     if (mute) {
         wmcodec_write(DACCTRL, DACCTRL_SOFTMUTE);
     } else {
-        wmcodec_write(DACCTRL, 0);
+        wmcodec_write(DACCTRL, DACCTRL_DACOSR128);
     }
 }
 
@@ -130,14 +130,15 @@
     wmcodec_write(RESET, RESET_RESET);
 
     wmcodec_write(PWRMGMT1, PWRMGMT1_PLLEN | PWRMGMT1_BIASEN
-                          | PWRMGMT1_VMIDSEL_10K);
+                          | PWRMGMT1_BUFIOEN | PWRMGMT1_VMIDSEL_10K);
     wmcodec_write(PWRMGMT2, PWRMGMT2_ROUT1EN | PWRMGMT2_LOUT1EN);
     wmcodec_write(PWRMGMT3, PWRMGMT3_LOUT2EN | PWRMGMT3_ROUT2EN
                           | PWRMGMT3_RMIXEN | PWRMGMT3_LMIXEN
                           | PWRMGMT3_DACENR | PWRMGMT3_DACENL);
                           
     wmcodec_write(AINTFCE, AINTFCE_IWL_16BIT | AINTFCE_FORMAT_I2S);
-    wmcodec_write(OUTCTRL, OUTCTRL_VROI);
+    wmcodec_write(OUTCTRL, OUTCTRL_HP_COM | OUTCTRL_TSOPCTRL
+                         | OUTCTRL_TSDEN | OUTCTRL_VROI);
     wmcodec_write(CLKCTRL, CLKCTRL_MS); /* WM8758 is clock master */
 
     audiohw_set_frequency(HW_FREQ_44);
@@ -149,7 +150,7 @@
 void audiohw_postinit(void)
 {
     wmcodec_write(PWRMGMT1, PWRMGMT1_PLLEN | PWRMGMT1_BIASEN
-                          | PWRMGMT1_VMIDSEL_100K); 
+                          | PWRMGMT1_BUFIOEN | PWRMGMT1_VMIDSEL_500K);
                           /* lower the VMID power consumption */
     audiohw_mute(false);
 }
@@ -221,11 +222,13 @@
 /* Nice shutdown of WM8758 codec */
 void audiohw_close(void)
 {
-    audiohw_mute(true);
-
+    wmcodec_write(OUTCTRL, OUTCTRL_HP_COM | OUTCTRL_VROI);
+    wmcodec_write(OUT4TOADC, OUT4TOADC_VMIDTOG);
+    wmcodec_write(PWRMGMT1, PWRMGMT1_PLLEN | PWRMGMT1_BIASEN
+                          | PWRMGMT1_VMIDSEL_OFF);
+    wmcodec_write(PWRMGMT2, 0);
     wmcodec_write(PWRMGMT3, 0);
     wmcodec_write(PWRMGMT1, 0);
-    wmcodec_write(PWRMGMT2, PWRMGMT2_SLEEP);
 }
 
 /* Note: Disable output before calling this function */
