]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: pcs: add generic mode-to-pll-speed mapper
authorJonas Jelonek <jelonek.jonas@gmail.com>
Tue, 24 Feb 2026 11:58:14 +0000 (11:58 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 14 Mar 2026 19:24:32 +0000 (20:24 +0100)
Add a mapper function to infer the to-be-selected PLL speed from the
desired SerDes hardware mode. This avoids having similar logic in each
CMU implementation.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22198
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c

index 80d4d46bd5dae012f8252dad0d53d5780ecc9f54..5e1ca2584e7b6eda9e82ed61351ad782a779b042 100644 (file)
@@ -516,6 +516,34 @@ static void rtpcs_generic_sds_restart_autoneg(struct rtpcs_serdes *sds)
        rtpcs_sds_write_field(sds, &sds->regs->an_restart, 0x1);
 }
 
+static int rtpcs_sds_select_pll_speed(enum rtpcs_sds_mode hw_mode, enum rtpcs_sds_pll_speed *speed)
+{
+       switch (hw_mode) {
+       case RTPCS_SDS_MODE_1000BASEX:
+       case RTPCS_SDS_MODE_SGMII:
+       case RTPCS_SDS_MODE_QSGMII:
+               *speed = RTPCS_SDS_PLL_SPD_1000;
+               break;
+       case RTPCS_SDS_MODE_2500BASEX:
+               *speed = RTPCS_SDS_PLL_SPD_2500;
+               break;
+       case RTPCS_SDS_MODE_10GBASER:
+       case RTPCS_SDS_MODE_XSGMII:
+       case RTPCS_SDS_MODE_USXGMII_10GSXGMII:
+       case RTPCS_SDS_MODE_USXGMII_10GDXGMII:
+       case RTPCS_SDS_MODE_USXGMII_10GQXGMII:
+       case RTPCS_SDS_MODE_USXGMII_5GSXGMII:
+       case RTPCS_SDS_MODE_USXGMII_5GDXGMII:
+       case RTPCS_SDS_MODE_USXGMII_2_5GSXGMII:
+               *speed = RTPCS_SDS_PLL_SPD_10000;
+               break;
+       default:
+               return -ENOTSUPP;
+       }
+
+       return 0;
+}
+
 /* Variant-specific functions */
 
 /* RTL838X */
@@ -1449,15 +1477,9 @@ static int rtpcs_930x_sds_config_pll(struct rtpcs_serdes *sds,
 
        rtpcs_930x_sds_get_pll_data(nb_sds, neighbor_pll, &neighbor_speed);
 
-       if ((hw_mode == RTPCS_SDS_MODE_1000BASEX) ||
-           (hw_mode == RTPCS_SDS_MODE_SGMII))
-               speed = RTPCS_SDS_PLL_SPD_1000;
-       else if (hw_mode == RTPCS_SDS_MODE_2500BASEX)
-               speed = RTPCS_SDS_PLL_SPD_2500;
-       else if (hw_mode == RTPCS_SDS_MODE_10GBASER)
-               speed = RTPCS_SDS_PLL_SPD_10000;
-       else
-               return -ENOTSUPP;
+       ret = rtpcs_sds_select_pll_speed(hw_mode, &speed);
+       if (ret < 0)
+               return ret;
 
        if (!neighbor_mode)
                pll = speed == RTPCS_SDS_PLL_SPD_10000 ? RTPCS_SDS_PLL_TYPE_LC