net: stmmac: dwmac-rk: Validate GRF and peripheral GRF during probe
authorJonas Karlman <jonas@kwiboo.se>
Sat, 8 Mar 2025 21:37:14 +0000 (21:37 +0000)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 13 Mar 2025 09:45:19 +0000 (10:45 +0100)
All Rockchip GMAC variants typically write to GRF regs to control e.g.
interface mode, speed and MAC rx/tx delay. Newer SoCs such as RK3576 and
RK3588 use a mix of GRF and peripheral GRF regs. These syscon regmaps is
located with help of a rockchip,grf and rockchip,php-grf phandle.

However, validating the rockchip,grf and rockchip,php-grf syscon regmap
is deferred until e.g. interface mode or speed is configured, inside the
individual SoC specific operations.

Change to validate the rockchip,grf and rockchip,php-grf syscon regmap
at probe time to simplify all SoC specific operations.

This should not introduce any backward compatibility issues as all
GMAC nodes have been added together with a rockchip,grf phandle (and
rockchip,php-grf where required) in their initial commit.

Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250308213720.2517944-3-jonas@kwiboo.se
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c

index 003fa5cf42c335f7bc1521005409b06ee3751642..5615f015c5fe4c1b1bc45596500146ab6122d38e 100644 (file)
@@ -33,6 +33,7 @@ struct rk_gmac_ops {
        void (*set_clock_selection)(struct rk_priv_data *bsp_priv, bool input,
                                    bool enable);
        void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
+       bool php_grf_required;
        bool regs_valid;
        u32 regs[];
 };
@@ -1254,6 +1255,7 @@ static const struct rk_gmac_ops rk3576_ops = {
        .set_rgmii_speed = rk3576_set_gmac_speed,
        .set_rmii_speed = rk3576_set_gmac_speed,
        .set_clock_selection = rk3576_set_clock_selection,
+       .php_grf_required = true,
        .regs_valid = true,
        .regs = {
                0x2a220000, /* gmac0 */
@@ -1401,6 +1403,7 @@ static const struct rk_gmac_ops rk3588_ops = {
        .set_rgmii_speed = rk3588_set_gmac_speed,
        .set_rmii_speed = rk3588_set_gmac_speed,
        .set_clock_selection = rk3588_set_clock_selection,
+       .php_grf_required = true,
        .regs_valid = true,
        .regs = {
                0xfe1b0000, /* gmac0 */
@@ -1812,8 +1815,22 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
 
        bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
                                                        "rockchip,grf");
-       bsp_priv->php_grf = syscon_regmap_lookup_by_phandle(dev->of_node,
-                                                           "rockchip,php-grf");
+       if (IS_ERR(bsp_priv->grf)) {
+               dev_err_probe(dev, PTR_ERR(bsp_priv->grf),
+                             "failed to lookup rockchip,grf\n");
+               return ERR_CAST(bsp_priv->grf);
+       }
+
+       if (ops->php_grf_required) {
+               bsp_priv->php_grf =
+                       syscon_regmap_lookup_by_phandle(dev->of_node,
+                                                       "rockchip,php-grf");
+               if (IS_ERR(bsp_priv->php_grf)) {
+                       dev_err_probe(dev, PTR_ERR(bsp_priv->php_grf),
+                                     "failed to lookup rockchip,php-grf\n");
+                       return ERR_CAST(bsp_priv->php_grf);
+               }
+       }
 
        if (plat->phy_node) {
                bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node,