rx_slot);
 }
 
-static void cs35l41_ready_for_reset(struct cs35l41_hda *cs35l41)
+static int cs35l41_ready_for_reset(struct cs35l41_hda *cs35l41)
 {
+       int ret = 0;
+
        mutex_lock(&cs35l41->fw_mutex);
        if (cs35l41->firmware_running) {
 
                regcache_cache_only(cs35l41->regmap, false);
 
-               cs35l41_exit_hibernate(cs35l41->dev, cs35l41->regmap);
+               ret = cs35l41_exit_hibernate(cs35l41->dev, cs35l41->regmap);
+               if (ret) {
+                       dev_warn(cs35l41->dev, "Unable to exit Hibernate.");
+                       goto err;
+               }
+
+               /* Test key needs to be unlocked to allow the OTP settings to re-apply */
+               cs35l41_test_key_unlock(cs35l41->dev, cs35l41->regmap);
+               ret = regcache_sync(cs35l41->regmap);
+               cs35l41_test_key_lock(cs35l41->dev, cs35l41->regmap);
+               if (ret) {
+                       dev_err(cs35l41->dev, "Failed to restore register cache: %d\n", ret);
+                       goto err;
+               }
+
+               if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
+                       cs35l41_init_boost(cs35l41->dev, cs35l41->regmap, &cs35l41->hw_cfg);
+
                cs35l41_shutdown_dsp(cs35l41);
                cs35l41_safe_reset(cs35l41->regmap, cs35l41->hw_cfg.bst_type);
-
-               regcache_cache_only(cs35l41->regmap, true);
-               regcache_mark_dirty(cs35l41->regmap);
        }
+err:
+       regcache_cache_only(cs35l41->regmap, true);
+       regcache_mark_dirty(cs35l41->regmap);
+
        mutex_unlock(&cs35l41->fw_mutex);
+
+       return ret;
 }
 
 static int cs35l41_system_suspend(struct device *dev)