Commit 88441a8d authored by Anjana Hari's avatar Anjana Hari Committed by Martin K. Petersen

scsi: ufs: core: Add hibernation callbacks

Add freeze, thaw, and restore callbacks for hibernate and restore
functionality.

Link: https://lore.kernel.org/r/20230202161045.3956-2-quic_ahari@quicinc.comSigned-off-by: default avatarAnjana Hari <quic_ahari@quicinc.com>
Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent ad0e4e2f
...@@ -9796,6 +9796,7 @@ static int ufshcd_resume(struct ufs_hba *hba) ...@@ -9796,6 +9796,7 @@ static int ufshcd_resume(struct ufs_hba *hba)
/* enable the host irq as host controller would be active soon */ /* enable the host irq as host controller would be active soon */
ufshcd_enable_irq(hba); ufshcd_enable_irq(hba);
goto out; goto out;
disable_vreg: disable_vreg:
...@@ -9959,6 +9960,56 @@ void ufshcd_remove(struct ufs_hba *hba) ...@@ -9959,6 +9960,56 @@ void ufshcd_remove(struct ufs_hba *hba)
} }
EXPORT_SYMBOL_GPL(ufshcd_remove); 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) * ufshcd_dealloc_host - deallocate Host Bus Adapter (HBA)
* @hba: pointer to Host Bus Adapter (HBA) * @hba: pointer to Host Bus Adapter (HBA)
......
...@@ -1710,10 +1710,16 @@ MODULE_DEVICE_TABLE(acpi, ufs_qcom_acpi_match); ...@@ -1710,10 +1710,16 @@ MODULE_DEVICE_TABLE(acpi, ufs_qcom_acpi_match);
#endif #endif
static const struct dev_pm_ops ufs_qcom_pm_ops = { 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) SET_RUNTIME_PM_OPS(ufshcd_runtime_suspend, ufshcd_runtime_resume, NULL)
.prepare = ufshcd_suspend_prepare, .prepare = ufshcd_suspend_prepare,
.complete = ufshcd_resume_complete, .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 = { static struct platform_driver ufs_qcom_pltform = {
......
...@@ -1276,8 +1276,12 @@ extern int ufshcd_runtime_resume(struct device *dev); ...@@ -1276,8 +1276,12 @@ extern int ufshcd_runtime_resume(struct device *dev);
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
extern int ufshcd_system_suspend(struct device *dev); extern int ufshcd_system_suspend(struct device *dev);
extern int ufshcd_system_resume(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 #endif
extern int ufshcd_shutdown(struct ufs_hba *hba); extern int ufshcd_shutdown(struct ufs_hba *hba);
extern int ufshcd_dme_configure_adapt(struct ufs_hba *hba, extern int ufshcd_dme_configure_adapt(struct ufs_hba *hba,
int agreed_gear, int agreed_gear,
int adapt_val); int adapt_val);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment