diff options
| -rw-r--r-- | drivers/scsi/ufs/ufs_quirks.h | 14 | ||||
| -rw-r--r-- | drivers/scsi/ufs/ufshcd.c | 10 |
2 files changed, 23 insertions, 1 deletions
diff --git a/drivers/scsi/ufs/ufs_quirks.h b/drivers/scsi/ufs/ufs_quirks.h index 62ebd89fd787..ee4ab85e2801 100644 --- a/drivers/scsi/ufs/ufs_quirks.h +++ b/drivers/scsi/ufs/ufs_quirks.h | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | /* return true if s1 is a prefix of s2 */ | 18 | /* return true if s1 is a prefix of s2 */ |
| 19 | #define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1)) | 19 | #define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1)) |
| 20 | 20 | ||
| 21 | #define UFS_ANY_VENDOR -1 | 21 | #define UFS_ANY_VENDOR 0xFFFF |
| 22 | #define UFS_ANY_MODEL "ANY_MODEL" | 22 | #define UFS_ANY_MODEL "ANY_MODEL" |
| 23 | 23 | ||
| 24 | #define MAX_MODEL_LEN 16 | 24 | #define MAX_MODEL_LEN 16 |
| @@ -119,16 +119,28 @@ struct ufs_dev_fix { | |||
| 119 | */ | 119 | */ |
| 120 | #define UFS_DEVICE_NO_FASTAUTO (1 << 5) | 120 | #define UFS_DEVICE_NO_FASTAUTO (1 << 5) |
| 121 | 121 | ||
| 122 | /* | ||
| 123 | * It seems some UFS devices may keep drawing more than sleep current | ||
| 124 | * (atleast for 500us) from UFS rails (especially from VCCQ rail). | ||
| 125 | * To avoid this situation, add 2ms delay before putting these UFS | ||
| 126 | * rails in LPM mode. | ||
| 127 | */ | ||
| 128 | #define UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM (1 << 6) | ||
| 129 | |||
| 122 | struct ufs_hba; | 130 | struct ufs_hba; |
| 123 | void ufs_advertise_fixup_device(struct ufs_hba *hba); | 131 | void ufs_advertise_fixup_device(struct ufs_hba *hba); |
| 124 | 132 | ||
| 125 | static struct ufs_dev_fix ufs_fixups[] = { | 133 | static struct ufs_dev_fix ufs_fixups[] = { |
| 126 | /* UFS cards deviations table */ | 134 | /* UFS cards deviations table */ |
| 135 | UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, | ||
| 136 | UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM), | ||
| 127 | UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, UFS_DEVICE_NO_VCCQ), | 137 | UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, UFS_DEVICE_NO_VCCQ), |
| 128 | UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, | 138 | UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, |
| 129 | UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS), | 139 | UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS), |
| 130 | UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, | 140 | UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, |
| 131 | UFS_DEVICE_NO_FASTAUTO), | 141 | UFS_DEVICE_NO_FASTAUTO), |
| 142 | UFS_FIX(UFS_VENDOR_TOSHIBA, UFS_ANY_MODEL, | ||
| 143 | UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM), | ||
| 132 | UFS_FIX(UFS_VENDOR_TOSHIBA, "THGLF2G9C8KBADG", | 144 | UFS_FIX(UFS_VENDOR_TOSHIBA, "THGLF2G9C8KBADG", |
| 133 | UFS_DEVICE_QUIRK_PA_TACTIVATE), | 145 | UFS_DEVICE_QUIRK_PA_TACTIVATE), |
| 134 | UFS_FIX(UFS_VENDOR_TOSHIBA, "THGLF2G9D8KBADG", | 146 | UFS_FIX(UFS_VENDOR_TOSHIBA, "THGLF2G9D8KBADG", |
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 93cc02f2d48e..f8fa72c31a9d 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c | |||
| @@ -5716,6 +5716,16 @@ out: | |||
| 5716 | static void ufshcd_vreg_set_lpm(struct ufs_hba *hba) | 5716 | static void ufshcd_vreg_set_lpm(struct ufs_hba *hba) |
| 5717 | { | 5717 | { |
| 5718 | /* | 5718 | /* |
| 5719 | * It seems some UFS devices may keep drawing more than sleep current | ||
| 5720 | * (atleast for 500us) from UFS rails (especially from VCCQ rail). | ||
| 5721 | * To avoid this situation, add 2ms delay before putting these UFS | ||
| 5722 | * rails in LPM mode. | ||
| 5723 | */ | ||
| 5724 | if (!ufshcd_is_link_active(hba) && | ||
| 5725 | hba->dev_quirks & UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM) | ||
| 5726 | usleep_range(2000, 2100); | ||
| 5727 | |||
| 5728 | /* | ||
| 5719 | * If UFS device is either in UFS_Sleep turn off VCC rail to save some | 5729 | * If UFS device is either in UFS_Sleep turn off VCC rail to save some |
| 5720 | * power. | 5730 | * power. |
| 5721 | * | 5731 | * |
