|
@@ -191,6 +191,22 @@ ufs_get_pm_lvl_to_link_pwr_state(enum ufs_pm_level lvl)
|
|
|
return ufs_pm_lvl_states[lvl].link_state;
|
|
|
}
|
|
|
|
|
|
+static inline enum ufs_pm_level
|
|
|
+ufs_get_desired_pm_lvl_for_dev_link_state(enum ufs_dev_pwr_mode dev_state,
|
|
|
+ enum uic_link_state link_state)
|
|
|
+{
|
|
|
+ enum ufs_pm_level lvl;
|
|
|
+
|
|
|
+ for (lvl = UFS_PM_LVL_0; lvl < UFS_PM_LVL_MAX; lvl++) {
|
|
|
+ if ((ufs_pm_lvl_states[lvl].dev_state == dev_state) &&
|
|
|
+ (ufs_pm_lvl_states[lvl].link_state == link_state))
|
|
|
+ return lvl;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* if no match found, return the level 0 */
|
|
|
+ return UFS_PM_LVL_0;
|
|
|
+}
|
|
|
+
|
|
|
static struct ufs_dev_fix ufs_fixups[] = {
|
|
|
/* UFS cards deviations table */
|
|
|
UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL,
|
|
@@ -7264,6 +7280,18 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|
|
ufshcd_clkscaling_init_sysfs(hba);
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Set the default power management level for runtime and system PM.
|
|
|
+ * Default power saving mode is to keep UFS link in Hibern8 state
|
|
|
+ * and UFS device in sleep state.
|
|
|
+ */
|
|
|
+ hba->rpm_lvl = ufs_get_desired_pm_lvl_for_dev_link_state(
|
|
|
+ UFS_SLEEP_PWR_MODE,
|
|
|
+ UIC_LINK_HIBERN8_STATE);
|
|
|
+ hba->spm_lvl = ufs_get_desired_pm_lvl_for_dev_link_state(
|
|
|
+ UFS_SLEEP_PWR_MODE,
|
|
|
+ UIC_LINK_HIBERN8_STATE);
|
|
|
+
|
|
|
/* Hold auto suspend until async scan completes */
|
|
|
pm_runtime_get_sync(dev);
|
|
|
|