realtek: pcs: add separate SerDes struct

Add a separate structure for a SerDes. This is needed to appropriately
store per-SerDes information, which in turn is needed for future work.
Additionally, it's intended to reduce boilerplate and several
inconsistencies.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/21146
Signed-off-by: Robert Marko <robimarko@gmail.com>
This commit is contained in:
Jonas Jelonek
2025-12-13 10:12:35 +00:00
committed by Robert Marko
parent 6cf33aacfe
commit 6b3f8fb16f

View File

@@ -129,11 +129,20 @@ enum rtpcs_sds_mode {
RTPCS_SDS_MODE_USXGMII_2_5GSXGMII, RTPCS_SDS_MODE_USXGMII_2_5GSXGMII,
}; };
struct rtpcs_ctrl;
struct rtpcs_serdes {
struct rtpcs_ctrl *ctrl;
u8 id;
enum rtpcs_sds_mode mode;
};
struct rtpcs_ctrl { struct rtpcs_ctrl {
struct device *dev; struct device *dev;
struct regmap *map; struct regmap *map;
struct mii_bus *bus; struct mii_bus *bus;
const struct rtpcs_config *cfg; const struct rtpcs_config *cfg;
struct rtpcs_serdes serdes[RTPCS_SDS_CNT];
struct rtpcs_link *link[RTPCS_PORT_CNT]; struct rtpcs_link *link[RTPCS_PORT_CNT];
bool rx_pol_inv[RTPCS_SDS_CNT]; bool rx_pol_inv[RTPCS_SDS_CNT];
bool tx_pol_inv[RTPCS_SDS_CNT]; bool tx_pol_inv[RTPCS_SDS_CNT];
@@ -3025,9 +3034,10 @@ static int rtpcs_probe(struct platform_device *pdev)
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct device_node *child; struct device_node *child;
struct rtpcs_serdes *sds;
struct rtpcs_ctrl *ctrl; struct rtpcs_ctrl *ctrl;
u32 sds; u32 sds_id;
int ret; int i, ret;
ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL); ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL);
if (!ctrl) if (!ctrl)
@@ -3045,15 +3055,21 @@ static int rtpcs_probe(struct platform_device *pdev)
if (IS_ERR(ctrl->bus)) if (IS_ERR(ctrl->bus))
return PTR_ERR(ctrl->bus); return PTR_ERR(ctrl->bus);
for (i = 0; i < ctrl->cfg->serdes_count; i++) {
sds = &ctrl->serdes[i];
sds->ctrl = ctrl;
sds->id = i;
}
for_each_child_of_node(dev->of_node, child) { for_each_child_of_node(dev->of_node, child) {
ret = of_property_read_u32(child, "reg", &sds); ret = of_property_read_u32(child, "reg", &sds_id);
if (ret) if (ret)
return ret; return ret;
if (sds >= ctrl->cfg->serdes_count) if (sds >= ctrl->cfg->serdes_count)
return -EINVAL; return -EINVAL;
ctrl->rx_pol_inv[sds] = of_property_read_bool(child, "realtek,pnswap-rx"); ctrl->rx_pol_inv[sds_id] = of_property_read_bool(child, "realtek,pnswap-rx");
ctrl->tx_pol_inv[sds] = of_property_read_bool(child, "realtek,pnswap-tx"); ctrl->tx_pol_inv[sds_id] = of_property_read_bool(child, "realtek,pnswap-tx");
} }
if (ctrl->cfg->init_serdes_common) { if (ctrl->cfg->init_serdes_common) {