]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
phy: qcom-qmp-ufs: Refactor UFS PHY reset
authorNitin Rawat <quic_nitirawa@quicinc.com>
Mon, 26 May 2025 15:38:16 +0000 (21:08 +0530)
committerVinod Koul <vkoul@kernel.org>
Sun, 15 Jun 2025 14:23:24 +0000 (19:53 +0530)
Refactor the UFS PHY reset handling to parse the reset logic only once
during initialization, instead of every resume.

As part of this change, move the UFS PHY reset parsing logic from
qmp_phy_power_on to the new qmp_ufs_phy_init function introduced
as part of phy_ops::init callback.

Co-developed-by: Ram Kumar Dwivedi <quic_rdwivedi@quicinc.com>
Signed-off-by: Ram Kumar Dwivedi <quic_rdwivedi@quicinc.com>
Signed-off-by: Nitin Rawat <quic_nitirawa@quicinc.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250526153821.7918-6-quic_nitirawa@quicinc.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/qualcomm/phy-qcom-qmp-ufs.c

index ade8e9c4b9ae282d49e221a88132d148969bfe88..33d238cf49aa2a399318eaa75659b4a352673ae9 100644 (file)
@@ -1800,38 +1800,11 @@ static int qmp_ufs_com_exit(struct qmp_ufs *qmp)
 static int qmp_ufs_power_on(struct phy *phy)
 {
        struct qmp_ufs *qmp = phy_get_drvdata(phy);
-       const struct qmp_phy_cfg *cfg = qmp->cfg;
        int ret;
        dev_vdbg(qmp->dev, "Initializing QMP phy\n");
 
-       if (cfg->no_pcs_sw_reset) {
-               /*
-                * Get UFS reset, which is delayed until now to avoid a
-                * circular dependency where UFS needs its PHY, but the PHY
-                * needs this UFS reset.
-                */
-               if (!qmp->ufs_reset) {
-                       qmp->ufs_reset =
-                               devm_reset_control_get_exclusive(qmp->dev,
-                                                                "ufsphy");
-
-                       if (IS_ERR(qmp->ufs_reset)) {
-                               ret = PTR_ERR(qmp->ufs_reset);
-                               dev_err(qmp->dev,
-                                       "failed to get UFS reset: %d\n",
-                                       ret);
-
-                               qmp->ufs_reset = NULL;
-                               return ret;
-                       }
-               }
-       }
-
        ret = qmp_ufs_com_init(qmp);
-       if (ret)
-               return ret;
-
-       return 0;
+       return ret;
 }
 
 static int qmp_ufs_phy_calibrate(struct phy *phy)
@@ -1925,7 +1898,37 @@ static int qmp_ufs_set_mode(struct phy *phy, enum phy_mode mode, int submode)
        return 0;
 }
 
+static int qmp_ufs_phy_init(struct phy *phy)
+{
+       struct qmp_ufs *qmp = phy_get_drvdata(phy);
+       const struct qmp_phy_cfg *cfg = qmp->cfg;
+       int ret;
+
+       if (!cfg->no_pcs_sw_reset)
+               return 0;
+
+       /*
+        * Get UFS reset, which is delayed until now to avoid a
+        * circular dependency where UFS needs its PHY, but the PHY
+        * needs this UFS reset.
+        */
+       if (!qmp->ufs_reset) {
+               qmp->ufs_reset =
+                       devm_reset_control_get_exclusive(qmp->dev, "ufsphy");
+
+               if (IS_ERR(qmp->ufs_reset)) {
+                       ret = PTR_ERR(qmp->ufs_reset);
+                       dev_err(qmp->dev, "failed to get PHY reset: %d\n", ret);
+                       qmp->ufs_reset = NULL;
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
 static const struct phy_ops qcom_qmp_ufs_phy_ops = {
+       .init           = qmp_ufs_phy_init,
        .power_on       = qmp_ufs_power_on,
        .power_off      = qmp_ufs_disable,
        .calibrate      = qmp_ufs_phy_calibrate,