}
 }
 
-static int wm8996_reset(struct wm8996_priv *wm8996)
-{
-       if (wm8996->pdata.ldo_ena > 0) {
-               gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0);
-               gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 1);
-               return 0;
-       } else {
-               return regmap_write(wm8996->regmap, WM8996_SOFTWARE_RESET,
-                                   0x8915);
-       }
-}
-
 static const int bclk_divs[] = {
        1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96
 };
 
        case SND_SOC_BIAS_OFF:
                regcache_cache_only(codec->control_data, true);
-               if (wm8996->pdata.ldo_ena >= 0)
+               if (wm8996->pdata.ldo_ena >= 0) {
                        gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0);
+                       regcache_cache_only(codec->control_data, true);
+               }
                regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies),
                                       wm8996->supplies);
                break;
        dev_info(&i2c->dev, "revision %c\n",
                 (reg & WM8996_CHIP_REV_MASK) + 'A');
 
-       ret = wm8996_reset(wm8996);
-       if (ret < 0) {
-               dev_err(&i2c->dev, "Failed to issue reset\n");
-               goto err_regmap;
+       if (wm8996->pdata.ldo_ena > 0) {
+               gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0);
+               regcache_cache_only(wm8996->regmap, true);
+       } else {
+               ret = regmap_write(wm8996->regmap, WM8996_SOFTWARE_RESET,
+                                  0x8915);
+               if (ret != 0) {
+                       dev_err(&i2c->dev, "Failed to issue reset: %d\n", ret);
+                       goto err_regmap;
+               }
        }
 
-       regcache_cache_only(wm8996->regmap, true);
        regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies);
 
        wm8996_init_gpio(wm8996);