/* enable the host irq as host controller would be active soon */
        ufshcd_enable_irq(hba);
+
        goto out;
 
 disable_vreg:
 }
 EXPORT_SYMBOL_GPL(ufshcd_remove);
 
+#ifdef CONFIG_PM_SLEEP
+int ufshcd_system_freeze(struct device *dev)
+{
+
+       return ufshcd_system_suspend(dev);
+
+}
+EXPORT_SYMBOL_GPL(ufshcd_system_freeze);
+
+int ufshcd_system_restore(struct device *dev)
+{
+
+       struct ufs_hba *hba = dev_get_drvdata(dev);
+       int ret;
+
+       ret = ufshcd_system_resume(dev);
+       if (ret)
+               return ret;
+
+       /* Configure UTRL and UTMRL base address registers */
+       ufshcd_writel(hba, lower_32_bits(hba->utrdl_dma_addr),
+                       REG_UTP_TRANSFER_REQ_LIST_BASE_L);
+       ufshcd_writel(hba, upper_32_bits(hba->utrdl_dma_addr),
+                       REG_UTP_TRANSFER_REQ_LIST_BASE_H);
+       ufshcd_writel(hba, lower_32_bits(hba->utmrdl_dma_addr),
+                       REG_UTP_TASK_REQ_LIST_BASE_L);
+       ufshcd_writel(hba, upper_32_bits(hba->utmrdl_dma_addr),
+                       REG_UTP_TASK_REQ_LIST_BASE_H);
+       /*
+        * Make sure that UTRL and UTMRL base address registers
+        * are updated with the latest queue addresses. Only after
+        * updating these addresses, we can queue the new commands.
+        */
+       mb();
+
+       /* Resuming from hibernate, assume that link was OFF */
+       ufshcd_set_link_off(hba);
+
+       return 0;
+
+}
+EXPORT_SYMBOL_GPL(ufshcd_system_restore);
+
+int ufshcd_system_thaw(struct device *dev)
+{
+       return ufshcd_system_resume(dev);
+}
+EXPORT_SYMBOL_GPL(ufshcd_system_thaw);
+#endif /* CONFIG_PM_SLEEP  */
+
 /**
  * ufshcd_dealloc_host - deallocate Host Bus Adapter (HBA)
  * @hba: pointer to Host Bus Adapter (HBA)
 
 #endif
 
 static const struct dev_pm_ops ufs_qcom_pm_ops = {
-       SET_SYSTEM_SLEEP_PM_OPS(ufshcd_system_suspend, ufshcd_system_resume)
        SET_RUNTIME_PM_OPS(ufshcd_runtime_suspend, ufshcd_runtime_resume, NULL)
        .prepare         = ufshcd_suspend_prepare,
        .complete        = ufshcd_resume_complete,
+#ifdef CONFIG_PM_SLEEP
+       .suspend         = ufshcd_system_suspend,
+       .resume          = ufshcd_system_resume,
+       .freeze          = ufshcd_system_freeze,
+       .restore         = ufshcd_system_restore,
+       .thaw            = ufshcd_system_thaw,
+#endif
 };
 
 static struct platform_driver ufs_qcom_pltform = {
 
 #ifdef CONFIG_PM_SLEEP
 extern int ufshcd_system_suspend(struct device *dev);
 extern int ufshcd_system_resume(struct device *dev);
+extern int ufshcd_system_freeze(struct device *dev);
+extern int ufshcd_system_thaw(struct device *dev);
+extern int ufshcd_system_restore(struct device *dev);
 #endif
 extern int ufshcd_shutdown(struct ufs_hba *hba);
+
 extern int ufshcd_dme_configure_adapt(struct ufs_hba *hba,
                                      int agreed_gear,
                                      int adapt_val);