scsi: ufs: core: Add hibernation callbacks
authorAnjana Hari <quic_ahari@quicinc.com>
Thu, 2 Feb 2023 16:10:45 +0000 (21:40 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 8 Feb 2023 23:52:18 +0000 (18:52 -0500)
Add freeze, thaw, and restore callbacks for hibernate and restore
functionality.

Link: https://lore.kernel.org/r/20230202161045.3956-2-quic_ahari@quicinc.com
Signed-off-by: Anjana Hari <quic_ahari@quicinc.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c
drivers/ufs/host/ufs-qcom.c
include/ufs/ufshcd.h

index ffa71c0..0ba2754 100644 (file)
@@ -9796,6 +9796,7 @@ static int ufshcd_resume(struct ufs_hba *hba)
 
        /* enable the host irq as host controller would be active soon */
        ufshcd_enable_irq(hba);
+
        goto out;
 
 disable_vreg:
@@ -9959,6 +9960,56 @@ void ufshcd_remove(struct ufs_hba *hba)
 }
 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)
index 2ad0302..34fc453 100644 (file)
@@ -1710,10 +1710,16 @@ MODULE_DEVICE_TABLE(acpi, ufs_qcom_acpi_match);
 #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 = {
index 57a5af2..ed9e3d5 100644 (file)
@@ -1276,8 +1276,12 @@ extern int ufshcd_runtime_resume(struct device *dev);
 #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);