mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 10:31:33 -04:00
phy: zynqmp: fix clock error handling in xpsgtr_phy_init()
Propagate clk_prepare_enable() failures to the caller instead of
returning success, and disable the reference clock on initialization
error paths to avoid leaking clock references when phy_exit() is not
called.
Fixes: 25d7008335 ("phy: xilinx: phy-zynqmp: dynamic clock support for power-save")
Signed-off-by: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
Reviewed-by: Michal Simek <michal.simek@amd.com>
Link: https://patch.msgid.link/20260720153832.1130006-2-radhey.shyam.pandey@amd.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
committed by
Vinod Koul
parent
be2b5b17b7
commit
e4779e2a16
@@ -658,12 +658,13 @@ static int xpsgtr_phy_init(struct phy *phy)
|
||||
{
|
||||
struct xpsgtr_phy *gtr_phy = phy_get_drvdata(phy);
|
||||
struct xpsgtr_dev *gtr_dev = gtr_phy->dev;
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
mutex_lock(>r_dev->gtr_mutex);
|
||||
|
||||
/* Configure and enable the clock when peripheral phy_init call */
|
||||
if (clk_prepare_enable(gtr_dev->clk[gtr_phy->refclk]))
|
||||
ret = clk_prepare_enable(gtr_dev->clk[gtr_phy->refclk]);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* Skip initialization if not required. */
|
||||
@@ -673,7 +674,7 @@ static int xpsgtr_phy_init(struct phy *phy)
|
||||
if (gtr_dev->tx_term_fix) {
|
||||
ret = xpsgtr_phy_tx_term_fix(gtr_phy);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
goto out_disable_clk;
|
||||
|
||||
gtr_dev->tx_term_fix = false;
|
||||
}
|
||||
@@ -687,7 +688,7 @@ static int xpsgtr_phy_init(struct phy *phy)
|
||||
*/
|
||||
ret = xpsgtr_configure_pll(gtr_phy);
|
||||
if (ret)
|
||||
goto out;
|
||||
goto out_disable_clk;
|
||||
|
||||
xpsgtr_lane_set_protocol(gtr_phy);
|
||||
|
||||
@@ -705,6 +706,10 @@ static int xpsgtr_phy_init(struct phy *phy)
|
||||
break;
|
||||
}
|
||||
|
||||
goto out;
|
||||
|
||||
out_disable_clk:
|
||||
clk_disable_unprepare(gtr_dev->clk[gtr_phy->refclk]);
|
||||
out:
|
||||
mutex_unlock(>r_dev->gtr_mutex);
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user