[openwrt/openwrt] realtek: pcs: rtl931x: add helper for SerDes power up/down

LEDE Commits lede-commits at lists.infradead.org
Tue Dec 23 09:56:45 PST 2025


hauke pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/b43f7bc9c21c291426852f3a499b4814f2b686d1

commit b43f7bc9c21c291426852f3a499b4814f2b686d1
Author: Jonas Jelonek <jelonek.jonas at gmail.com>
AuthorDate: Mon Dec 15 19:41:16 2025 +0000

    realtek: pcs: rtl931x: add helper for SerDes power up/down
    
    Add a dedicated helper 'rtpcs_931x_sds_power' to power down/up a SerDes.
    Up to now, plain register writes to the corresponding register were used
    in several places and with slightly different syntax. Use the helper to
    replace the existing boilerplate code for powering on/off SerDes.
    
    Signed-off-by: Jonas Jelonek <jelonek.jonas at gmail.com>
    Link: https://github.com/openwrt/openwrt/pull/21184
    Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
---
 .../files-6.12/drivers/net/pcs/pcs-rtl-otto.c      | 29 +++++++++++-----------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c b/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c
index fde80b66ba..d2268ae76d 100644
--- a/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c
+++ b/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c
@@ -2305,18 +2305,25 @@ static int rtpcs_930x_setup_serdes(struct rtpcs_serdes *sds,
 
 /* RTL931X */
 
+static int rtpcs_931x_sds_power(struct rtpcs_serdes *sds, bool power_on)
+{
+	u32 en_val = power_on ? 0 : BIT(sds->id);
+
+	return regmap_write_bits(sds->ctrl->map,
+				 RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR,
+				 BIT(sds->id), en_val);
+}
+
 static void rtpcs_931x_sds_reset(struct rtpcs_serdes *sds)
 {
 	struct rtpcs_ctrl *ctrl = sds->ctrl;
 	u32 sds_id = sds->id;
-	u32 o, v, o_mode;
+	u32 v, o_mode;
 	int shift = ((sds_id & 0x3) << 3);
 
 	/* TODO: We need to lock this! */
 
-	regmap_read(ctrl->map, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR, &o);
-	v = o | BIT(sds_id);
-	regmap_write(ctrl->map, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR, v);
+	rtpcs_931x_sds_power(sds, false);
 
 	regmap_read(ctrl->map, RTL931X_SERDES_MODE_CTRL + 4 * (sds_id >> 2), &o_mode);
 	v = BIT(7) | 0x1F;
@@ -2324,7 +2331,7 @@ static void rtpcs_931x_sds_reset(struct rtpcs_serdes *sds)
 			  0xff << shift, v << shift);
 	regmap_write(ctrl->map, RTL931X_SERDES_MODE_CTRL + 4 * (sds_id >> 2), o_mode);
 
-	regmap_write(ctrl->map, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR, o);
+	rtpcs_931x_sds_power(sds, true);
 }
 
 static void rtpcs_931x_sds_disable(struct rtpcs_serdes *sds)
@@ -2809,8 +2816,8 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds,
 	};
 	struct rtpcs_serdes *even_sds = rtpcs_sds_get_even(sds);
 	struct rtpcs_ctrl *ctrl = sds->ctrl;
-	u32 band, ori, model_info, val;
 	enum rtpcs_sds_mode hw_mode;
+	u32 band, model_info, val;
 	u32 sds_id = sds->id;
 	int ret, chiptype = 0;
 
@@ -2852,10 +2859,7 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds,
 
 	pr_info("%s: 2.5gbit %08X", __func__, rtpcs_sds_read(sds, 0x41, 0x14));
 
-	regmap_read(ctrl->map, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR, &ori);
-	pr_info("%s: RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR 0x%08X\n", __func__, ori);
-	val = ori | (1 << sds_id);
-	regmap_write(ctrl->map, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR, val);
+	rtpcs_931x_sds_power(sds, false);
 
 	/* this was in rtl931x_phylink_mac_config in dsa/rtl83xx/dsa.c before */
 	band = rtpcs_931x_sds_cmu_band_get(sds, mode);
@@ -2893,10 +2897,7 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds,
 
 	rtpcs_931x_sds_set_polarity(sds, sds->tx_pol_inv, sds->rx_pol_inv);
 
-	val = ori & ~BIT(sds_id);
-	regmap_write(ctrl->map, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR, val);
-	regmap_read(ctrl->map, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR, &val);
-	pr_debug("%s: RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR 0x%08X\n", __func__, val);
+	rtpcs_931x_sds_power(sds, true);
 
 	if (mode == PHY_INTERFACE_MODE_XGMII ||
 	    mode == PHY_INTERFACE_MODE_QSGMII ||




More information about the lede-commits mailing list