hda_jackpoll_work(&codec->jackpoll_work.work);
        else
                snd_hda_jack_report_sync(codec);
+       codec->core.dev.power.power_state = PMSG_ON;
        snd_hdac_leave_pm(&codec->core);
 }
 
 }
 #endif /* CONFIG_PM */
 
+#ifdef CONFIG_PM_SLEEP
+static int hda_codec_pm_suspend(struct device *dev)
+{
+       dev->power.power_state = PMSG_SUSPEND;
+       return pm_runtime_force_suspend(dev);
+}
+
+static int hda_codec_pm_resume(struct device *dev)
+{
+       dev->power.power_state = PMSG_RESUME;
+       return pm_runtime_force_resume(dev);
+}
+
+static int hda_codec_pm_freeze(struct device *dev)
+{
+       dev->power.power_state = PMSG_FREEZE;
+       return pm_runtime_force_suspend(dev);
+}
+
+static int hda_codec_pm_thaw(struct device *dev)
+{
+       dev->power.power_state = PMSG_THAW;
+       return pm_runtime_force_resume(dev);
+}
+
+static int hda_codec_pm_restore(struct device *dev)
+{
+       dev->power.power_state = PMSG_RESTORE;
+       return pm_runtime_force_resume(dev);
+}
+#endif /* CONFIG_PM_SLEEP */
+
 /* referred in hda_bind.c */
 const struct dev_pm_ops hda_codec_driver_pm = {
-       SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
-                               pm_runtime_force_resume)
+#ifdef CONFIG_PM_SLEEP
+       .suspend = hda_codec_pm_suspend,
+       .resume = hda_codec_pm_resume,
+       .freeze = hda_codec_pm_freeze,
+       .thaw = hda_codec_pm_thaw,
+       .poweroff = hda_codec_pm_suspend,
+       .restore = hda_codec_pm_restore,
+#endif /* CONFIG_PM_SLEEP */
        SET_RUNTIME_PM_OPS(hda_codec_runtime_suspend, hda_codec_runtime_resume,
                           NULL)
 };