Commit d58b9ff4 authored by Nitin Rawat's avatar Nitin Rawat Committed by Vinod Koul
Browse files

phy: qcom-qmp-ufs: Refactor UFS PHY reset



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: default avatarRam Kumar Dwivedi <quic_rdwivedi@quicinc.com>
Signed-off-by: default avatarRam Kumar Dwivedi <quic_rdwivedi@quicinc.com>
Signed-off-by: default avatarNitin Rawat <quic_nitirawa@quicinc.com>
Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250526153821.7918-6-quic_nitirawa@quicinc.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent cbfd6c12
Loading
Loading
Loading
Loading
+31 −28
Original line number Diff line number Diff line
@@ -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;
}

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,