[PATCH v1] soc: qcom: ice: Prevent UFS probe deferral on ICE probe failure

Yuvaraj Ranganathan posted 1 patch 1 day, 6 hours ago
drivers/soc/qcom/ice.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
[PATCH v1] soc: qcom: ice: Prevent UFS probe deferral on ICE probe failure
Posted by Yuvaraj Ranganathan 1 day, 6 hours ago
When the ICE key programming interface is unavailable, the ice create
function fails, causing the probe to set NULL as the driver data. As a 
result, when the UFS driver reads the ICE driver data and encounters a 
NULL, leading to the deferral of the UFS probe and preventing the device
from booting to the shell.

To address this issue, modify the behavior to return an "operation not
supported" error when the ICE key programming interface is unavailable.
Additionally, mark this error in a global variable. When the UFS driver
attempts to read the ICE driver data, it will check for this error and
return it, rather than deferring the probe.

Signed-off-by: Yuvaraj Ranganathan <quic_yrangana@quicinc.com>
---
 drivers/soc/qcom/ice.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/soc/qcom/ice.c b/drivers/soc/qcom/ice.c
index 393d2d1d275f..160916cb8fb0 100644
--- a/drivers/soc/qcom/ice.c
+++ b/drivers/soc/qcom/ice.c
@@ -41,6 +41,8 @@
 #define qcom_ice_readl(engine, reg)	\
 	readl((engine)->base + (reg))
 
+static bool qcom_ice_create_error;
+
 struct qcom_ice {
 	struct device *dev;
 	void __iomem *base;
@@ -215,7 +217,7 @@ static struct qcom_ice *qcom_ice_create(struct device *dev,
 
 	if (!qcom_scm_ice_available()) {
 		dev_warn(dev, "ICE SCM interface not found\n");
-		return NULL;
+		return ERR_PTR(-EOPNOTSUPP);
 	}
 
 	engine = devm_kzalloc(dev, sizeof(*engine), GFP_KERNEL);
@@ -303,6 +305,9 @@ struct qcom_ice *of_qcom_ice_get(struct device *dev)
 		return ERR_PTR(-EPROBE_DEFER);
 	}
 
+	if (qcom_ice_create_error)
+		return ERR_PTR(-EOPNOTSUPP);
+
 	ice = platform_get_drvdata(pdev);
 	if (!ice) {
 		dev_err(dev, "Cannot get ice instance from %s\n",
@@ -336,8 +341,10 @@ static int qcom_ice_probe(struct platform_device *pdev)
 	}
 
 	engine = qcom_ice_create(&pdev->dev, base);
-	if (IS_ERR(engine))
+	if (IS_ERR(engine)) {
+		qcom_ice_create_error = true;
 		return PTR_ERR(engine);
+	}
 
 	platform_set_drvdata(pdev, engine);
 
-- 
2.34.1