]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: stmmac: rk: introduce flags indicating support for RGMII/RMII
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Wed, 4 Feb 2026 09:14:17 +0000 (09:14 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 5 Feb 2026 17:20:37 +0000 (09:20 -0800)
Introduce two boolean flags into struct rk_priv_data indicating
whether RGMII and/or RMII is supported for this instance. Use these
to configure the supported_interfaces mask for phylink, validate the
interface mode. Initialise these from equivalent flags in the
rk_gmac_ops or depending on the presence of the ops->set_to_rgmii and
ops->set_to_mii methods. Finally, make ops->set_to_* optional.

This will allow us to get rid of empty set_to_rmii() methods.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Tested-by: Heiko Stuebner <heiko@sntech.de> #px30,rk3328,rk3568,rk3588
Link: https://patch.msgid.link/E1vnYxl-00000007hol-3XiH@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c

index c56cc40683a33a9c20b91b3027122c35f6da6c9e..73d471844022ac42220edfebd213f4b031a9c788 100644 (file)
@@ -53,6 +53,8 @@ struct rk_gmac_ops {
 
        bool gmac_grf_reg_in_php;
        bool clock_grf_reg_in_php;
+       bool supports_rgmii;
+       bool supports_rmii;
        bool php_grf_required;
        bool regs_valid;
        u32 regs[];
@@ -86,6 +88,8 @@ struct rk_priv_data {
        bool clk_enabled;
        bool clock_input;
        bool integrated_phy;
+       bool supports_rgmii;
+       bool supports_rmii;
 
        struct clk_bulk_data *clks;
        int num_clks;
@@ -1415,6 +1419,9 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
        bsp_priv->clock_grf_reg = ops->clock_grf_reg;
        bsp_priv->clock = ops->clock;
 
+       bsp_priv->supports_rgmii = ops->supports_rgmii || !!ops->set_to_rgmii;
+       bsp_priv->supports_rmii = ops->supports_rmii || !!ops->set_to_rmii;
+
        if (ops->init) {
                ret = ops->init(bsp_priv);
                if (ret) {
@@ -1434,11 +1441,11 @@ static int rk_gmac_check_ops(struct rk_priv_data *bsp_priv)
        case PHY_INTERFACE_MODE_RGMII_ID:
        case PHY_INTERFACE_MODE_RGMII_RXID:
        case PHY_INTERFACE_MODE_RGMII_TXID:
-               if (!bsp_priv->ops->set_to_rgmii)
+               if (!bsp_priv->supports_rgmii)
                        return -EINVAL;
                break;
        case PHY_INTERFACE_MODE_RMII:
-               if (!bsp_priv->ops->set_to_rmii)
+               if (!bsp_priv->supports_rmii)
                        return -EINVAL;
                break;
        default:
@@ -1489,24 +1496,32 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
        switch (bsp_priv->phy_iface) {
        case PHY_INTERFACE_MODE_RGMII:
                dev_info(dev, "init for RGMII\n");
-               bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay,
-                                           bsp_priv->rx_delay);
+               if (bsp_priv->ops->set_to_rgmii)
+                       bsp_priv->ops->set_to_rgmii(bsp_priv,
+                                                   bsp_priv->tx_delay,
+                                                   bsp_priv->rx_delay);
                break;
        case PHY_INTERFACE_MODE_RGMII_ID:
                dev_info(dev, "init for RGMII_ID\n");
-               bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0);
+               if (bsp_priv->ops->set_to_rgmii)
+                       bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0);
                break;
        case PHY_INTERFACE_MODE_RGMII_RXID:
                dev_info(dev, "init for RGMII_RXID\n");
-               bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 0);
+               if (bsp_priv->ops->set_to_rgmii)
+                       bsp_priv->ops->set_to_rgmii(bsp_priv,
+                                                   bsp_priv->tx_delay, 0);
                break;
        case PHY_INTERFACE_MODE_RGMII_TXID:
                dev_info(dev, "init for RGMII_TXID\n");
-               bsp_priv->ops->set_to_rgmii(bsp_priv, 0, bsp_priv->rx_delay);
+               if (bsp_priv->ops->set_to_rgmii)
+                       bsp_priv->ops->set_to_rgmii(bsp_priv,
+                                                   0, bsp_priv->rx_delay);
                break;
        case PHY_INTERFACE_MODE_RMII:
                dev_info(dev, "init for RMII\n");
-               bsp_priv->ops->set_to_rmii(bsp_priv);
+               if (bsp_priv->ops->set_to_rmii)
+                       bsp_priv->ops->set_to_rmii(bsp_priv);
                break;
        default:
                dev_err(dev, "NO interface defined!\n");
@@ -1542,10 +1557,10 @@ static void rk_get_interfaces(struct stmmac_priv *priv, void *bsp_priv,
 {
        struct rk_priv_data *rk = bsp_priv;
 
-       if (rk->ops->set_to_rgmii)
+       if (rk->supports_rgmii)
                phy_interface_set_rgmii(interfaces);
 
-       if (rk->ops->set_to_rmii)
+       if (rk->supports_rmii)
                __set_bit(PHY_INTERFACE_MODE_RMII, interfaces);
 }