acpi_dev_suspend(dev, false);
 }
 
-#ifdef CONFIG_PM_SLEEP
-static int acpi_lpss_suspend_late(struct device *dev)
-{
-       struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
-       int ret;
-
-       ret = pm_generic_suspend_late(dev);
-       if (ret)
-               return ret;
-
-       if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
-               acpi_lpss_save_ctx(dev, pdata);
-
-       return acpi_dev_suspend(dev, device_may_wakeup(dev));
-}
-
-static int acpi_lpss_resume_early(struct device *dev)
-{
-       struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
-       int ret;
-
-       ret = acpi_dev_resume(dev);
-       if (ret)
-               return ret;
-
-       acpi_lpss_d3_to_d0_delay(pdata);
-
-       if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
-               acpi_lpss_restore_ctx(dev, pdata);
-
-       return pm_generic_resume_early(dev);
-}
-#endif /* CONFIG_PM_SLEEP */
-
 /* IOSF SB for LPSS island */
 #define LPSS_IOSF_UNIT_LPIOEP          0xA0
 #define LPSS_IOSF_UNIT_LPIO1           0xAB
        mutex_unlock(&lpss_iosf_mutex);
 }
 
-static int acpi_lpss_runtime_suspend(struct device *dev)
+static int acpi_lpss_suspend(struct device *dev, bool wakeup)
 {
        struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
        int ret;
 
-       ret = pm_generic_runtime_suspend(dev);
-       if (ret)
-               return ret;
-
        if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
                acpi_lpss_save_ctx(dev, pdata);
 
-       ret = acpi_dev_suspend(dev, true);
+       ret = acpi_dev_suspend(dev, wakeup);
 
        /*
         * This call must be last in the sequence, otherwise PMC will return
        return ret;
 }
 
-static int acpi_lpss_runtime_resume(struct device *dev)
+static int acpi_lpss_resume(struct device *dev)
 {
        struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
        int ret;
        if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
                acpi_lpss_restore_ctx(dev, pdata);
 
-       return pm_generic_runtime_resume(dev);
+       return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int acpi_lpss_suspend_late(struct device *dev)
+{
+       int ret = pm_generic_suspend_late(dev);
+
+       return ret ? ret : acpi_lpss_suspend(dev, device_may_wakeup(dev));
+}
+
+static int acpi_lpss_resume_early(struct device *dev)
+{
+       int ret = acpi_lpss_resume(dev);
+
+       return ret ? ret : pm_generic_resume_early(dev);
+}
+#endif /* CONFIG_PM_SLEEP */
+
+static int acpi_lpss_runtime_suspend(struct device *dev)
+{
+       int ret = pm_generic_runtime_suspend(dev);
+
+       return ret ? ret : acpi_lpss_suspend(dev, true);
+}
+
+static int acpi_lpss_runtime_resume(struct device *dev)
+{
+       int ret = acpi_lpss_resume(dev);
+
+       return ret ? ret : pm_generic_runtime_resume(dev);
 }
 #endif /* CONFIG_PM */