Loading drivers/scsi/ufs/ufshcd-pci.c +1 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,7 @@ static int ufshcd_pci_runtime_idle(struct device *dev) */ static void ufshcd_pci_shutdown(struct pci_dev *pdev) { ufshcd_hba_stop((struct ufs_hba *)pci_get_drvdata(pdev), true); ufshcd_shutdown((struct ufs_hba *)pci_get_drvdata(pdev)); } /** Loading drivers/scsi/ufs/ufshcd-pltfrm.c +6 −0 Original line number Diff line number Diff line Loading @@ -258,6 +258,11 @@ static int ufshcd_pltfrm_runtime_idle(struct device *dev) #define ufshcd_pltfrm_runtime_idle NULL #endif /* CONFIG_PM_RUNTIME */ static void ufshcd_pltfrm_shutdown(struct platform_device *pdev) { ufshcd_shutdown((struct ufs_hba *)platform_get_drvdata(pdev)); } /** * ufshcd_pltfrm_probe - probe routine of the driver * @pdev: pointer to Platform device handle Loading Loading @@ -362,6 +367,7 @@ static const struct dev_pm_ops ufshcd_dev_pm_ops = { static struct platform_driver ufshcd_pltfrm_driver = { .probe = ufshcd_pltfrm_probe, .remove = ufshcd_pltfrm_remove, .shutdown = ufshcd_pltfrm_shutdown, .driver = { .name = "ufshcd", .owner = THIS_MODULE, Loading drivers/scsi/ufs/ufshcd.c +44 −8 Original line number Diff line number Diff line Loading @@ -4826,15 +4826,15 @@ out: /** * ufshcd_suspend - helper function for suspend operations * @hba: per adapter instance * @pm_op: runtime PM or system PM * * This is common function called by both ufshcd_system_suspend() and * ufshcd_runtime_suspend(). * @pm_op: desired low power operation type * * This function will try to put the UFS device and link into low power * mode based on the "rpm_lvl" (Runtime PM level) or "spm_lvl" * (System PM level). * * If this function is called during shutdown, it will make sure that * both UFS device and UFS link is powered off. * * NOTE: UFS device & link must be active before we enter in this function. * * Returns 0 for success and non-zero for failure Loading @@ -4847,9 +4847,15 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) enum uic_link_state req_link_state; hba->pm_op_in_progress = 1; pm_lvl = ufshcd_is_runtime_pm(pm_op) ? hba->rpm_lvl : hba->spm_lvl; if (!ufshcd_is_shutdown_pm(pm_op)) { pm_lvl = ufshcd_is_runtime_pm(pm_op) ? hba->rpm_lvl : hba->spm_lvl; req_dev_pwr_mode = ufs_get_pm_lvl_to_dev_pwr_mode(pm_lvl); req_link_state = ufs_get_pm_lvl_to_link_pwr_state(pm_lvl); } else { req_dev_pwr_mode = UFS_POWERDOWN_PWR_MODE; req_link_state = UIC_LINK_OFF_STATE; } /* * If we can't transition into any of the low power modes Loading Loading @@ -4882,7 +4888,7 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) if ((req_dev_pwr_mode != hba->curr_dev_pwr_mode) && ((ufshcd_is_runtime_pm(pm_op) && !hba->auto_bkops_enabled) || ufshcd_is_system_pm(pm_op))) { !ufshcd_is_runtime_pm(pm_op))) { /* ensure that bkops is disabled */ ufshcd_disable_auto_bkops(hba); ret = ufshcd_set_dev_pwr_mode(hba, req_dev_pwr_mode); Loading Loading @@ -5175,6 +5181,36 @@ int ufshcd_runtime_idle(struct ufs_hba *hba) } EXPORT_SYMBOL(ufshcd_runtime_idle); /** * ufshcd_shutdown - shutdown routine * @hba: per adapter instance * * This function would power off both UFS device and UFS link. * * Returns 0 always to allow force shutdown even in case of errors. */ int ufshcd_shutdown(struct ufs_hba *hba) { int ret = 0; if (ufshcd_is_ufs_dev_poweroff(hba) && ufshcd_is_link_off(hba)) goto out; if (pm_runtime_suspended(hba->dev)) { ret = ufshcd_runtime_resume(hba); if (ret) goto out; } ret = ufshcd_suspend(hba, UFS_SHUTDOWN_PM); out: if (ret) dev_err(hba->dev, "%s failed, err %d\n", __func__, ret); /* allow force shutdown even in case of errors */ return 0; } EXPORT_SYMBOL(ufshcd_shutdown); /** * ufshcd_remove - de-allocate SCSI host and host memory space * data structure memory Loading drivers/scsi/ufs/ufshcd.h +3 −0 Original line number Diff line number Diff line Loading @@ -102,10 +102,12 @@ struct uic_command { enum ufs_pm_op { UFS_RUNTIME_PM, UFS_SYSTEM_PM, UFS_SHUTDOWN_PM, }; #define ufshcd_is_runtime_pm(op) ((op) == UFS_RUNTIME_PM) #define ufshcd_is_system_pm(op) ((op) == UFS_SYSTEM_PM) #define ufshcd_is_shutdown_pm(op) ((op) == UFS_SHUTDOWN_PM) /* Host <-> Device UniPro Link state */ enum uic_link_state { Loading Loading @@ -504,6 +506,7 @@ extern int ufshcd_runtime_resume(struct ufs_hba *hba); extern int ufshcd_runtime_idle(struct ufs_hba *hba); extern int ufshcd_system_suspend(struct ufs_hba *hba); extern int ufshcd_system_resume(struct ufs_hba *hba); extern int ufshcd_shutdown(struct ufs_hba *hba); extern int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, u8 attr_set, u32 mib_val, u8 peer); extern int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, Loading Loading
drivers/scsi/ufs/ufshcd-pci.c +1 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,7 @@ static int ufshcd_pci_runtime_idle(struct device *dev) */ static void ufshcd_pci_shutdown(struct pci_dev *pdev) { ufshcd_hba_stop((struct ufs_hba *)pci_get_drvdata(pdev), true); ufshcd_shutdown((struct ufs_hba *)pci_get_drvdata(pdev)); } /** Loading
drivers/scsi/ufs/ufshcd-pltfrm.c +6 −0 Original line number Diff line number Diff line Loading @@ -258,6 +258,11 @@ static int ufshcd_pltfrm_runtime_idle(struct device *dev) #define ufshcd_pltfrm_runtime_idle NULL #endif /* CONFIG_PM_RUNTIME */ static void ufshcd_pltfrm_shutdown(struct platform_device *pdev) { ufshcd_shutdown((struct ufs_hba *)platform_get_drvdata(pdev)); } /** * ufshcd_pltfrm_probe - probe routine of the driver * @pdev: pointer to Platform device handle Loading Loading @@ -362,6 +367,7 @@ static const struct dev_pm_ops ufshcd_dev_pm_ops = { static struct platform_driver ufshcd_pltfrm_driver = { .probe = ufshcd_pltfrm_probe, .remove = ufshcd_pltfrm_remove, .shutdown = ufshcd_pltfrm_shutdown, .driver = { .name = "ufshcd", .owner = THIS_MODULE, Loading
drivers/scsi/ufs/ufshcd.c +44 −8 Original line number Diff line number Diff line Loading @@ -4826,15 +4826,15 @@ out: /** * ufshcd_suspend - helper function for suspend operations * @hba: per adapter instance * @pm_op: runtime PM or system PM * * This is common function called by both ufshcd_system_suspend() and * ufshcd_runtime_suspend(). * @pm_op: desired low power operation type * * This function will try to put the UFS device and link into low power * mode based on the "rpm_lvl" (Runtime PM level) or "spm_lvl" * (System PM level). * * If this function is called during shutdown, it will make sure that * both UFS device and UFS link is powered off. * * NOTE: UFS device & link must be active before we enter in this function. * * Returns 0 for success and non-zero for failure Loading @@ -4847,9 +4847,15 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) enum uic_link_state req_link_state; hba->pm_op_in_progress = 1; pm_lvl = ufshcd_is_runtime_pm(pm_op) ? hba->rpm_lvl : hba->spm_lvl; if (!ufshcd_is_shutdown_pm(pm_op)) { pm_lvl = ufshcd_is_runtime_pm(pm_op) ? hba->rpm_lvl : hba->spm_lvl; req_dev_pwr_mode = ufs_get_pm_lvl_to_dev_pwr_mode(pm_lvl); req_link_state = ufs_get_pm_lvl_to_link_pwr_state(pm_lvl); } else { req_dev_pwr_mode = UFS_POWERDOWN_PWR_MODE; req_link_state = UIC_LINK_OFF_STATE; } /* * If we can't transition into any of the low power modes Loading Loading @@ -4882,7 +4888,7 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) if ((req_dev_pwr_mode != hba->curr_dev_pwr_mode) && ((ufshcd_is_runtime_pm(pm_op) && !hba->auto_bkops_enabled) || ufshcd_is_system_pm(pm_op))) { !ufshcd_is_runtime_pm(pm_op))) { /* ensure that bkops is disabled */ ufshcd_disable_auto_bkops(hba); ret = ufshcd_set_dev_pwr_mode(hba, req_dev_pwr_mode); Loading Loading @@ -5175,6 +5181,36 @@ int ufshcd_runtime_idle(struct ufs_hba *hba) } EXPORT_SYMBOL(ufshcd_runtime_idle); /** * ufshcd_shutdown - shutdown routine * @hba: per adapter instance * * This function would power off both UFS device and UFS link. * * Returns 0 always to allow force shutdown even in case of errors. */ int ufshcd_shutdown(struct ufs_hba *hba) { int ret = 0; if (ufshcd_is_ufs_dev_poweroff(hba) && ufshcd_is_link_off(hba)) goto out; if (pm_runtime_suspended(hba->dev)) { ret = ufshcd_runtime_resume(hba); if (ret) goto out; } ret = ufshcd_suspend(hba, UFS_SHUTDOWN_PM); out: if (ret) dev_err(hba->dev, "%s failed, err %d\n", __func__, ret); /* allow force shutdown even in case of errors */ return 0; } EXPORT_SYMBOL(ufshcd_shutdown); /** * ufshcd_remove - de-allocate SCSI host and host memory space * data structure memory Loading
drivers/scsi/ufs/ufshcd.h +3 −0 Original line number Diff line number Diff line Loading @@ -102,10 +102,12 @@ struct uic_command { enum ufs_pm_op { UFS_RUNTIME_PM, UFS_SYSTEM_PM, UFS_SHUTDOWN_PM, }; #define ufshcd_is_runtime_pm(op) ((op) == UFS_RUNTIME_PM) #define ufshcd_is_system_pm(op) ((op) == UFS_SYSTEM_PM) #define ufshcd_is_shutdown_pm(op) ((op) == UFS_SHUTDOWN_PM) /* Host <-> Device UniPro Link state */ enum uic_link_state { Loading Loading @@ -504,6 +506,7 @@ extern int ufshcd_runtime_resume(struct ufs_hba *hba); extern int ufshcd_runtime_idle(struct ufs_hba *hba); extern int ufshcd_system_suspend(struct ufs_hba *hba); extern int ufshcd_system_resume(struct ufs_hba *hba); extern int ufshcd_shutdown(struct ufs_hba *hba); extern int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, u8 attr_set, u32 mib_val, u8 peer); extern int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, Loading