aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/ufs/ufs_quirks.h14
-rw-r--r--drivers/scsi/ufs/ufshcd.c10
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
122struct ufs_hba; 130struct ufs_hba;
123void ufs_advertise_fixup_device(struct ufs_hba *hba); 131void ufs_advertise_fixup_device(struct ufs_hba *hba);
124 132
125static struct ufs_dev_fix ufs_fixups[] = { 133static 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:
5716static void ufshcd_vreg_set_lpm(struct ufs_hba *hba) 5716static 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 *