From c3d33b827cb2dfbdddd8fc704d1822117f1a15fd Mon Sep 17 00:00:00 2001 From: Mallikarjun Kasoju Date: Thu, 12 Sep 2024 04:56:51 +0000 Subject: [PATCH] ufs: Enable ufs for RDL fix parts only Read fuse to check if chip has RDL fix or not. Return error for non-RDL chips. Bug 4243018 Signed-off-by: Mallikarjun Kasoju Change-Id: Ibe441ca136c18e03cebbc1cd5d0cc529d45005c6 --- drivers/scsi/ufs/ufs-tegra-common.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/scsi/ufs/ufs-tegra-common.c b/drivers/scsi/ufs/ufs-tegra-common.c index a102232d..08b5091f 100644 --- a/drivers/scsi/ufs/ufs-tegra-common.c +++ b/drivers/scsi/ufs/ufs-tegra-common.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -178,6 +179,10 @@ static int ufs_tegra_mphy_receiver_calibration(struct ufs_tegra_host *ufs_tegra, MPHY_GO_BIT, mphy_rx_vendor2_reg); } +/* Fuse register offset to know if chip is RDL part or not */ +#define TEGRA_FUSE_OPT_LOT_CODE_0_0 0x108U +#define NON_RDL_STRUCTURE 0x90570c8 +#define NON_RDL_LEAD 0x83c1002 if (ufs_tegra->x2config == true) { /* Wait till lane calibration is done */ @@ -2289,6 +2294,24 @@ static int ufs_tegra_probe(struct platform_device *pdev) { int err; struct device *dev = &pdev->dev; + unsigned int value; + + if (tegra_platform_is_silicon()) { + /* Do not enable ufs on non-rdl part*/ + err = tegra_fuse_readl(TEGRA_FUSE_OPT_LOT_CODE_0_0, &value); + if (err) { + dev_err(dev, "%s rdl fuse read failed err: %d val: %#x\n", __func__, err, value); + goto end; + } + if ((value == NON_RDL_STRUCTURE) || + (value == NON_RDL_LEAD)) { + dev_info(dev, "%s This is non-rdl part. No support for UFS %#x\n", __func__, value); + err = -ENODEV; + goto end; + } else { + dev_dbg(dev, "%s This is rdl part. UFS is supported %#x\n", __func__, value); + } + } /* Perform generic probe */ err = ufshcd_pltfrm_init(pdev, &ufs_hba_tegra_vops); @@ -2296,6 +2319,7 @@ static int ufs_tegra_probe(struct platform_device *pdev) if (err != -EPROBE_DEFER) dev_err(dev, "ufshcd_pltfrm_init() failed %d\n", err); } +end: return err; }