]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
phy: qcom-sgmii-eth: relax order of .power_on() vs .set_mode*()
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tue, 3 Mar 2026 15:54:01 +0000 (15:54 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 6 Mar 2026 02:43:07 +0000 (18:43 -0800)
Allow any order of the .power_on() and .set_mode*() methods as per the
recent discussion. This means phy_power_on() with this SerDes will now
restore the previous setup without requiring a subsequent
phy_set_mode*() call.

Tested-by: Mohd Ayaan Anwar <mohd.anwar@oss.qualcomm.com>
Acked-by: Vinod Koul <vkoul@kernel.org>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1vxS4P-0000000BQXs-0vGB@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/phy/qualcomm/phy-qcom-sgmii-eth.c

index 6332ff291fdf558b3c434f61c0fb04bd783dbf9e..f48faa2929a682be6024ee349fac6fd1b6464cb3 100644 (file)
@@ -271,8 +271,17 @@ static int qcom_dwmac_sgmii_phy_calibrate(struct phy *phy)
 static int qcom_dwmac_sgmii_phy_power_on(struct phy *phy)
 {
        struct qcom_dwmac_sgmii_phy_data *data = phy_get_drvdata(phy);
+       int ret;
+
+       ret = clk_prepare_enable(data->refclk);
+       if (ret < 0)
+               return ret;
 
-       return clk_prepare_enable(data->refclk);
+       ret = qcom_dwmac_sgmii_phy_calibrate(phy);
+       if (ret < 0)
+               clk_disable_unprepare(data->refclk);
+
+       return ret;
 }
 
 static int qcom_dwmac_sgmii_phy_power_off(struct phy *phy)
@@ -318,6 +327,9 @@ static int qcom_dwmac_sgmii_phy_set_mode(struct phy *phy, enum phy_mode mode,
        if (submode != data->interface)
                data->interface = submode;
 
+       if (phy->power_count == 0)
+               return 0;
+
        return qcom_dwmac_sgmii_phy_calibrate(phy);
 }