mutex_unlock(&cs35l41->fw_mutex);
                break;
        case HDA_GEN_PCM_ACT_CLOSE:
+               mutex_lock(&cs35l41->fw_mutex);
+               if (!cs35l41->firmware_running && cs35l41->request_fw_load &&
+                   !cs35l41->fw_request_ongoing) {
+                       dev_info(dev, "Requesting Firmware Load after HDA_GEN_PCM_ACT_CLOSE\n");
+                       cs35l41->fw_request_ongoing = true;
+                       schedule_work(&cs35l41->fw_load_work);
+               }
+               mutex_unlock(&cs35l41->fw_mutex);
+
                /*
                 * Playback must be finished for all amps before we start runtime suspend.
                 * This ensures no amps are playing back when we start putting them to sleep.
        return ret;
 }
 
+static int cs35l41_system_suspend_prep(struct device *dev)
+{
+       struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
+
+       dev_dbg(cs35l41->dev, "System Suspend Prepare\n");
+
+       if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST_NO_VSPK_SWITCH) {
+               dev_err_once(cs35l41->dev, "System Suspend not supported\n");
+               return 0; /* don't block the whole system suspend */
+       }
+
+       mutex_lock(&cs35l41->fw_mutex);
+       if (cs35l41->playback_started)
+               cs35l41_hda_pause_start(dev);
+       mutex_unlock(&cs35l41->fw_mutex);
+
+       return 0;
+}
+
 static int cs35l41_system_suspend(struct device *dev)
 {
        struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
                return 0; /* don't block the whole system suspend */
        }
 
+       mutex_lock(&cs35l41->fw_mutex);
+       if (cs35l41->playback_started)
+               cs35l41_hda_pause_done(dev);
+       mutex_unlock(&cs35l41->fw_mutex);
+
        ret = pm_runtime_force_suspend(dev);
        if (ret) {
                dev_err(dev, "System Suspend Failed, unable to runtime suspend: %d\n", ret);
        }
 
        mutex_lock(&cs35l41->fw_mutex);
+
        if (cs35l41->request_fw_load && !cs35l41->fw_request_ongoing) {
                cs35l41->fw_request_ongoing = true;
                schedule_work(&cs35l41->fw_load_work);
 
        mutex_lock(&cs35l41->fw_mutex);
 
-       if (cs35l41->playback_started) {
-               cs35l41_hda_pause_start(dev);
-               cs35l41_hda_pause_done(dev);
-       }
-
        if (cs35l41->firmware_running) {
                ret = cs35l41_enter_hibernate(cs35l41->dev, cs35l41->regmap,
                                              cs35l41->hw_cfg.bst_type);
 const struct dev_pm_ops cs35l41_hda_pm_ops = {
        RUNTIME_PM_OPS(cs35l41_runtime_suspend, cs35l41_runtime_resume,
                       cs35l41_runtime_idle)
+       .prepare = cs35l41_system_suspend_prep,
        SYSTEM_SLEEP_PM_OPS(cs35l41_system_suspend, cs35l41_system_resume)
 };
 EXPORT_SYMBOL_NS_GPL(cs35l41_hda_pm_ops, SND_HDA_SCODEC_CS35L41);