struct regmap *reg = cs35l41->regmap;
        int ret = 0;
 
-       mutex_lock(&cs35l41->fw_mutex);
-
        switch (action) {
        case HDA_GEN_PCM_ACT_OPEN:
+               pm_runtime_get_sync(dev);
+               mutex_lock(&cs35l41->fw_mutex);
                cs35l41->playback_started = true;
                if (cs35l41->firmware_running) {
                        regmap_multi_reg_write(reg, cs35l41_hda_config_dsp,
                                         CS35L41_AMP_EN_MASK, 1 << CS35L41_AMP_EN_SHIFT);
                if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
                        regmap_write(reg, CS35L41_GPIO1_CTRL1, 0x00008001);
+               mutex_unlock(&cs35l41->fw_mutex);
                break;
        case HDA_GEN_PCM_ACT_PREPARE:
+               mutex_lock(&cs35l41->fw_mutex);
                ret = cs35l41_global_enable(reg, cs35l41->hw_cfg.bst_type, 1);
+               mutex_unlock(&cs35l41->fw_mutex);
                break;
        case HDA_GEN_PCM_ACT_CLEANUP:
+               mutex_lock(&cs35l41->fw_mutex);
                regmap_multi_reg_write(reg, cs35l41_hda_mute, ARRAY_SIZE(cs35l41_hda_mute));
                ret = cs35l41_global_enable(reg, cs35l41->hw_cfg.bst_type, 0);
+               mutex_unlock(&cs35l41->fw_mutex);
                break;
        case HDA_GEN_PCM_ACT_CLOSE:
+               mutex_lock(&cs35l41->fw_mutex);
                ret = regmap_update_bits(reg, CS35L41_PWR_CTRL2,
                                         CS35L41_AMP_EN_MASK, 0 << CS35L41_AMP_EN_SHIFT);
                if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
                }
                cs35l41_irq_release(cs35l41);
                cs35l41->playback_started = false;
+               mutex_unlock(&cs35l41->fw_mutex);
+
+               pm_runtime_mark_last_busy(dev);
+               pm_runtime_put_autosuspend(dev);
                break;
        default:
                dev_warn(cs35l41->dev, "Playback action not supported: %d\n", action);
                break;
        }
 
-       mutex_unlock(&cs35l41->fw_mutex);
-
        if (ret)
                dev_err(cs35l41->dev, "Regmap access fail: %d\n", ret);
 }
        return 0;
 }
 
-static int cs35l41_hda_suspend_hook(struct device *dev)
-{
-       dev_dbg(dev, "Request Suspend\n");
-       pm_runtime_mark_last_busy(dev);
-       return pm_runtime_put_autosuspend(dev);
-}
-
-static int cs35l41_hda_resume_hook(struct device *dev)
-{
-       dev_dbg(dev, "Request Resume\n");
-       return pm_runtime_get_sync(dev);
-}
-
 static int cs35l41_smart_amp(struct cs35l41_hda *cs35l41)
 {
        int halo_sts;
        ret = cs35l41_create_controls(cs35l41);
 
        comps->playback_hook = cs35l41_hda_playback_hook;
-       comps->suspend_hook = cs35l41_hda_suspend_hook;
-       comps->resume_hook = cs35l41_hda_resume_hook;
 
        pm_runtime_mark_last_busy(dev);
        pm_runtime_put_autosuspend(dev);
 
 static int alc269_suspend(struct hda_codec *codec)
 {
        struct alc_spec *spec = codec->spec;
-       int i;
 
        if (spec->has_alc5505_dsp)
                alc5505_dsp_suspend(codec);
 
-       for (i = 0; i < HDA_MAX_COMPONENTS; i++)
-               if (spec->comps[i].suspend_hook)
-                       spec->comps[i].suspend_hook(spec->comps[i].dev);
-
        return alc_suspend(codec);
 }
 
 static int alc269_resume(struct hda_codec *codec)
 {
        struct alc_spec *spec = codec->spec;
-       int i;
 
        if (spec->codec_variant == ALC269_TYPE_ALC269VB)
                alc269vb_toggle_power_output(codec, 0);
        if (spec->has_alc5505_dsp)
                alc5505_dsp_resume(codec);
 
-       for (i = 0; i < HDA_MAX_COMPONENTS; i++)
-               if (spec->comps[i].resume_hook)
-                       spec->comps[i].resume_hook(spec->comps[i].dev);
-
        return 0;
 }
 #endif /* CONFIG_PM */
 {
        struct hda_codec *cdc = dev_to_hda_codec(dev);
        struct alc_spec *spec = cdc->spec;
-       int ret, i;
+       int ret;
 
        ret = component_bind_all(dev, spec->comps);
        if (ret)
                return ret;
 
-       if (snd_hdac_is_power_on(&cdc->core)) {
-               codec_dbg(cdc, "Resuming after bind.\n");
-               for (i = 0; i < HDA_MAX_COMPONENTS; i++)
-                       if (spec->comps[i].resume_hook)
-                               spec->comps[i].resume_hook(spec->comps[i].dev);
-       }
-
        return 0;
 }