|
@@ -18,7 +18,7 @@
|
|
|
/* return true if s1 is a prefix of s2 */
|
|
|
#define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1))
|
|
|
|
|
|
-#define UFS_ANY_VENDOR -1
|
|
|
+#define UFS_ANY_VENDOR 0xFFFF
|
|
|
#define UFS_ANY_MODEL "ANY_MODEL"
|
|
|
|
|
|
#define MAX_MODEL_LEN 16
|
|
@@ -119,16 +119,28 @@ struct ufs_dev_fix {
|
|
|
*/
|
|
|
#define UFS_DEVICE_NO_FASTAUTO (1 << 5)
|
|
|
|
|
|
+/*
|
|
|
+ * It seems some UFS devices may keep drawing more than sleep current
|
|
|
+ * (atleast for 500us) from UFS rails (especially from VCCQ rail).
|
|
|
+ * To avoid this situation, add 2ms delay before putting these UFS
|
|
|
+ * rails in LPM mode.
|
|
|
+ */
|
|
|
+#define UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM (1 << 6)
|
|
|
+
|
|
|
struct ufs_hba;
|
|
|
void ufs_advertise_fixup_device(struct ufs_hba *hba);
|
|
|
|
|
|
static struct ufs_dev_fix ufs_fixups[] = {
|
|
|
/* UFS cards deviations table */
|
|
|
+ UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL,
|
|
|
+ UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM),
|
|
|
UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, UFS_DEVICE_NO_VCCQ),
|
|
|
UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL,
|
|
|
UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS),
|
|
|
UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL,
|
|
|
UFS_DEVICE_NO_FASTAUTO),
|
|
|
+ UFS_FIX(UFS_VENDOR_TOSHIBA, UFS_ANY_MODEL,
|
|
|
+ UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM),
|
|
|
UFS_FIX(UFS_VENDOR_TOSHIBA, "THGLF2G9C8KBADG",
|
|
|
UFS_DEVICE_QUIRK_PA_TACTIVATE),
|
|
|
UFS_FIX(UFS_VENDOR_TOSHIBA, "THGLF2G9D8KBADG",
|