/* 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
  */
 #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",
 
 
 static void ufshcd_vreg_set_lpm(struct ufs_hba *hba)
 {
+       /*
+        * 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.
+        */
+       if (!ufshcd_is_link_active(hba) &&
+           hba->dev_quirks & UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM)
+               usleep_range(2000, 2100);
+
        /*
         * If UFS device is either in UFS_Sleep turn off VCC rail to save some
         * power.