]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: ufs: ufs-qcom: Add fixup_dev_quirks vops
authorManish Pandey <quic_mapa@quicinc.com>
Tue, 3 Sep 2024 13:15:46 +0000 (18:45 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 4 Oct 2024 02:03:32 +0000 (22:03 -0400)
Add fixup_dev_quirk vops in QCOM UFS platforms and provide an initial
vendor-specific device quirk table to add UFS device specific quirks which
are enabled only for specified UFS devices.

 - Add DELAY_BEFORE_LPM quirk for Skhynix UFS devices to introduce a delay
   before VCC is powered off in QCOM platforms.

 - Add DELAY_AFTER_LPM quirk for Toshiba UFS devices to introduce a delay
   after the VCC power rail is turned off in QCOM platforms.

 - Move UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE quirk from
   ufs_qcom_apply_dev_quirks to ufs_qcom_dev_fixups.

Signed-off-by: Manish Pandey <quic_mapa@quicinc.com>
Link: https://lore.kernel.org/r/20240903131546.1141-1-quic_mapa@quicinc.com
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/host/ufs-qcom.c

index ecdfff2456e31dbadb94920f367b782c7d95c22f..a5a0646bb80a8bd20488b905ac79120584dddb7f 100644 (file)
@@ -828,12 +828,28 @@ static int ufs_qcom_apply_dev_quirks(struct ufs_hba *hba)
        if (hba->dev_quirks & UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME)
                err = ufs_qcom_quirk_host_pa_saveconfigtime(hba);
 
-       if (hba->dev_info.wmanufacturerid == UFS_VENDOR_WDC)
-               hba->dev_quirks |= UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE;
-
        return err;
 }
 
+/* UFS device-specific quirks */
+static struct ufs_dev_quirk ufs_qcom_dev_fixups[] = {
+       { .wmanufacturerid = UFS_VENDOR_SKHYNIX,
+         .model = UFS_ANY_MODEL,
+         .quirk = UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM },
+       { .wmanufacturerid = UFS_VENDOR_TOSHIBA,
+         .model = UFS_ANY_MODEL,
+         .quirk = UFS_DEVICE_QUIRK_DELAY_AFTER_LPM },
+       { .wmanufacturerid = UFS_VENDOR_WDC,
+         .model = UFS_ANY_MODEL,
+         .quirk = UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE },
+       {}
+};
+
+static void ufs_qcom_fixup_dev_quirks(struct ufs_hba *hba)
+{
+       ufshcd_fixup_dev_quirks(hba, ufs_qcom_dev_fixups);
+}
+
 static u32 ufs_qcom_get_ufs_hci_version(struct ufs_hba *hba)
 {
        return ufshci_version(2, 0);
@@ -1801,6 +1817,7 @@ static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = {
        .link_startup_notify    = ufs_qcom_link_startup_notify,
        .pwr_change_notify      = ufs_qcom_pwr_change_notify,
        .apply_dev_quirks       = ufs_qcom_apply_dev_quirks,
+       .fixup_dev_quirks       = ufs_qcom_fixup_dev_quirks,
        .suspend                = ufs_qcom_suspend,
        .resume                 = ufs_qcom_resume,
        .dbg_register_dump      = ufs_qcom_dump_dbg_regs,