scsi: ufs: qcom: Add UFSHCD_QUIRK_BROKEN_LSDBS_CAP for SM8550 SoC

SM8550 SoC has the UFSHCI 4.0 compliant UFS controller and only supports
legacy single doorbell mode without MCQ. But due to a hardware bug, it
reports 1 in the 'Legacy Queue & Single Doorbell Support (LSDBS)' field of
the Controller Capabilities register. This field is supposed to read as 0
if legacy single doorbell mode is supported and 1 otherwise.

Starting with commit 0c60eb0cc320 ("scsi: ufs: core: Check LSDBS cap when
!mcq"), ufshcd driver is now relying on the LSDBS field to decide when to
use the legacy doorbell mode if MCQ is not supported. And this ends up
breaking UFS on SM8550:

ufshcd-qcom 1d84000.ufs: ufshcd_init: failed to initialize (legacy doorbell mode not supported)
ufshcd-qcom 1d84000.ufs: error -EINVAL: Initialization failed with error -22

So use the UFSHCD_QUIRK_BROKEN_LSDBS_CAP quirk for SM8550 SoC so that the
ufshcd driver could use legacy doorbell mode correctly.

Fixes: 0c60eb0cc320 ("scsi: ufs: core: Check LSDBS cap when !mcq")
Tested-by: Amit Pundir <amit.pundir@linaro.org>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://lore.kernel.org/r/20240816-ufs-bug-fix-v3-2-e6fe0e18e2a3@linaro.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by Manivannan Sadhasivam and committed by Martin K. Petersen ea593e02 cd06b713

+5 -1
+5 -1
drivers/ufs/host/ufs-qcom.c
··· 857 857 858 858 if (host->hw_ver.major > 0x3) 859 859 hba->quirks |= UFSHCD_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH; 860 + 861 + if (of_device_is_compatible(hba->dev->of_node, "qcom,sm8550-ufshc")) 862 + hba->quirks |= UFSHCD_QUIRK_BROKEN_LSDBS_CAP; 860 863 } 861 864 862 865 static void ufs_qcom_set_phy_gear(struct ufs_qcom_host *host) ··· 1850 1847 } 1851 1848 1852 1849 static const struct of_device_id ufs_qcom_of_match[] __maybe_unused = { 1853 - { .compatible = "qcom,ufshc"}, 1850 + { .compatible = "qcom,ufshc" }, 1851 + { .compatible = "qcom,sm8550-ufshc" }, 1854 1852 {}, 1855 1853 }; 1856 1854 MODULE_DEVICE_TABLE(of, ufs_qcom_of_match);