* [PATCH RFC net-next 01/15] net: stmmac: rk: add GMAC_CLK_xx constants, simplify RGMII definitions
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
@ 2025-12-01 14:50 ` Russell King (Oracle)
2025-12-02 20:31 ` Andrew Lunn
2025-12-01 14:50 ` [PATCH RFC net-next 02/15] net: stmmac: rk: convert rk3328 to use bsp_priv->id Russell King (Oracle)
` (15 subsequent siblings)
16 siblings, 1 reply; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:50 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
All the definitions of the RGMII related xxx_GMAC_CLK_xxx definitions
use the same field values to select the clock rate. Provide common
defintions for these field values, passing them in to a single macro
for each variant that generates the appropriate values for the speed
register.
No change to produced code on aarch64.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 108 ++++++++----------
1 file changed, 45 insertions(+), 63 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 0a95f54e725e..3679081047e0 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -91,6 +91,10 @@ struct rk_priv_data {
struct regmap *php_grf;
};
+#define GMAC_CLK_DIV1_125M 0
+#define GMAC_CLK_DIV50_2_5M 2
+#define GMAC_CLK_DIV5_25M 3
+
static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
const struct rk_reg_speed_data *rsd,
unsigned int reg, phy_interface_t interface,
@@ -297,9 +301,7 @@ static const struct rk_gmac_ops px30_ops = {
#define RK3128_GMAC_SPEED_100M GRF_BIT(10)
#define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
#define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
-#define RK3128_GMAC_CLK_125M GRF_FIELD_CONST(13, 12, 0)
-#define RK3128_GMAC_CLK_25M GRF_FIELD_CONST(13, 12, 3)
-#define RK3128_GMAC_CLK_2_5M GRF_FIELD_CONST(13, 12, 2)
+#define RK3128_GMAC_CLK(val) GRF_FIELD_CONST(13, 12, val)
#define RK3128_GMAC_RMII_MODE GRF_BIT(14)
#define RK3128_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
@@ -323,9 +325,9 @@ static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3128_reg_speed_data = {
- .rgmii_10 = RK3128_GMAC_CLK_2_5M,
- .rgmii_100 = RK3128_GMAC_CLK_25M,
- .rgmii_1000 = RK3128_GMAC_CLK_125M,
+ .rgmii_10 = RK3128_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3128_GMAC_CLK(GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3128_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3128_GMAC_RMII_CLK_2_5M | RK3128_GMAC_SPEED_10M,
.rmii_100 = RK3128_GMAC_RMII_CLK_25M | RK3128_GMAC_SPEED_100M,
};
@@ -360,9 +362,7 @@ static const struct rk_gmac_ops rk3128_ops = {
#define RK3228_GMAC_SPEED_100M GRF_BIT(2)
#define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
#define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
-#define RK3228_GMAC_CLK_125M GRF_FIELD_CONST(9, 8, 0)
-#define RK3228_GMAC_CLK_25M GRF_FIELD_CONST(9, 8, 3)
-#define RK3228_GMAC_CLK_2_5M GRF_FIELD_CONST(9, 8, 2)
+#define RK3228_GMAC_CLK(val) GRF_FIELD_CONST(9, 8, val)
#define RK3228_GMAC_RMII_MODE GRF_BIT(10)
#define RK3228_GMAC_RMII_MODE_CLR GRF_CLR_BIT(10)
#define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
@@ -397,9 +397,9 @@ static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3228_reg_speed_data = {
- .rgmii_10 = RK3228_GMAC_CLK_2_5M,
- .rgmii_100 = RK3228_GMAC_CLK_25M,
- .rgmii_1000 = RK3228_GMAC_CLK_125M,
+ .rgmii_10 = RK3228_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3228_GMAC_CLK(GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3228_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_SPEED_10M,
.rmii_100 = RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_SPEED_100M,
};
@@ -438,9 +438,7 @@ static const struct rk_gmac_ops rk3228_ops = {
#define RK3288_GMAC_SPEED_100M GRF_BIT(10)
#define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
#define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
-#define RK3288_GMAC_CLK_125M GRF_FIELD_CONST(13, 12, 0)
-#define RK3288_GMAC_CLK_25M GRF_FIELD_CONST(13, 12, 3)
-#define RK3288_GMAC_CLK_2_5M GRF_FIELD_CONST(13, 12, 2)
+#define RK3288_GMAC_CLK(val) GRF_FIELD_CONST(13, 12, val)
#define RK3288_GMAC_RMII_MODE GRF_BIT(14)
#define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
@@ -472,9 +470,9 @@ static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3288_reg_speed_data = {
- .rgmii_10 = RK3288_GMAC_CLK_2_5M,
- .rgmii_100 = RK3288_GMAC_CLK_25M,
- .rgmii_1000 = RK3288_GMAC_CLK_125M,
+ .rgmii_10 = RK3288_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3288_GMAC_CLK(GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3288_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3288_GMAC_RMII_CLK_2_5M | RK3288_GMAC_SPEED_10M,
.rmii_100 = RK3288_GMAC_RMII_CLK_25M | RK3288_GMAC_SPEED_100M,
};
@@ -541,9 +539,7 @@ static const struct rk_gmac_ops rk3308_ops = {
#define RK3328_GMAC_SPEED_100M GRF_BIT(2)
#define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
#define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
-#define RK3328_GMAC_CLK_125M GRF_FIELD_CONST(12, 11, 0)
-#define RK3328_GMAC_CLK_25M GRF_FIELD_CONST(12, 11, 3)
-#define RK3328_GMAC_CLK_2_5M GRF_FIELD_CONST(12, 11, 2)
+#define RK3328_GMAC_CLK(val) GRF_FIELD_CONST(12, 11, val)
#define RK3328_GMAC_RMII_MODE GRF_BIT(9)
#define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
#define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
@@ -579,9 +575,9 @@ static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3328_reg_speed_data = {
- .rgmii_10 = RK3328_GMAC_CLK_2_5M,
- .rgmii_100 = RK3328_GMAC_CLK_25M,
- .rgmii_1000 = RK3328_GMAC_CLK_125M,
+ .rgmii_10 = RK3328_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3328_GMAC_CLK(GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3328_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_SPEED_10M,
.rmii_100 = RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_SPEED_100M,
};
@@ -627,9 +623,7 @@ static const struct rk_gmac_ops rk3328_ops = {
#define RK3366_GMAC_SPEED_100M GRF_BIT(7)
#define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
-#define RK3366_GMAC_CLK_125M GRF_FIELD_CONST(5, 4, 0)
-#define RK3366_GMAC_CLK_25M GRF_FIELD_CONST(5, 4, 3)
-#define RK3366_GMAC_CLK_2_5M GRF_FIELD_CONST(5, 4, 2)
+#define RK3366_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
#define RK3366_GMAC_RMII_MODE GRF_BIT(6)
#define RK3366_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
@@ -661,9 +655,9 @@ static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3366_reg_speed_data = {
- .rgmii_10 = RK3366_GMAC_CLK_2_5M,
- .rgmii_100 = RK3366_GMAC_CLK_25M,
- .rgmii_1000 = RK3366_GMAC_CLK_125M,
+ .rgmii_10 = RK3366_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3366_GMAC_CLK(GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3366_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3366_GMAC_RMII_CLK_2_5M | RK3366_GMAC_SPEED_10M,
.rmii_100 = RK3366_GMAC_RMII_CLK_25M | RK3366_GMAC_SPEED_100M,
};
@@ -692,9 +686,7 @@ static const struct rk_gmac_ops rk3366_ops = {
#define RK3368_GMAC_SPEED_100M GRF_BIT(7)
#define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
-#define RK3368_GMAC_CLK_125M GRF_FIELD_CONST(5, 4, 0)
-#define RK3368_GMAC_CLK_25M GRF_FIELD_CONST(5, 4, 3)
-#define RK3368_GMAC_CLK_2_5M GRF_FIELD_CONST(5, 4, 2)
+#define RK3368_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
#define RK3368_GMAC_RMII_MODE GRF_BIT(6)
#define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
@@ -726,9 +718,9 @@ static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3368_reg_speed_data = {
- .rgmii_10 = RK3368_GMAC_CLK_2_5M,
- .rgmii_100 = RK3368_GMAC_CLK_25M,
- .rgmii_1000 = RK3368_GMAC_CLK_125M,
+ .rgmii_10 = RK3368_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3368_GMAC_CLK(GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3368_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3368_GMAC_RMII_CLK_2_5M | RK3368_GMAC_SPEED_10M,
.rmii_100 = RK3368_GMAC_RMII_CLK_25M | RK3368_GMAC_SPEED_100M,
};
@@ -757,9 +749,7 @@ static const struct rk_gmac_ops rk3368_ops = {
#define RK3399_GMAC_SPEED_100M GRF_BIT(7)
#define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
-#define RK3399_GMAC_CLK_125M GRF_FIELD_CONST(5, 4, 0)
-#define RK3399_GMAC_CLK_25M GRF_FIELD_CONST(5, 4, 3)
-#define RK3399_GMAC_CLK_2_5M GRF_FIELD_CONST(5, 4, 2)
+#define RK3399_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
#define RK3399_GMAC_RMII_MODE GRF_BIT(6)
#define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
@@ -791,9 +781,9 @@ static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3399_reg_speed_data = {
- .rgmii_10 = RK3399_GMAC_CLK_2_5M,
- .rgmii_100 = RK3399_GMAC_CLK_25M,
- .rgmii_1000 = RK3399_GMAC_CLK_125M,
+ .rgmii_10 = RK3399_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3399_GMAC_CLK(GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3399_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3399_GMAC_RMII_CLK_2_5M | RK3399_GMAC_SPEED_10M,
.rmii_100 = RK3399_GMAC_RMII_CLK_25M | RK3399_GMAC_SPEED_100M,
};
@@ -900,9 +890,7 @@ static const struct rk_gmac_ops rk3506_ops = {
#define RK3528_GMAC1_CLK_RMII_DIV2 GRF_BIT(10)
#define RK3528_GMAC1_CLK_RMII_DIV20 GRF_CLR_BIT(10)
-#define RK3528_GMAC1_CLK_RGMII_DIV1 GRF_FIELD_CONST(11, 10, 0)
-#define RK3528_GMAC1_CLK_RGMII_DIV5 GRF_FIELD_CONST(11, 10, 3)
-#define RK3528_GMAC1_CLK_RGMII_DIV50 GRF_FIELD_CONST(11, 10, 2)
+#define RK3528_GMAC1_CLK_RGMII(val) GRF_FIELD_CONST(11, 10, val)
#define RK3528_GMAC0_CLK_RMII_GATE GRF_BIT(2)
#define RK3528_GMAC0_CLK_RMII_NOGATE GRF_CLR_BIT(2)
@@ -940,9 +928,9 @@ static const struct rk_reg_speed_data rk3528_gmac0_reg_speed_data = {
};
static const struct rk_reg_speed_data rk3528_gmac1_reg_speed_data = {
- .rgmii_10 = RK3528_GMAC1_CLK_RGMII_DIV50,
- .rgmii_100 = RK3528_GMAC1_CLK_RGMII_DIV5,
- .rgmii_1000 = RK3528_GMAC1_CLK_RGMII_DIV1,
+ .rgmii_10 = RK3528_GMAC1_CLK_RGMII(GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3528_GMAC1_CLK_RGMII(GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3528_GMAC1_CLK_RGMII(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3528_GMAC1_CLK_RMII_DIV20,
.rmii_100 = RK3528_GMAC1_CLK_RMII_DIV2,
};
@@ -1094,9 +1082,7 @@ static const struct rk_gmac_ops rk3568_ops = {
#define RK3576_GMAC_CLK_RMII_DIV2 GRF_BIT(5)
#define RK3576_GMAC_CLK_RMII_DIV20 GRF_CLR_BIT(5)
-#define RK3576_GMAC_CLK_RGMII_DIV1 GRF_FIELD_CONST(6, 5, 0)
-#define RK3576_GMAC_CLK_RGMII_DIV5 GRF_FIELD_CONST(6, 5, 3)
-#define RK3576_GMAC_CLK_RGMII_DIV50 GRF_FIELD_CONST(6, 5, 2)
+#define RK3576_GMAC_CLK_RGMII(val) GRF_FIELD_CONST(6, 5, val)
#define RK3576_GMAC_CLK_RMII_GATE GRF_BIT(4)
#define RK3576_GMAC_CLK_RMII_NOGATE GRF_CLR_BIT(4)
@@ -1140,9 +1126,9 @@ static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3578_reg_speed_data = {
- .rgmii_10 = RK3576_GMAC_CLK_RGMII_DIV50,
- .rgmii_100 = RK3576_GMAC_CLK_RGMII_DIV5,
- .rgmii_1000 = RK3576_GMAC_CLK_RGMII_DIV1,
+ .rgmii_10 = RK3576_GMAC_CLK_RGMII(GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3576_GMAC_CLK_RGMII(GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3576_GMAC_CLK_RGMII(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3576_GMAC_CLK_RMII_DIV20,
.rmii_100 = RK3576_GMAC_CLK_RMII_DIV2,
};
@@ -1218,12 +1204,8 @@ static const struct rk_gmac_ops rk3576_ops = {
#define RK3588_GMA_CLK_RMII_DIV2(id) GRF_BIT(5 * (id) + 2)
#define RK3588_GMA_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + 2)
-#define RK3588_GMAC_CLK_RGMII_DIV1(id) \
- (GRF_FIELD_CONST(3, 2, 0) << ((id) * 5))
-#define RK3588_GMAC_CLK_RGMII_DIV5(id) \
- (GRF_FIELD_CONST(3, 2, 3) << ((id) * 5))
-#define RK3588_GMAC_CLK_RGMII_DIV50(id) \
- (GRF_FIELD_CONST(3, 2, 2) << ((id) * 5))
+#define RK3588_GMAC_CLK_RGMII(id, val) \
+ (GRF_FIELD_CONST(3, 2, val) << ((id) * 5))
#define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1)
#define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + 1)
@@ -1270,17 +1252,17 @@ static int rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv,
if (interface == PHY_INTERFACE_MODE_RMII)
val = RK3588_GMA_CLK_RMII_DIV20(id);
else
- val = RK3588_GMAC_CLK_RGMII_DIV50(id);
+ val = RK3588_GMAC_CLK_RGMII(id, GMAC_CLK_DIV50_2_5M);
break;
case 100:
if (interface == PHY_INTERFACE_MODE_RMII)
val = RK3588_GMA_CLK_RMII_DIV2(id);
else
- val = RK3588_GMAC_CLK_RGMII_DIV5(id);
+ val = RK3588_GMAC_CLK_RGMII(id, GMAC_CLK_DIV5_25M);
break;
case 1000:
if (interface != PHY_INTERFACE_MODE_RMII)
- val = RK3588_GMAC_CLK_RGMII_DIV1(id);
+ val = RK3588_GMAC_CLK_RGMII(id, GMAC_CLK_DIV1_125M);
else
goto err;
break;
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH RFC net-next 01/15] net: stmmac: rk: add GMAC_CLK_xx constants, simplify RGMII definitions
2025-12-01 14:50 ` [PATCH RFC net-next 01/15] net: stmmac: rk: add GMAC_CLK_xx constants, simplify RGMII definitions Russell King (Oracle)
@ 2025-12-02 20:31 ` Andrew Lunn
0 siblings, 0 replies; 23+ messages in thread
From: Andrew Lunn @ 2025-12-02 20:31 UTC (permalink / raw)
To: Russell King (Oracle)
Cc: Heiner Kallweit, Alexandre Torgue, Andrew Lunn, David S. Miller,
Eric Dumazet, Heiko Stuebner, Jakub Kicinski, linux-arm-kernel,
linux-rockchip, linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
On Mon, Dec 01, 2025 at 02:50:47PM +0000, Russell King (Oracle) wrote:
> All the definitions of the RGMII related xxx_GMAC_CLK_xxx definitions
> use the same field values to select the clock rate. Provide common
> defintions for these field values, passing them in to a single macro
> for each variant that generates the appropriate values for the speed
> register.
>
> No change to produced code on aarch64.
>
> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Andrew
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH RFC net-next 02/15] net: stmmac: rk: convert rk3328 to use bsp_priv->id
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
2025-12-01 14:50 ` [PATCH RFC net-next 01/15] net: stmmac: rk: add GMAC_CLK_xx constants, simplify RGMII definitions Russell King (Oracle)
@ 2025-12-01 14:50 ` Russell King (Oracle)
2025-12-01 14:50 ` [PATCH RFC net-next 03/15] net: stmmac: rk: add SoC specific ->init() method Russell King (Oracle)
` (14 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:50 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
rk3328 contains two GMAC instances - gmac2io and gmac2phy. The gmac2io
instance can be connected to an external PHY, whereas gmac2phy is
connected via RMII to an on-SoC integrated PHY. This configuration can
not be changed.
The driver tests for the gmac2phy instance by checking
bsp_priv->integrated_phy (determined from the PHY's phy-is-integrated
property) and sometimes that the interface mode is RMII. This works
because the rk3328.dtsi has:
gmac2phy: ethernet@ff550000 {
compatible = "rockchip,rk3328-gmac";
phy-mode = "rmii";
mdio {
phy: ethernet-phy@0 {
phy-is-integrated;
};
};
};
The driver contains a mechanism to look up the MMIO address in a table
to determine bsp_priv->id, which is used for every other Rockchip
device. Switch rk3328 to use this mechanism to determine bsp_priv->id
and use that to select which GRF register is used for configuration.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 3679081047e0..f9bc9b145ff4 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -566,8 +566,7 @@ static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
{
unsigned int reg;
- reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
- RK3328_GRF_MAC_CON1;
+ reg = bsp_priv->id ? RK3328_GRF_MAC_CON2 : RK3328_GRF_MAC_CON1;
regmap_write(bsp_priv->grf, reg,
RK3328_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
@@ -587,10 +586,7 @@ static int rk3328_set_speed(struct rk_priv_data *bsp_priv,
{
unsigned int reg;
- if (interface == PHY_INTERFACE_MODE_RMII && bsp_priv->integrated_phy)
- reg = RK3328_GRF_MAC_CON2;
- else
- reg = RK3328_GRF_MAC_CON1;
+ reg = bsp_priv->id ? RK3328_GRF_MAC_CON2 : RK3328_GRF_MAC_CON1;
return rk_set_reg_speed(bsp_priv, &rk3328_reg_speed_data, reg,
interface, speed);
@@ -610,6 +606,13 @@ static const struct rk_gmac_ops rk3328_ops = {
.set_speed = rk3328_set_speed,
.integrated_phy_powerup = rk3328_integrated_phy_powerup,
.integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
+
+ .regs_valid = true,
+ .regs = {
+ 0xff540000, /* gmac2io */
+ 0xff550000, /* gmac2phy */
+ 0, /* sentinel */
+ },
};
#define RK3366_GRF_SOC_CON6 0x0418
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 03/15] net: stmmac: rk: add SoC specific ->init() method
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
2025-12-01 14:50 ` [PATCH RFC net-next 01/15] net: stmmac: rk: add GMAC_CLK_xx constants, simplify RGMII definitions Russell King (Oracle)
2025-12-01 14:50 ` [PATCH RFC net-next 02/15] net: stmmac: rk: convert rk3328 to use bsp_priv->id Russell King (Oracle)
@ 2025-12-01 14:50 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 04/15] net: stmmac: rk: convert to mask-based interface mode configuration Russell King (Oracle)
` (13 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:50 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Add a SoC specific init method.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index f9bc9b145ff4..e9f531d6c22a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -35,6 +35,7 @@ struct rk_reg_speed_data {
};
struct rk_gmac_ops {
+ int (*init)(struct rk_priv_data *bsp_priv);
void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay);
void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
@@ -1613,6 +1614,14 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
bsp_priv->dev = dev;
+ if (ops->init) {
+ ret = ops->init(bsp_priv);
+ if (ret) {
+ dev_err_probe(dev, ret, "failed to init BSP\n");
+ return ERR_PTR(ret);
+ }
+ }
+
return bsp_priv;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 04/15] net: stmmac: rk: convert to mask-based interface mode configuration
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (2 preceding siblings ...)
2025-12-01 14:50 ` [PATCH RFC net-next 03/15] net: stmmac: rk: add SoC specific ->init() method Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-02 20:41 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 05/15] net: stmmac: rk: move speed GRF register offset to private data Russell King (Oracle)
` (12 subsequent siblings)
16 siblings, 1 reply; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Most of the Rockchip implementations use the phy_intf_sel values for
interface mode configuration, but the register and field within that
register vary between each SoC. They also have a RMII mode bit, which
is in the same register but a different bit position.
Rather than having each and every Rockchip implementation cope with
this using code, add struct members to specify the regmap register
offset, and the bitfield masks for these two parameters.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 281 +++++++++++-------
1 file changed, 171 insertions(+), 110 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index e9f531d6c22a..369792b62c5e 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -45,6 +45,11 @@ struct rk_gmac_ops {
bool enable);
void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
void (*integrated_phy_powerdown)(struct rk_priv_data *bsp_priv);
+
+ u16 phy_intf_sel_grf_reg;
+ u16 phy_intf_sel_mask;
+ u16 rmii_mode_mask;
+
bool php_grf_required;
bool regs_valid;
u32 regs[];
@@ -90,12 +95,37 @@ struct rk_priv_data {
struct regmap *grf;
struct regmap *php_grf;
+
+ u16 phy_intf_sel_grf_reg;
+ u16 phy_intf_sel_mask;
+ u16 rmii_mode_mask;
};
#define GMAC_CLK_DIV1_125M 0
#define GMAC_CLK_DIV50_2_5M 2
#define GMAC_CLK_DIV5_25M 3
+static int rk_get_phy_intf_sel(phy_interface_t interface)
+{
+ int ret = stmmac_get_phy_intf_sel(interface);
+
+ /* Only RGMII and RMII are supported */
+ if (ret != PHY_INTF_SEL_RGMII && ret != PHY_INTF_SEL_RMII)
+ ret = -EINVAL;
+
+ return ret;
+}
+
+static u32 rk_encode_wm16(u16 val, u16 mask)
+{
+ u32 reg_val = mask << 16;
+
+ if (mask)
+ reg_val |= mask & (val << (ffs(mask) - 1));
+
+ return reg_val;
+}
+
static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
const struct rk_reg_speed_data *rsd,
unsigned int reg, phy_interface_t interface,
@@ -239,14 +269,11 @@ static void rk_gmac_integrated_fephy_powerdown(struct rk_priv_data *priv,
#define PX30_GRF_GMAC_CON1 0x0904
/* PX30_GRF_GMAC_CON1 */
-#define PX30_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
#define PX30_GMAC_SPEED_10M GRF_CLR_BIT(2)
#define PX30_GMAC_SPEED_100M GRF_BIT(2)
static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
- PX30_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
}
static int px30_set_speed(struct rk_priv_data *bsp_priv,
@@ -281,6 +308,9 @@ static int px30_set_speed(struct rk_priv_data *bsp_priv,
static const struct rk_gmac_ops px30_ops = {
.set_to_rmii = px30_set_to_rmii,
.set_speed = px30_set_speed,
+
+ .phy_intf_sel_grf_reg = PX30_GRF_GMAC_CON1,
+ .phy_intf_sel_mask = GENMASK_U16(6, 4),
};
#define RK3128_GRF_MAC_CON0 0x0168
@@ -295,7 +325,6 @@ static const struct rk_gmac_ops px30_ops = {
#define RK3128_GMAC_CLK_TX_DL_CFG(val) GRF_FIELD(6, 0, val)
/* RK3128_GRF_MAC_CON1 */
-#define RK3128_GMAC_PHY_INTF_SEL(val) GRF_FIELD(8, 6, val)
#define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
#define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
#define RK3128_GMAC_SPEED_10M GRF_CLR_BIT(10)
@@ -303,15 +332,10 @@ static const struct rk_gmac_ops px30_ops = {
#define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
#define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
#define RK3128_GMAC_CLK(val) GRF_FIELD_CONST(13, 12, val)
-#define RK3128_GMAC_RMII_MODE GRF_BIT(14)
-#define RK3128_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
- regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
- RK3128_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
- RK3128_GMAC_RMII_MODE_CLR);
regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
DELAY_ENABLE(RK3128, tx_delay, rx_delay) |
RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) |
@@ -320,9 +344,6 @@ static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
- RK3128_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
- RK3128_GMAC_RMII_MODE);
}
static const struct rk_reg_speed_data rk3128_reg_speed_data = {
@@ -344,6 +365,10 @@ static const struct rk_gmac_ops rk3128_ops = {
.set_to_rgmii = rk3128_set_to_rgmii,
.set_to_rmii = rk3128_set_to_rmii,
.set_speed = rk3128_set_speed,
+
+ .phy_intf_sel_grf_reg = RK3128_GRF_MAC_CON1,
+ .phy_intf_sel_mask = GENMASK_U16(8, 6),
+ .rmii_mode_mask = BIT_U16(14),
};
#define RK3228_GRF_MAC_CON0 0x0900
@@ -356,7 +381,6 @@ static const struct rk_gmac_ops rk3128_ops = {
#define RK3228_GMAC_CLK_TX_DL_CFG(val) GRF_FIELD(6, 0, val)
/* RK3228_GRF_MAC_CON1 */
-#define RK3228_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
#define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
#define RK3228_GMAC_SPEED_10M GRF_CLR_BIT(2)
@@ -364,8 +388,6 @@ static const struct rk_gmac_ops rk3128_ops = {
#define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
#define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
#define RK3228_GMAC_CLK(val) GRF_FIELD_CONST(9, 8, val)
-#define RK3228_GMAC_RMII_MODE GRF_BIT(10)
-#define RK3228_GMAC_RMII_MODE_CLR GRF_CLR_BIT(10)
#define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
#define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
#define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
@@ -378,8 +400,6 @@ static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
- RK3228_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
- RK3228_GMAC_RMII_MODE_CLR |
DELAY_ENABLE(RK3228, tx_delay, rx_delay));
regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
@@ -389,10 +409,6 @@ static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
- RK3228_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
- RK3228_GMAC_RMII_MODE);
-
/* set MAC to RMII mode */
regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
}
@@ -426,13 +442,17 @@ static const struct rk_gmac_ops rk3228_ops = {
.set_speed = rk3228_set_speed,
.integrated_phy_powerup = rk3228_integrated_phy_powerup,
.integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
+
+ .phy_intf_sel_grf_reg = RK3228_GRF_MAC_CON1,
+ .phy_intf_sel_mask = GENMASK_U16(6, 4),
+ .rmii_mode_mask = BIT_U16(10),
+
};
#define RK3288_GRF_SOC_CON1 0x0248
#define RK3288_GRF_SOC_CON3 0x0250
/*RK3288_GRF_SOC_CON1*/
-#define RK3288_GMAC_PHY_INTF_SEL(val) GRF_FIELD(8, 6, val)
#define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
#define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
#define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10)
@@ -440,8 +460,6 @@ static const struct rk_gmac_ops rk3228_ops = {
#define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
#define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
#define RK3288_GMAC_CLK(val) GRF_FIELD_CONST(13, 12, val)
-#define RK3288_GMAC_RMII_MODE GRF_BIT(14)
-#define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
/*RK3288_GRF_SOC_CON3*/
#define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
@@ -454,9 +472,6 @@ static const struct rk_gmac_ops rk3228_ops = {
static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
- regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
- RK3288_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
- RK3288_GMAC_RMII_MODE_CLR);
regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
DELAY_ENABLE(RK3288, tx_delay, rx_delay) |
RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) |
@@ -465,9 +480,6 @@ static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
- RK3288_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
- RK3288_GMAC_RMII_MODE);
}
static const struct rk_reg_speed_data rk3288_reg_speed_data = {
@@ -489,12 +501,15 @@ static const struct rk_gmac_ops rk3288_ops = {
.set_to_rgmii = rk3288_set_to_rgmii,
.set_to_rmii = rk3288_set_to_rmii,
.set_speed = rk3288_set_speed,
+
+ .phy_intf_sel_grf_reg = RK3288_GRF_SOC_CON1,
+ .phy_intf_sel_mask = GENMASK_U16(8, 6),
+ .rmii_mode_mask = BIT_U16(14),
};
#define RK3308_GRF_MAC_CON0 0x04a0
/* RK3308_GRF_MAC_CON0 */
-#define RK3308_GMAC_PHY_INTF_SEL(val) GRF_FIELD(4, 2, val)
#define RK3308_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3308_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
#define RK3308_GMAC_SPEED_10M GRF_CLR_BIT(0)
@@ -502,8 +517,6 @@ static const struct rk_gmac_ops rk3288_ops = {
static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
- RK3308_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
}
static const struct rk_reg_speed_data rk3308_reg_speed_data = {
@@ -521,6 +534,9 @@ static int rk3308_set_speed(struct rk_priv_data *bsp_priv,
static const struct rk_gmac_ops rk3308_ops = {
.set_to_rmii = rk3308_set_to_rmii,
.set_speed = rk3308_set_speed,
+
+ .phy_intf_sel_grf_reg = RK3308_GRF_MAC_CON0,
+ .phy_intf_sel_mask = GENMASK_U16(4, 2),
};
#define RK3328_GRF_MAC_CON0 0x0900
@@ -533,7 +549,6 @@ static const struct rk_gmac_ops rk3308_ops = {
#define RK3328_GMAC_CLK_TX_DL_CFG(val) GRF_FIELD(6, 0, val)
/* RK3328_GRF_MAC_CON1 */
-#define RK3328_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
#define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
#define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
@@ -541,20 +556,32 @@ static const struct rk_gmac_ops rk3308_ops = {
#define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
#define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
#define RK3328_GMAC_CLK(val) GRF_FIELD_CONST(12, 11, val)
-#define RK3328_GMAC_RMII_MODE GRF_BIT(9)
-#define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
#define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
#define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
/* RK3328_GRF_MACPHY_CON1 */
#define RK3328_MACPHY_RMII_MODE GRF_BIT(9)
+static int rk3328_init(struct rk_priv_data *bsp_priv)
+{
+ switch (bsp_priv->id) {
+ case 0: /* gmac2io */
+ bsp_priv->phy_intf_sel_grf_reg = RK3328_GRF_MAC_CON1;
+ return 0;
+
+ case 1: /* gmac2phy */
+ bsp_priv->phy_intf_sel_grf_reg = RK3328_GRF_MAC_CON2;
+ return 0;
+
+ default:
+ return -EINVAL;
+ }
+}
+
static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
- RK3328_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
- RK3328_GMAC_RMII_MODE_CLR |
RK3328_GMAC_RXCLK_DLY_ENABLE |
RK3328_GMAC_TXCLK_DLY_ENABLE);
@@ -565,13 +592,6 @@ static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- unsigned int reg;
-
- reg = bsp_priv->id ? RK3328_GRF_MAC_CON2 : RK3328_GRF_MAC_CON1;
-
- regmap_write(bsp_priv->grf, reg,
- RK3328_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
- RK3328_GMAC_RMII_MODE);
}
static const struct rk_reg_speed_data rk3328_reg_speed_data = {
@@ -602,12 +622,16 @@ static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
}
static const struct rk_gmac_ops rk3328_ops = {
+ .init = rk3328_init,
.set_to_rgmii = rk3328_set_to_rgmii,
.set_to_rmii = rk3328_set_to_rmii,
.set_speed = rk3328_set_speed,
.integrated_phy_powerup = rk3328_integrated_phy_powerup,
.integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
+ .phy_intf_sel_mask = GENMASK_U16(6, 4),
+ .rmii_mode_mask = BIT_U16(9),
+
.regs_valid = true,
.regs = {
0xff540000, /* gmac2io */
@@ -620,7 +644,6 @@ static const struct rk_gmac_ops rk3328_ops = {
#define RK3366_GRF_SOC_CON7 0x041c
/* RK3366_GRF_SOC_CON6 */
-#define RK3366_GMAC_PHY_INTF_SEL(val) GRF_FIELD(11, 9, val)
#define RK3366_GMAC_FLOW_CTRL GRF_BIT(8)
#define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
#define RK3366_GMAC_SPEED_10M GRF_CLR_BIT(7)
@@ -628,8 +651,6 @@ static const struct rk_gmac_ops rk3328_ops = {
#define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
#define RK3366_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
-#define RK3366_GMAC_RMII_MODE GRF_BIT(6)
-#define RK3366_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
/* RK3366_GRF_SOC_CON7 */
#define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
@@ -642,9 +663,6 @@ static const struct rk_gmac_ops rk3328_ops = {
static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
- regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
- RK3366_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
- RK3366_GMAC_RMII_MODE_CLR);
regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
DELAY_ENABLE(RK3366, tx_delay, rx_delay) |
RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) |
@@ -653,9 +671,6 @@ static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
- RK3366_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
- RK3366_GMAC_RMII_MODE);
}
static const struct rk_reg_speed_data rk3366_reg_speed_data = {
@@ -677,13 +692,16 @@ static const struct rk_gmac_ops rk3366_ops = {
.set_to_rgmii = rk3366_set_to_rgmii,
.set_to_rmii = rk3366_set_to_rmii,
.set_speed = rk3366_set_speed,
+
+ .phy_intf_sel_grf_reg = RK3366_GRF_SOC_CON6,
+ .phy_intf_sel_mask = GENMASK_U16(11, 9),
+ .rmii_mode_mask = BIT_U16(6),
};
#define RK3368_GRF_SOC_CON15 0x043c
#define RK3368_GRF_SOC_CON16 0x0440
/* RK3368_GRF_SOC_CON15 */
-#define RK3368_GMAC_PHY_INTF_SEL(val) GRF_FIELD(11, 9, val)
#define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
#define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
#define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7)
@@ -691,8 +709,6 @@ static const struct rk_gmac_ops rk3366_ops = {
#define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
#define RK3368_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
-#define RK3368_GMAC_RMII_MODE GRF_BIT(6)
-#define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
/* RK3368_GRF_SOC_CON16 */
#define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
@@ -705,9 +721,6 @@ static const struct rk_gmac_ops rk3366_ops = {
static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
- regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
- RK3368_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
- RK3368_GMAC_RMII_MODE_CLR);
regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
DELAY_ENABLE(RK3368, tx_delay, rx_delay) |
RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) |
@@ -716,9 +729,6 @@ static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
- RK3368_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
- RK3368_GMAC_RMII_MODE);
}
static const struct rk_reg_speed_data rk3368_reg_speed_data = {
@@ -740,13 +750,16 @@ static const struct rk_gmac_ops rk3368_ops = {
.set_to_rgmii = rk3368_set_to_rgmii,
.set_to_rmii = rk3368_set_to_rmii,
.set_speed = rk3368_set_speed,
+
+ .phy_intf_sel_grf_reg = RK3368_GRF_SOC_CON15,
+ .phy_intf_sel_mask = GENMASK_U16(11, 9),
+ .rmii_mode_mask = BIT_U16(6),
};
#define RK3399_GRF_SOC_CON5 0xc214
#define RK3399_GRF_SOC_CON6 0xc218
/* RK3399_GRF_SOC_CON5 */
-#define RK3399_GMAC_PHY_INTF_SEL(val) GRF_FIELD(11, 9, val)
#define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
#define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
#define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7)
@@ -754,8 +767,6 @@ static const struct rk_gmac_ops rk3368_ops = {
#define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
#define RK3399_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
-#define RK3399_GMAC_RMII_MODE GRF_BIT(6)
-#define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
/* RK3399_GRF_SOC_CON6 */
#define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
@@ -768,9 +779,6 @@ static const struct rk_gmac_ops rk3368_ops = {
static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
- regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
- RK3399_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
- RK3399_GMAC_RMII_MODE_CLR);
regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
DELAY_ENABLE(RK3399, tx_delay, rx_delay) |
RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) |
@@ -779,9 +787,6 @@ static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
- RK3399_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
- RK3399_GMAC_RMII_MODE);
}
static const struct rk_reg_speed_data rk3399_reg_speed_data = {
@@ -803,6 +808,10 @@ static const struct rk_gmac_ops rk3399_ops = {
.set_to_rgmii = rk3399_set_to_rgmii,
.set_to_rmii = rk3399_set_to_rmii,
.set_speed = rk3399_set_speed,
+
+ .phy_intf_sel_grf_reg = RK3399_GRF_SOC_CON5,
+ .phy_intf_sel_mask = GENMASK_U16(11, 9),
+ .rmii_mode_mask = BIT_U16(6),
};
#define RK3506_GRF_SOC_CON8 0x0020
@@ -1005,7 +1014,6 @@ static const struct rk_gmac_ops rk3528_ops = {
#define RK3568_GRF_GMAC1_CON1 0x038c
/* RK3568_GRF_GMAC0_CON1 && RK3568_GRF_GMAC1_CON1 */
-#define RK3568_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
#define RK3568_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3568_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
#define RK3568_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
@@ -1017,6 +1025,22 @@ static const struct rk_gmac_ops rk3528_ops = {
#define RK3568_GMAC_CLK_RX_DL_CFG(val) GRF_FIELD(14, 8, val)
#define RK3568_GMAC_CLK_TX_DL_CFG(val) GRF_FIELD(6, 0, val)
+static int rk3568_init(struct rk_priv_data *bsp_priv)
+{
+ switch (bsp_priv->id) {
+ case 0:
+ bsp_priv->phy_intf_sel_grf_reg = RK3568_GRF_GMAC0_CON1;
+ return 0;
+
+ case 1:
+ bsp_priv->phy_intf_sel_grf_reg = RK3568_GRF_GMAC1_CON1;
+ return 0;
+
+ default:
+ return -EINVAL;
+ }
+}
+
static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
@@ -1032,25 +1056,22 @@ static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
RK3568_GMAC_CLK_TX_DL_CFG(tx_delay));
regmap_write(bsp_priv->grf, con1,
- RK3568_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
RK3568_GMAC_RXCLK_DLY_ENABLE |
RK3568_GMAC_TXCLK_DLY_ENABLE);
}
static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- u32 con1;
-
- con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
- RK3568_GRF_GMAC0_CON1;
- regmap_write(bsp_priv->grf, con1,
- RK3568_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
}
static const struct rk_gmac_ops rk3568_ops = {
+ .init = rk3568_init,
.set_to_rgmii = rk3568_set_to_rgmii,
.set_to_rmii = rk3568_set_to_rmii,
.set_speed = rk_set_clk_mac_speed,
+
+ .phy_intf_sel_mask = GENMASK_U16(6, 4),
+
.regs_valid = true,
.regs = {
0xfe2a0000, /* gmac0 */
@@ -1077,9 +1098,6 @@ static const struct rk_gmac_ops rk3568_ops = {
#define RK3576_GRF_GMAC_CON0 0X0020
#define RK3576_GRF_GMAC_CON1 0X0024
-#define RK3576_GMAC_RMII_MODE GRF_BIT(3)
-#define RK3576_GMAC_RGMII_MODE GRF_CLR_BIT(3)
-
#define RK3576_GMAC_CLK_SELECT_IO GRF_BIT(7)
#define RK3576_GMAC_CLK_SELECT_CRU GRF_CLR_BIT(7)
@@ -1091,16 +1109,27 @@ static const struct rk_gmac_ops rk3568_ops = {
#define RK3576_GMAC_CLK_RMII_GATE GRF_BIT(4)
#define RK3576_GMAC_CLK_RMII_NOGATE GRF_CLR_BIT(4)
+static int rk3576_init(struct rk_priv_data *bsp_priv)
+{
+ switch (bsp_priv->id) {
+ case 0:
+ bsp_priv->phy_intf_sel_grf_reg = RK3576_GRF_GMAC_CON0;
+ return 0;
+
+ case 1:
+ bsp_priv->phy_intf_sel_grf_reg = RK3576_GRF_GMAC_CON1;
+ return 0;
+
+ default:
+ return -EINVAL;
+ }
+}
+
static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
unsigned int offset_con;
- offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
- RK3576_GRF_GMAC_CON0;
-
- regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RGMII_MODE);
-
offset_con = bsp_priv->id == 1 ? RK3576_VCCIO0_1_3_IOC_CON4 :
RK3576_VCCIO0_1_3_IOC_CON2;
@@ -1121,12 +1150,6 @@ static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- unsigned int offset_con;
-
- offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
- RK3576_GRF_GMAC_CON0;
-
- regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RMII_MODE);
}
static const struct rk_reg_speed_data rk3578_reg_speed_data = {
@@ -1166,10 +1189,14 @@ static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv, bool input
}
static const struct rk_gmac_ops rk3576_ops = {
+ .init = rk3576_init,
.set_to_rgmii = rk3576_set_to_rgmii,
.set_to_rmii = rk3576_set_to_rmii,
.set_speed = rk3576_set_gmac_speed,
.set_clock_selection = rk3576_set_clock_selection,
+
+ .rmii_mode_mask = BIT_U16(3),
+
.php_grf_required = true,
.regs_valid = true,
.regs = {
@@ -1196,9 +1223,6 @@ static const struct rk_gmac_ops rk3576_ops = {
#define RK3588_GRF_GMAC_CON0 0X0008
#define RK3588_GRF_CLK_CON1 0X0070
-#define RK3588_GMAC_PHY_INTF_SEL(id, val) \
- (GRF_FIELD(5, 3, val) << ((id) * 6))
-
#define RK3588_GMAC_CLK_RMII_MODE(id) GRF_BIT(5 * (id))
#define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id))
@@ -1214,6 +1238,22 @@ static const struct rk_gmac_ops rk3576_ops = {
#define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1)
#define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + 1)
+static int rk3588_init(struct rk_priv_data *bsp_priv)
+{
+ switch (bsp_priv->id) {
+ case 0:
+ bsp_priv->phy_intf_sel_mask = GENMASK_U16(5, 3);
+ return 0;
+
+ case 1:
+ bsp_priv->phy_intf_sel_mask = GENMASK_U16(11, 9);
+ return 0;
+
+ default:
+ return -EINVAL;
+ }
+}
+
static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
@@ -1222,9 +1262,6 @@ static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv,
offset_con = bsp_priv->id == 1 ? RK3588_GRF_GMAC_CON9 :
RK3588_GRF_GMAC_CON8;
- regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0,
- RK3588_GMAC_PHY_INTF_SEL(id, PHY_INTF_SEL_RGMII));
-
regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1,
RK3588_GMAC_CLK_RGMII_MODE(id));
@@ -1239,9 +1276,6 @@ static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0,
- RK3588_GMAC_PHY_INTF_SEL(bsp_priv->id, PHY_INTF_SEL_RMII));
-
regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1,
RK3588_GMAC_CLK_RMII_MODE(bsp_priv->id));
}
@@ -1294,10 +1328,14 @@ static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input
}
static const struct rk_gmac_ops rk3588_ops = {
+ .init = rk3588_init,
.set_to_rgmii = rk3588_set_to_rgmii,
.set_to_rmii = rk3588_set_to_rmii,
.set_speed = rk3588_set_gmac_speed,
.set_clock_selection = rk3588_set_clock_selection,
+
+ .phy_intf_sel_grf_reg = RK3588_GRF_GMAC_CON0,
+
.php_grf_required = true,
.regs_valid = true,
.regs = {
@@ -1310,7 +1348,6 @@ static const struct rk_gmac_ops rk3588_ops = {
#define RV1108_GRF_GMAC_CON0 0X0900
/* RV1108_GRF_GMAC_CON0 */
-#define RV1108_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
#define RV1108_GMAC_FLOW_CTRL GRF_BIT(3)
#define RV1108_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
#define RV1108_GMAC_SPEED_10M GRF_CLR_BIT(2)
@@ -1320,8 +1357,6 @@ static const struct rk_gmac_ops rk3588_ops = {
static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
- RV1108_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
}
static const struct rk_reg_speed_data rv1108_reg_speed_data = {
@@ -1339,6 +1374,9 @@ static int rv1108_set_speed(struct rk_priv_data *bsp_priv,
static const struct rk_gmac_ops rv1108_ops = {
.set_to_rmii = rv1108_set_to_rmii,
.set_speed = rv1108_set_speed,
+
+ .phy_intf_sel_grf_reg = RV1108_GRF_GMAC_CON0,
+ .phy_intf_sel_mask = GENMASK_U16(6, 4),
};
#define RV1126_GRF_GMAC_CON0 0X0070
@@ -1346,7 +1384,6 @@ static const struct rk_gmac_ops rv1108_ops = {
#define RV1126_GRF_GMAC_CON2 0X0078
/* RV1126_GRF_GMAC_CON0 */
-#define RV1126_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
#define RV1126_GMAC_FLOW_CTRL GRF_BIT(7)
#define RV1126_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(7)
#define RV1126_GMAC_M0_RXCLK_DLY_ENABLE GRF_BIT(1)
@@ -1369,7 +1406,6 @@ static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
- RV1126_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
RV1126_GMAC_M0_RXCLK_DLY_ENABLE |
RV1126_GMAC_M0_TXCLK_DLY_ENABLE |
RV1126_GMAC_M1_RXCLK_DLY_ENABLE |
@@ -1386,14 +1422,15 @@ static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv)
{
- regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
- RV1126_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
}
static const struct rk_gmac_ops rv1126_ops = {
.set_to_rgmii = rv1126_set_to_rgmii,
.set_to_rmii = rv1126_set_to_rmii,
.set_speed = rk_set_clk_mac_speed,
+
+ .phy_intf_sel_grf_reg = RV1126_GRF_GMAC_CON0,
+ .phy_intf_sel_mask = GENMASK_U16(6, 4),
};
static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
@@ -1614,6 +1651,11 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
bsp_priv->dev = dev;
+ /* Set the default phy_intf_sel and RMII mode register parameters. */
+ bsp_priv->phy_intf_sel_grf_reg = ops->phy_intf_sel_grf_reg;
+ bsp_priv->phy_intf_sel_mask = ops->phy_intf_sel_mask;
+ bsp_priv->rmii_mode_mask = ops->rmii_mode_mask;
+
if (ops->init) {
ret = ops->init(bsp_priv);
if (ret) {
@@ -1649,6 +1691,7 @@ static int rk_gmac_check_ops(struct rk_priv_data *bsp_priv)
static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
{
struct device *dev = bsp_priv->dev;
+ u32 val;
int ret;
ret = rk_gmac_check_ops(bsp_priv);
@@ -1659,6 +1702,24 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
if (ret)
return ret;
+ ret = rk_get_phy_intf_sel(bsp_priv->phy_iface);
+ if (ret < 0)
+ return ret;
+
+ if (bsp_priv->phy_intf_sel_mask) {
+ /* Encode the phy_intf_sel value */
+ val = rk_encode_wm16(ret, bsp_priv->phy_intf_sel_mask);
+
+ /* If defined, encode the RMII mode mask setting. */
+ val |= rk_encode_wm16(ret == PHY_INTF_SEL_RMII,
+ bsp_priv->rmii_mode_mask);
+
+ ret = regmap_write(bsp_priv->grf,
+ bsp_priv->phy_intf_sel_grf_reg, val);
+ if (ret < 0)
+ return ret;
+ }
+
/*rmii or rgmii*/
switch (bsp_priv->phy_iface) {
case PHY_INTERFACE_MODE_RGMII:
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH RFC net-next 04/15] net: stmmac: rk: convert to mask-based interface mode configuration
2025-12-01 14:51 ` [PATCH RFC net-next 04/15] net: stmmac: rk: convert to mask-based interface mode configuration Russell King (Oracle)
@ 2025-12-02 20:41 ` Russell King (Oracle)
0 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-02 20:41 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Just FYI,
I suggest not reviewing past this patch as I've been doing some reorg
to the patch set since posting... the basic idea remains, but stuff
is getting some renaming, and the "speed" register bitfields are moving
to their own struct.
Thanks.
On Mon, Dec 01, 2025 at 02:51:03PM +0000, Russell King (Oracle) wrote:
> Most of the Rockchip implementations use the phy_intf_sel values for
> interface mode configuration, but the register and field within that
> register vary between each SoC. They also have a RMII mode bit, which
> is in the same register but a different bit position.
>
> Rather than having each and every Rockchip implementation cope with
> this using code, add struct members to specify the regmap register
> offset, and the bitfield masks for these two parameters.
>
> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
> ---
> .../net/ethernet/stmicro/stmmac/dwmac-rk.c | 281 +++++++++++-------
> 1 file changed, 171 insertions(+), 110 deletions(-)
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
> index e9f531d6c22a..369792b62c5e 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
> @@ -45,6 +45,11 @@ struct rk_gmac_ops {
> bool enable);
> void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
> void (*integrated_phy_powerdown)(struct rk_priv_data *bsp_priv);
> +
> + u16 phy_intf_sel_grf_reg;
> + u16 phy_intf_sel_mask;
> + u16 rmii_mode_mask;
> +
> bool php_grf_required;
> bool regs_valid;
> u32 regs[];
> @@ -90,12 +95,37 @@ struct rk_priv_data {
>
> struct regmap *grf;
> struct regmap *php_grf;
> +
> + u16 phy_intf_sel_grf_reg;
> + u16 phy_intf_sel_mask;
> + u16 rmii_mode_mask;
> };
>
> #define GMAC_CLK_DIV1_125M 0
> #define GMAC_CLK_DIV50_2_5M 2
> #define GMAC_CLK_DIV5_25M 3
>
> +static int rk_get_phy_intf_sel(phy_interface_t interface)
> +{
> + int ret = stmmac_get_phy_intf_sel(interface);
> +
> + /* Only RGMII and RMII are supported */
> + if (ret != PHY_INTF_SEL_RGMII && ret != PHY_INTF_SEL_RMII)
> + ret = -EINVAL;
> +
> + return ret;
> +}
> +
> +static u32 rk_encode_wm16(u16 val, u16 mask)
> +{
> + u32 reg_val = mask << 16;
> +
> + if (mask)
> + reg_val |= mask & (val << (ffs(mask) - 1));
> +
> + return reg_val;
> +}
> +
> static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
> const struct rk_reg_speed_data *rsd,
> unsigned int reg, phy_interface_t interface,
> @@ -239,14 +269,11 @@ static void rk_gmac_integrated_fephy_powerdown(struct rk_priv_data *priv,
> #define PX30_GRF_GMAC_CON1 0x0904
>
> /* PX30_GRF_GMAC_CON1 */
> -#define PX30_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
> #define PX30_GMAC_SPEED_10M GRF_CLR_BIT(2)
> #define PX30_GMAC_SPEED_100M GRF_BIT(2)
>
> static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
> - PX30_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
> }
>
> static int px30_set_speed(struct rk_priv_data *bsp_priv,
> @@ -281,6 +308,9 @@ static int px30_set_speed(struct rk_priv_data *bsp_priv,
> static const struct rk_gmac_ops px30_ops = {
> .set_to_rmii = px30_set_to_rmii,
> .set_speed = px30_set_speed,
> +
> + .phy_intf_sel_grf_reg = PX30_GRF_GMAC_CON1,
> + .phy_intf_sel_mask = GENMASK_U16(6, 4),
> };
>
> #define RK3128_GRF_MAC_CON0 0x0168
> @@ -295,7 +325,6 @@ static const struct rk_gmac_ops px30_ops = {
> #define RK3128_GMAC_CLK_TX_DL_CFG(val) GRF_FIELD(6, 0, val)
>
> /* RK3128_GRF_MAC_CON1 */
> -#define RK3128_GMAC_PHY_INTF_SEL(val) GRF_FIELD(8, 6, val)
> #define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
> #define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
> #define RK3128_GMAC_SPEED_10M GRF_CLR_BIT(10)
> @@ -303,15 +332,10 @@ static const struct rk_gmac_ops px30_ops = {
> #define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
> #define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
> #define RK3128_GMAC_CLK(val) GRF_FIELD_CONST(13, 12, val)
> -#define RK3128_GMAC_RMII_MODE GRF_BIT(14)
> -#define RK3128_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
>
> static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> - regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
> - RK3128_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
> - RK3128_GMAC_RMII_MODE_CLR);
> regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
> DELAY_ENABLE(RK3128, tx_delay, rx_delay) |
> RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) |
> @@ -320,9 +344,6 @@ static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
> - RK3128_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
> - RK3128_GMAC_RMII_MODE);
> }
>
> static const struct rk_reg_speed_data rk3128_reg_speed_data = {
> @@ -344,6 +365,10 @@ static const struct rk_gmac_ops rk3128_ops = {
> .set_to_rgmii = rk3128_set_to_rgmii,
> .set_to_rmii = rk3128_set_to_rmii,
> .set_speed = rk3128_set_speed,
> +
> + .phy_intf_sel_grf_reg = RK3128_GRF_MAC_CON1,
> + .phy_intf_sel_mask = GENMASK_U16(8, 6),
> + .rmii_mode_mask = BIT_U16(14),
> };
>
> #define RK3228_GRF_MAC_CON0 0x0900
> @@ -356,7 +381,6 @@ static const struct rk_gmac_ops rk3128_ops = {
> #define RK3228_GMAC_CLK_TX_DL_CFG(val) GRF_FIELD(6, 0, val)
>
> /* RK3228_GRF_MAC_CON1 */
> -#define RK3228_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
> #define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
> #define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
> #define RK3228_GMAC_SPEED_10M GRF_CLR_BIT(2)
> @@ -364,8 +388,6 @@ static const struct rk_gmac_ops rk3128_ops = {
> #define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
> #define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
> #define RK3228_GMAC_CLK(val) GRF_FIELD_CONST(9, 8, val)
> -#define RK3228_GMAC_RMII_MODE GRF_BIT(10)
> -#define RK3228_GMAC_RMII_MODE_CLR GRF_CLR_BIT(10)
> #define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
> #define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
> #define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
> @@ -378,8 +400,6 @@ static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
> - RK3228_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
> - RK3228_GMAC_RMII_MODE_CLR |
> DELAY_ENABLE(RK3228, tx_delay, rx_delay));
>
> regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
> @@ -389,10 +409,6 @@ static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
> - RK3228_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
> - RK3228_GMAC_RMII_MODE);
> -
> /* set MAC to RMII mode */
> regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
> }
> @@ -426,13 +442,17 @@ static const struct rk_gmac_ops rk3228_ops = {
> .set_speed = rk3228_set_speed,
> .integrated_phy_powerup = rk3228_integrated_phy_powerup,
> .integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
> +
> + .phy_intf_sel_grf_reg = RK3228_GRF_MAC_CON1,
> + .phy_intf_sel_mask = GENMASK_U16(6, 4),
> + .rmii_mode_mask = BIT_U16(10),
> +
> };
>
> #define RK3288_GRF_SOC_CON1 0x0248
> #define RK3288_GRF_SOC_CON3 0x0250
>
> /*RK3288_GRF_SOC_CON1*/
> -#define RK3288_GMAC_PHY_INTF_SEL(val) GRF_FIELD(8, 6, val)
> #define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
> #define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
> #define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10)
> @@ -440,8 +460,6 @@ static const struct rk_gmac_ops rk3228_ops = {
> #define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
> #define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
> #define RK3288_GMAC_CLK(val) GRF_FIELD_CONST(13, 12, val)
> -#define RK3288_GMAC_RMII_MODE GRF_BIT(14)
> -#define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
>
> /*RK3288_GRF_SOC_CON3*/
> #define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
> @@ -454,9 +472,6 @@ static const struct rk_gmac_ops rk3228_ops = {
> static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> - regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
> - RK3288_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
> - RK3288_GMAC_RMII_MODE_CLR);
> regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
> DELAY_ENABLE(RK3288, tx_delay, rx_delay) |
> RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) |
> @@ -465,9 +480,6 @@ static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
> - RK3288_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
> - RK3288_GMAC_RMII_MODE);
> }
>
> static const struct rk_reg_speed_data rk3288_reg_speed_data = {
> @@ -489,12 +501,15 @@ static const struct rk_gmac_ops rk3288_ops = {
> .set_to_rgmii = rk3288_set_to_rgmii,
> .set_to_rmii = rk3288_set_to_rmii,
> .set_speed = rk3288_set_speed,
> +
> + .phy_intf_sel_grf_reg = RK3288_GRF_SOC_CON1,
> + .phy_intf_sel_mask = GENMASK_U16(8, 6),
> + .rmii_mode_mask = BIT_U16(14),
> };
>
> #define RK3308_GRF_MAC_CON0 0x04a0
>
> /* RK3308_GRF_MAC_CON0 */
> -#define RK3308_GMAC_PHY_INTF_SEL(val) GRF_FIELD(4, 2, val)
> #define RK3308_GMAC_FLOW_CTRL GRF_BIT(3)
> #define RK3308_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
> #define RK3308_GMAC_SPEED_10M GRF_CLR_BIT(0)
> @@ -502,8 +517,6 @@ static const struct rk_gmac_ops rk3288_ops = {
>
> static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
> - RK3308_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
> }
>
> static const struct rk_reg_speed_data rk3308_reg_speed_data = {
> @@ -521,6 +534,9 @@ static int rk3308_set_speed(struct rk_priv_data *bsp_priv,
> static const struct rk_gmac_ops rk3308_ops = {
> .set_to_rmii = rk3308_set_to_rmii,
> .set_speed = rk3308_set_speed,
> +
> + .phy_intf_sel_grf_reg = RK3308_GRF_MAC_CON0,
> + .phy_intf_sel_mask = GENMASK_U16(4, 2),
> };
>
> #define RK3328_GRF_MAC_CON0 0x0900
> @@ -533,7 +549,6 @@ static const struct rk_gmac_ops rk3308_ops = {
> #define RK3328_GMAC_CLK_TX_DL_CFG(val) GRF_FIELD(6, 0, val)
>
> /* RK3328_GRF_MAC_CON1 */
> -#define RK3328_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
> #define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
> #define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
> #define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
> @@ -541,20 +556,32 @@ static const struct rk_gmac_ops rk3308_ops = {
> #define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
> #define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
> #define RK3328_GMAC_CLK(val) GRF_FIELD_CONST(12, 11, val)
> -#define RK3328_GMAC_RMII_MODE GRF_BIT(9)
> -#define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
> #define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
> #define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
>
> /* RK3328_GRF_MACPHY_CON1 */
> #define RK3328_MACPHY_RMII_MODE GRF_BIT(9)
>
> +static int rk3328_init(struct rk_priv_data *bsp_priv)
> +{
> + switch (bsp_priv->id) {
> + case 0: /* gmac2io */
> + bsp_priv->phy_intf_sel_grf_reg = RK3328_GRF_MAC_CON1;
> + return 0;
> +
> + case 1: /* gmac2phy */
> + bsp_priv->phy_intf_sel_grf_reg = RK3328_GRF_MAC_CON2;
> + return 0;
> +
> + default:
> + return -EINVAL;
> + }
> +}
> +
> static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
> - RK3328_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
> - RK3328_GMAC_RMII_MODE_CLR |
> RK3328_GMAC_RXCLK_DLY_ENABLE |
> RK3328_GMAC_TXCLK_DLY_ENABLE);
>
> @@ -565,13 +592,6 @@ static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - unsigned int reg;
> -
> - reg = bsp_priv->id ? RK3328_GRF_MAC_CON2 : RK3328_GRF_MAC_CON1;
> -
> - regmap_write(bsp_priv->grf, reg,
> - RK3328_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
> - RK3328_GMAC_RMII_MODE);
> }
>
> static const struct rk_reg_speed_data rk3328_reg_speed_data = {
> @@ -602,12 +622,16 @@ static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
> }
>
> static const struct rk_gmac_ops rk3328_ops = {
> + .init = rk3328_init,
> .set_to_rgmii = rk3328_set_to_rgmii,
> .set_to_rmii = rk3328_set_to_rmii,
> .set_speed = rk3328_set_speed,
> .integrated_phy_powerup = rk3328_integrated_phy_powerup,
> .integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
>
> + .phy_intf_sel_mask = GENMASK_U16(6, 4),
> + .rmii_mode_mask = BIT_U16(9),
> +
> .regs_valid = true,
> .regs = {
> 0xff540000, /* gmac2io */
> @@ -620,7 +644,6 @@ static const struct rk_gmac_ops rk3328_ops = {
> #define RK3366_GRF_SOC_CON7 0x041c
>
> /* RK3366_GRF_SOC_CON6 */
> -#define RK3366_GMAC_PHY_INTF_SEL(val) GRF_FIELD(11, 9, val)
> #define RK3366_GMAC_FLOW_CTRL GRF_BIT(8)
> #define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
> #define RK3366_GMAC_SPEED_10M GRF_CLR_BIT(7)
> @@ -628,8 +651,6 @@ static const struct rk_gmac_ops rk3328_ops = {
> #define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
> #define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
> #define RK3366_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
> -#define RK3366_GMAC_RMII_MODE GRF_BIT(6)
> -#define RK3366_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
>
> /* RK3366_GRF_SOC_CON7 */
> #define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
> @@ -642,9 +663,6 @@ static const struct rk_gmac_ops rk3328_ops = {
> static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> - regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
> - RK3366_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
> - RK3366_GMAC_RMII_MODE_CLR);
> regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
> DELAY_ENABLE(RK3366, tx_delay, rx_delay) |
> RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) |
> @@ -653,9 +671,6 @@ static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
> - RK3366_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
> - RK3366_GMAC_RMII_MODE);
> }
>
> static const struct rk_reg_speed_data rk3366_reg_speed_data = {
> @@ -677,13 +692,16 @@ static const struct rk_gmac_ops rk3366_ops = {
> .set_to_rgmii = rk3366_set_to_rgmii,
> .set_to_rmii = rk3366_set_to_rmii,
> .set_speed = rk3366_set_speed,
> +
> + .phy_intf_sel_grf_reg = RK3366_GRF_SOC_CON6,
> + .phy_intf_sel_mask = GENMASK_U16(11, 9),
> + .rmii_mode_mask = BIT_U16(6),
> };
>
> #define RK3368_GRF_SOC_CON15 0x043c
> #define RK3368_GRF_SOC_CON16 0x0440
>
> /* RK3368_GRF_SOC_CON15 */
> -#define RK3368_GMAC_PHY_INTF_SEL(val) GRF_FIELD(11, 9, val)
> #define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
> #define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
> #define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7)
> @@ -691,8 +709,6 @@ static const struct rk_gmac_ops rk3366_ops = {
> #define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
> #define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
> #define RK3368_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
> -#define RK3368_GMAC_RMII_MODE GRF_BIT(6)
> -#define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
>
> /* RK3368_GRF_SOC_CON16 */
> #define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
> @@ -705,9 +721,6 @@ static const struct rk_gmac_ops rk3366_ops = {
> static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> - regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
> - RK3368_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
> - RK3368_GMAC_RMII_MODE_CLR);
> regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
> DELAY_ENABLE(RK3368, tx_delay, rx_delay) |
> RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) |
> @@ -716,9 +729,6 @@ static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
> - RK3368_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
> - RK3368_GMAC_RMII_MODE);
> }
>
> static const struct rk_reg_speed_data rk3368_reg_speed_data = {
> @@ -740,13 +750,16 @@ static const struct rk_gmac_ops rk3368_ops = {
> .set_to_rgmii = rk3368_set_to_rgmii,
> .set_to_rmii = rk3368_set_to_rmii,
> .set_speed = rk3368_set_speed,
> +
> + .phy_intf_sel_grf_reg = RK3368_GRF_SOC_CON15,
> + .phy_intf_sel_mask = GENMASK_U16(11, 9),
> + .rmii_mode_mask = BIT_U16(6),
> };
>
> #define RK3399_GRF_SOC_CON5 0xc214
> #define RK3399_GRF_SOC_CON6 0xc218
>
> /* RK3399_GRF_SOC_CON5 */
> -#define RK3399_GMAC_PHY_INTF_SEL(val) GRF_FIELD(11, 9, val)
> #define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
> #define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
> #define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7)
> @@ -754,8 +767,6 @@ static const struct rk_gmac_ops rk3368_ops = {
> #define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
> #define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
> #define RK3399_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
> -#define RK3399_GMAC_RMII_MODE GRF_BIT(6)
> -#define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
>
> /* RK3399_GRF_SOC_CON6 */
> #define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
> @@ -768,9 +779,6 @@ static const struct rk_gmac_ops rk3368_ops = {
> static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> - regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
> - RK3399_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
> - RK3399_GMAC_RMII_MODE_CLR);
> regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
> DELAY_ENABLE(RK3399, tx_delay, rx_delay) |
> RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) |
> @@ -779,9 +787,6 @@ static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
> - RK3399_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII) |
> - RK3399_GMAC_RMII_MODE);
> }
>
> static const struct rk_reg_speed_data rk3399_reg_speed_data = {
> @@ -803,6 +808,10 @@ static const struct rk_gmac_ops rk3399_ops = {
> .set_to_rgmii = rk3399_set_to_rgmii,
> .set_to_rmii = rk3399_set_to_rmii,
> .set_speed = rk3399_set_speed,
> +
> + .phy_intf_sel_grf_reg = RK3399_GRF_SOC_CON5,
> + .phy_intf_sel_mask = GENMASK_U16(11, 9),
> + .rmii_mode_mask = BIT_U16(6),
> };
>
> #define RK3506_GRF_SOC_CON8 0x0020
> @@ -1005,7 +1014,6 @@ static const struct rk_gmac_ops rk3528_ops = {
> #define RK3568_GRF_GMAC1_CON1 0x038c
>
> /* RK3568_GRF_GMAC0_CON1 && RK3568_GRF_GMAC1_CON1 */
> -#define RK3568_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
> #define RK3568_GMAC_FLOW_CTRL GRF_BIT(3)
> #define RK3568_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
> #define RK3568_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
> @@ -1017,6 +1025,22 @@ static const struct rk_gmac_ops rk3528_ops = {
> #define RK3568_GMAC_CLK_RX_DL_CFG(val) GRF_FIELD(14, 8, val)
> #define RK3568_GMAC_CLK_TX_DL_CFG(val) GRF_FIELD(6, 0, val)
>
> +static int rk3568_init(struct rk_priv_data *bsp_priv)
> +{
> + switch (bsp_priv->id) {
> + case 0:
> + bsp_priv->phy_intf_sel_grf_reg = RK3568_GRF_GMAC0_CON1;
> + return 0;
> +
> + case 1:
> + bsp_priv->phy_intf_sel_grf_reg = RK3568_GRF_GMAC1_CON1;
> + return 0;
> +
> + default:
> + return -EINVAL;
> + }
> +}
> +
> static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> @@ -1032,25 +1056,22 @@ static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
> RK3568_GMAC_CLK_TX_DL_CFG(tx_delay));
>
> regmap_write(bsp_priv->grf, con1,
> - RK3568_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
> RK3568_GMAC_RXCLK_DLY_ENABLE |
> RK3568_GMAC_TXCLK_DLY_ENABLE);
> }
>
> static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - u32 con1;
> -
> - con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
> - RK3568_GRF_GMAC0_CON1;
> - regmap_write(bsp_priv->grf, con1,
> - RK3568_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
> }
>
> static const struct rk_gmac_ops rk3568_ops = {
> + .init = rk3568_init,
> .set_to_rgmii = rk3568_set_to_rgmii,
> .set_to_rmii = rk3568_set_to_rmii,
> .set_speed = rk_set_clk_mac_speed,
> +
> + .phy_intf_sel_mask = GENMASK_U16(6, 4),
> +
> .regs_valid = true,
> .regs = {
> 0xfe2a0000, /* gmac0 */
> @@ -1077,9 +1098,6 @@ static const struct rk_gmac_ops rk3568_ops = {
> #define RK3576_GRF_GMAC_CON0 0X0020
> #define RK3576_GRF_GMAC_CON1 0X0024
>
> -#define RK3576_GMAC_RMII_MODE GRF_BIT(3)
> -#define RK3576_GMAC_RGMII_MODE GRF_CLR_BIT(3)
> -
> #define RK3576_GMAC_CLK_SELECT_IO GRF_BIT(7)
> #define RK3576_GMAC_CLK_SELECT_CRU GRF_CLR_BIT(7)
>
> @@ -1091,16 +1109,27 @@ static const struct rk_gmac_ops rk3568_ops = {
> #define RK3576_GMAC_CLK_RMII_GATE GRF_BIT(4)
> #define RK3576_GMAC_CLK_RMII_NOGATE GRF_CLR_BIT(4)
>
> +static int rk3576_init(struct rk_priv_data *bsp_priv)
> +{
> + switch (bsp_priv->id) {
> + case 0:
> + bsp_priv->phy_intf_sel_grf_reg = RK3576_GRF_GMAC_CON0;
> + return 0;
> +
> + case 1:
> + bsp_priv->phy_intf_sel_grf_reg = RK3576_GRF_GMAC_CON1;
> + return 0;
> +
> + default:
> + return -EINVAL;
> + }
> +}
> +
> static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> unsigned int offset_con;
>
> - offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> - RK3576_GRF_GMAC_CON0;
> -
> - regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RGMII_MODE);
> -
> offset_con = bsp_priv->id == 1 ? RK3576_VCCIO0_1_3_IOC_CON4 :
> RK3576_VCCIO0_1_3_IOC_CON2;
>
> @@ -1121,12 +1150,6 @@ static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - unsigned int offset_con;
> -
> - offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> - RK3576_GRF_GMAC_CON0;
> -
> - regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RMII_MODE);
> }
>
> static const struct rk_reg_speed_data rk3578_reg_speed_data = {
> @@ -1166,10 +1189,14 @@ static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv, bool input
> }
>
> static const struct rk_gmac_ops rk3576_ops = {
> + .init = rk3576_init,
> .set_to_rgmii = rk3576_set_to_rgmii,
> .set_to_rmii = rk3576_set_to_rmii,
> .set_speed = rk3576_set_gmac_speed,
> .set_clock_selection = rk3576_set_clock_selection,
> +
> + .rmii_mode_mask = BIT_U16(3),
> +
> .php_grf_required = true,
> .regs_valid = true,
> .regs = {
> @@ -1196,9 +1223,6 @@ static const struct rk_gmac_ops rk3576_ops = {
> #define RK3588_GRF_GMAC_CON0 0X0008
> #define RK3588_GRF_CLK_CON1 0X0070
>
> -#define RK3588_GMAC_PHY_INTF_SEL(id, val) \
> - (GRF_FIELD(5, 3, val) << ((id) * 6))
> -
> #define RK3588_GMAC_CLK_RMII_MODE(id) GRF_BIT(5 * (id))
> #define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id))
>
> @@ -1214,6 +1238,22 @@ static const struct rk_gmac_ops rk3576_ops = {
> #define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1)
> #define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + 1)
>
> +static int rk3588_init(struct rk_priv_data *bsp_priv)
> +{
> + switch (bsp_priv->id) {
> + case 0:
> + bsp_priv->phy_intf_sel_mask = GENMASK_U16(5, 3);
> + return 0;
> +
> + case 1:
> + bsp_priv->phy_intf_sel_mask = GENMASK_U16(11, 9);
> + return 0;
> +
> + default:
> + return -EINVAL;
> + }
> +}
> +
> static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> @@ -1222,9 +1262,6 @@ static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv,
> offset_con = bsp_priv->id == 1 ? RK3588_GRF_GMAC_CON9 :
> RK3588_GRF_GMAC_CON8;
>
> - regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0,
> - RK3588_GMAC_PHY_INTF_SEL(id, PHY_INTF_SEL_RGMII));
> -
> regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1,
> RK3588_GMAC_CLK_RGMII_MODE(id));
>
> @@ -1239,9 +1276,6 @@ static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0,
> - RK3588_GMAC_PHY_INTF_SEL(bsp_priv->id, PHY_INTF_SEL_RMII));
> -
> regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1,
> RK3588_GMAC_CLK_RMII_MODE(bsp_priv->id));
> }
> @@ -1294,10 +1328,14 @@ static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input
> }
>
> static const struct rk_gmac_ops rk3588_ops = {
> + .init = rk3588_init,
> .set_to_rgmii = rk3588_set_to_rgmii,
> .set_to_rmii = rk3588_set_to_rmii,
> .set_speed = rk3588_set_gmac_speed,
> .set_clock_selection = rk3588_set_clock_selection,
> +
> + .phy_intf_sel_grf_reg = RK3588_GRF_GMAC_CON0,
> +
> .php_grf_required = true,
> .regs_valid = true,
> .regs = {
> @@ -1310,7 +1348,6 @@ static const struct rk_gmac_ops rk3588_ops = {
> #define RV1108_GRF_GMAC_CON0 0X0900
>
> /* RV1108_GRF_GMAC_CON0 */
> -#define RV1108_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
> #define RV1108_GMAC_FLOW_CTRL GRF_BIT(3)
> #define RV1108_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
> #define RV1108_GMAC_SPEED_10M GRF_CLR_BIT(2)
> @@ -1320,8 +1357,6 @@ static const struct rk_gmac_ops rk3588_ops = {
>
> static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
> - RV1108_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
> }
>
> static const struct rk_reg_speed_data rv1108_reg_speed_data = {
> @@ -1339,6 +1374,9 @@ static int rv1108_set_speed(struct rk_priv_data *bsp_priv,
> static const struct rk_gmac_ops rv1108_ops = {
> .set_to_rmii = rv1108_set_to_rmii,
> .set_speed = rv1108_set_speed,
> +
> + .phy_intf_sel_grf_reg = RV1108_GRF_GMAC_CON0,
> + .phy_intf_sel_mask = GENMASK_U16(6, 4),
> };
>
> #define RV1126_GRF_GMAC_CON0 0X0070
> @@ -1346,7 +1384,6 @@ static const struct rk_gmac_ops rv1108_ops = {
> #define RV1126_GRF_GMAC_CON2 0X0078
>
> /* RV1126_GRF_GMAC_CON0 */
> -#define RV1126_GMAC_PHY_INTF_SEL(val) GRF_FIELD(6, 4, val)
> #define RV1126_GMAC_FLOW_CTRL GRF_BIT(7)
> #define RV1126_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(7)
> #define RV1126_GMAC_M0_RXCLK_DLY_ENABLE GRF_BIT(1)
> @@ -1369,7 +1406,6 @@ static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
> int tx_delay, int rx_delay)
> {
> regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
> - RV1126_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RGMII) |
> RV1126_GMAC_M0_RXCLK_DLY_ENABLE |
> RV1126_GMAC_M0_TXCLK_DLY_ENABLE |
> RV1126_GMAC_M1_RXCLK_DLY_ENABLE |
> @@ -1386,14 +1422,15 @@ static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
>
> static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv)
> {
> - regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
> - RV1126_GMAC_PHY_INTF_SEL(PHY_INTF_SEL_RMII));
> }
>
> static const struct rk_gmac_ops rv1126_ops = {
> .set_to_rgmii = rv1126_set_to_rgmii,
> .set_to_rmii = rv1126_set_to_rmii,
> .set_speed = rk_set_clk_mac_speed,
> +
> + .phy_intf_sel_grf_reg = RV1126_GRF_GMAC_CON0,
> + .phy_intf_sel_mask = GENMASK_U16(6, 4),
> };
>
> static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
> @@ -1614,6 +1651,11 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
>
> bsp_priv->dev = dev;
>
> + /* Set the default phy_intf_sel and RMII mode register parameters. */
> + bsp_priv->phy_intf_sel_grf_reg = ops->phy_intf_sel_grf_reg;
> + bsp_priv->phy_intf_sel_mask = ops->phy_intf_sel_mask;
> + bsp_priv->rmii_mode_mask = ops->rmii_mode_mask;
> +
> if (ops->init) {
> ret = ops->init(bsp_priv);
> if (ret) {
> @@ -1649,6 +1691,7 @@ static int rk_gmac_check_ops(struct rk_priv_data *bsp_priv)
> static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
> {
> struct device *dev = bsp_priv->dev;
> + u32 val;
> int ret;
>
> ret = rk_gmac_check_ops(bsp_priv);
> @@ -1659,6 +1702,24 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
> if (ret)
> return ret;
>
> + ret = rk_get_phy_intf_sel(bsp_priv->phy_iface);
> + if (ret < 0)
> + return ret;
> +
> + if (bsp_priv->phy_intf_sel_mask) {
> + /* Encode the phy_intf_sel value */
> + val = rk_encode_wm16(ret, bsp_priv->phy_intf_sel_mask);
> +
> + /* If defined, encode the RMII mode mask setting. */
> + val |= rk_encode_wm16(ret == PHY_INTF_SEL_RMII,
> + bsp_priv->rmii_mode_mask);
> +
> + ret = regmap_write(bsp_priv->grf,
> + bsp_priv->phy_intf_sel_grf_reg, val);
> + if (ret < 0)
> + return ret;
> + }
> +
> /*rmii or rgmii*/
> switch (bsp_priv->phy_iface) {
> case PHY_INTERFACE_MODE_RGMII:
> --
> 2.47.3
>
>
>
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH RFC net-next 05/15] net: stmmac: rk: move speed GRF register offset to private data
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (3 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 04/15] net: stmmac: rk: convert to mask-based interface mode configuration Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 06/15] net: stmmac: rk: convert rk3588 to rk_set_reg_speed() Russell King (Oracle)
` (11 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Move the speed/clocking related GRF register offset into the driver
private data, convert rk_set_reg_speed() to use it and initialise this
member either from the corresponding member in struct rk_gmac_ops, or
the SoC specific initialisation function.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 109 ++++++++++++------
1 file changed, 76 insertions(+), 33 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 369792b62c5e..e2c5bfbeadc5 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -50,6 +50,8 @@ struct rk_gmac_ops {
u16 phy_intf_sel_mask;
u16 rmii_mode_mask;
+ u16 speed_grf_reg;
+
bool php_grf_required;
bool regs_valid;
u32 regs[];
@@ -99,6 +101,8 @@ struct rk_priv_data {
u16 phy_intf_sel_grf_reg;
u16 phy_intf_sel_mask;
u16 rmii_mode_mask;
+
+ u16 speed_grf_reg;
};
#define GMAC_CLK_DIV1_125M 0
@@ -128,8 +132,7 @@ static u32 rk_encode_wm16(u16 val, u16 mask)
static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
const struct rk_reg_speed_data *rsd,
- unsigned int reg, phy_interface_t interface,
- int speed)
+ phy_interface_t interface, int speed)
{
unsigned int val;
@@ -165,7 +168,7 @@ static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
return -EINVAL;
}
- regmap_write(bsp_priv->grf, reg, val);
+ regmap_write(bsp_priv->grf, bsp_priv->speed_grf_reg, val);
return 0;
@@ -358,7 +361,7 @@ static int rk3128_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
return rk_set_reg_speed(bsp_priv, &rk3128_reg_speed_data,
- RK3128_GRF_MAC_CON1, interface, speed);
+ interface, speed);
}
static const struct rk_gmac_ops rk3128_ops = {
@@ -369,6 +372,8 @@ static const struct rk_gmac_ops rk3128_ops = {
.phy_intf_sel_grf_reg = RK3128_GRF_MAC_CON1,
.phy_intf_sel_mask = GENMASK_U16(8, 6),
.rmii_mode_mask = BIT_U16(14),
+
+ .speed_grf_reg = RK3128_GRF_MAC_CON1,
};
#define RK3228_GRF_MAC_CON0 0x0900
@@ -425,7 +430,7 @@ static int rk3228_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
return rk_set_reg_speed(bsp_priv, &rk3228_reg_speed_data,
- RK3228_GRF_MAC_CON1, interface, speed);
+ interface, speed);
}
static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
@@ -447,6 +452,7 @@ static const struct rk_gmac_ops rk3228_ops = {
.phy_intf_sel_mask = GENMASK_U16(6, 4),
.rmii_mode_mask = BIT_U16(10),
+ .speed_grf_reg = RK3228_GRF_MAC_CON1,
};
#define RK3288_GRF_SOC_CON1 0x0248
@@ -494,7 +500,7 @@ static int rk3288_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
return rk_set_reg_speed(bsp_priv, &rk3288_reg_speed_data,
- RK3288_GRF_SOC_CON1, interface, speed);
+ interface, speed);
}
static const struct rk_gmac_ops rk3288_ops = {
@@ -505,6 +511,8 @@ static const struct rk_gmac_ops rk3288_ops = {
.phy_intf_sel_grf_reg = RK3288_GRF_SOC_CON1,
.phy_intf_sel_mask = GENMASK_U16(8, 6),
.rmii_mode_mask = BIT_U16(14),
+
+ .speed_grf_reg = RK3288_GRF_SOC_CON1,
};
#define RK3308_GRF_MAC_CON0 0x04a0
@@ -528,7 +536,7 @@ static int rk3308_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
return rk_set_reg_speed(bsp_priv, &rk3308_reg_speed_data,
- RK3308_GRF_MAC_CON0, interface, speed);
+ interface, speed);
}
static const struct rk_gmac_ops rk3308_ops = {
@@ -537,6 +545,8 @@ static const struct rk_gmac_ops rk3308_ops = {
.phy_intf_sel_grf_reg = RK3308_GRF_MAC_CON0,
.phy_intf_sel_mask = GENMASK_U16(4, 2),
+
+ .speed_grf_reg = RK3308_GRF_MAC_CON0,
};
#define RK3328_GRF_MAC_CON0 0x0900
@@ -567,10 +577,12 @@ static int rk3328_init(struct rk_priv_data *bsp_priv)
switch (bsp_priv->id) {
case 0: /* gmac2io */
bsp_priv->phy_intf_sel_grf_reg = RK3328_GRF_MAC_CON1;
+ bsp_priv->speed_grf_reg = RK3328_GRF_MAC_CON1;
return 0;
case 1: /* gmac2phy */
bsp_priv->phy_intf_sel_grf_reg = RK3328_GRF_MAC_CON2;
+ bsp_priv->speed_grf_reg = RK3328_GRF_MAC_CON2;
return 0;
default:
@@ -605,11 +617,7 @@ static const struct rk_reg_speed_data rk3328_reg_speed_data = {
static int rk3328_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- unsigned int reg;
-
- reg = bsp_priv->id ? RK3328_GRF_MAC_CON2 : RK3328_GRF_MAC_CON1;
-
- return rk_set_reg_speed(bsp_priv, &rk3328_reg_speed_data, reg,
+ return rk_set_reg_speed(bsp_priv, &rk3328_reg_speed_data,
interface, speed);
}
@@ -685,7 +693,7 @@ static int rk3366_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
return rk_set_reg_speed(bsp_priv, &rk3366_reg_speed_data,
- RK3366_GRF_SOC_CON6, interface, speed);
+ interface, speed);
}
static const struct rk_gmac_ops rk3366_ops = {
@@ -696,6 +704,8 @@ static const struct rk_gmac_ops rk3366_ops = {
.phy_intf_sel_grf_reg = RK3366_GRF_SOC_CON6,
.phy_intf_sel_mask = GENMASK_U16(11, 9),
.rmii_mode_mask = BIT_U16(6),
+
+ .speed_grf_reg = RK3366_GRF_SOC_CON6,
};
#define RK3368_GRF_SOC_CON15 0x043c
@@ -743,7 +753,7 @@ static int rk3368_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
return rk_set_reg_speed(bsp_priv, &rk3368_reg_speed_data,
- RK3368_GRF_SOC_CON15, interface, speed);
+ interface, speed);
}
static const struct rk_gmac_ops rk3368_ops = {
@@ -754,6 +764,8 @@ static const struct rk_gmac_ops rk3368_ops = {
.phy_intf_sel_grf_reg = RK3368_GRF_SOC_CON15,
.phy_intf_sel_mask = GENMASK_U16(11, 9),
.rmii_mode_mask = BIT_U16(6),
+
+ .speed_grf_reg = RK3368_GRF_SOC_CON15,
};
#define RK3399_GRF_SOC_CON5 0xc214
@@ -801,7 +813,7 @@ static int rk3399_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
return rk_set_reg_speed(bsp_priv, &rk3399_reg_speed_data,
- RK3399_GRF_SOC_CON5, interface, speed);
+ interface, speed);
}
static const struct rk_gmac_ops rk3399_ops = {
@@ -812,6 +824,8 @@ static const struct rk_gmac_ops rk3399_ops = {
.phy_intf_sel_grf_reg = RK3399_GRF_SOC_CON5,
.phy_intf_sel_mask = GENMASK_U16(11, 9),
.rmii_mode_mask = BIT_U16(6),
+
+ .speed_grf_reg = RK3399_GRF_SOC_CON5,
};
#define RK3506_GRF_SOC_CON8 0x0020
@@ -828,6 +842,22 @@ static const struct rk_gmac_ops rk3399_ops = {
#define RK3506_GMAC_CLK_RMII_GATE GRF_BIT(2)
#define RK3506_GMAC_CLK_RMII_NOGATE GRF_CLR_BIT(2)
+static int rk3506_init(struct rk_priv_data *bsp_priv)
+{
+ switch (bsp_priv->id) {
+ case 0:
+ bsp_priv->speed_grf_reg = RK3506_GRF_SOC_CON8;
+ return 0;
+
+ case 1:
+ bsp_priv->speed_grf_reg = RK3506_GRF_SOC_CON11;
+ return 0;
+
+ default:
+ return -EINVAL;
+ }
+}
+
static void rk3506_set_to_rmii(struct rk_priv_data *bsp_priv)
{
unsigned int id = bsp_priv->id, offset;
@@ -844,11 +874,8 @@ static const struct rk_reg_speed_data rk3506_reg_speed_data = {
static int rk3506_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- unsigned int id = bsp_priv->id, offset;
-
- offset = (id == 1) ? RK3506_GRF_SOC_CON11 : RK3506_GRF_SOC_CON8;
return rk_set_reg_speed(bsp_priv, &rk3506_reg_speed_data,
- offset, interface, speed);
+ interface, speed);
}
static void rk3506_set_clock_selection(struct rk_priv_data *bsp_priv,
@@ -866,6 +893,7 @@ static void rk3506_set_clock_selection(struct rk_priv_data *bsp_priv,
}
static const struct rk_gmac_ops rk3506_ops = {
+ .init = rk3506_init,
.set_to_rmii = rk3506_set_to_rmii,
.set_speed = rk3506_set_speed,
.set_clock_selection = rk3506_set_clock_selection,
@@ -910,6 +938,22 @@ static const struct rk_gmac_ops rk3506_ops = {
#define RK3528_GMAC1_CLK_RMII_GATE GRF_BIT(9)
#define RK3528_GMAC1_CLK_RMII_NOGATE GRF_CLR_BIT(9)
+static int rk3528_init(struct rk_priv_data *bsp_priv)
+{
+ switch (bsp_priv->id) {
+ case 0:
+ bsp_priv->speed_grf_reg = RK3528_VO_GRF_GMAC_CON;
+ return 0;
+
+ case 1:
+ bsp_priv->speed_grf_reg = RK3528_VPU_GRF_GMAC_CON5;
+ return 0;
+
+ default:
+ return -EINVAL;
+ }
+}
+
static void rk3528_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
{
@@ -952,17 +996,13 @@ static int rk3528_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
const struct rk_reg_speed_data *rsd;
- unsigned int reg;
- if (bsp_priv->id == 1) {
+ if (bsp_priv->id == 1)
rsd = &rk3528_gmac1_reg_speed_data;
- reg = RK3528_VPU_GRF_GMAC_CON5;
- } else {
+ else
rsd = &rk3528_gmac0_reg_speed_data;
- reg = RK3528_VO_GRF_GMAC_CON;
- }
- return rk_set_reg_speed(bsp_priv, rsd, reg, interface, speed);
+ return rk_set_reg_speed(bsp_priv, rsd, interface, speed);
}
static void rk3528_set_clock_selection(struct rk_priv_data *bsp_priv,
@@ -994,6 +1034,7 @@ static void rk3528_integrated_phy_powerdown(struct rk_priv_data *bsp_priv)
}
static const struct rk_gmac_ops rk3528_ops = {
+ .init = rk3528_init,
.set_to_rgmii = rk3528_set_to_rgmii,
.set_to_rmii = rk3528_set_to_rmii,
.set_speed = rk3528_set_speed,
@@ -1114,10 +1155,12 @@ static int rk3576_init(struct rk_priv_data *bsp_priv)
switch (bsp_priv->id) {
case 0:
bsp_priv->phy_intf_sel_grf_reg = RK3576_GRF_GMAC_CON0;
+ bsp_priv->speed_grf_reg = RK3576_GRF_GMAC_CON0;
return 0;
case 1:
bsp_priv->phy_intf_sel_grf_reg = RK3576_GRF_GMAC_CON1;
+ bsp_priv->speed_grf_reg = RK3576_GRF_GMAC_CON1;
return 0;
default:
@@ -1163,12 +1206,7 @@ static const struct rk_reg_speed_data rk3578_reg_speed_data = {
static int rk3576_set_gmac_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- unsigned int offset_con;
-
- offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
- RK3576_GRF_GMAC_CON0;
-
- return rk_set_reg_speed(bsp_priv, &rk3578_reg_speed_data, offset_con,
+ return rk_set_reg_speed(bsp_priv, &rk3578_reg_speed_data,
interface, speed);
}
@@ -1368,7 +1406,7 @@ static int rv1108_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
return rk_set_reg_speed(bsp_priv, &rv1108_reg_speed_data,
- RV1108_GRF_GMAC_CON0, interface, speed);
+ interface, speed);
}
static const struct rk_gmac_ops rv1108_ops = {
@@ -1377,6 +1415,8 @@ static const struct rk_gmac_ops rv1108_ops = {
.phy_intf_sel_grf_reg = RV1108_GRF_GMAC_CON0,
.phy_intf_sel_mask = GENMASK_U16(6, 4),
+
+ .speed_grf_reg = RV1108_GRF_GMAC_CON0,
};
#define RV1126_GRF_GMAC_CON0 0X0070
@@ -1656,6 +1696,9 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
bsp_priv->phy_intf_sel_mask = ops->phy_intf_sel_mask;
bsp_priv->rmii_mode_mask = ops->rmii_mode_mask;
+ /* Set the default speed related parameters */
+ bsp_priv->speed_grf_reg = ops->speed_grf_reg;
+
if (ops->init) {
ret = ops->init(bsp_priv);
if (ret) {
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 06/15] net: stmmac: rk: convert rk3588 to rk_set_reg_speed()
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (4 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 05/15] net: stmmac: rk: move speed GRF register offset to private data Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 07/15] net: stmmac: rk: use rk_encode_wm16() for RGMII clocks Russell King (Oracle)
` (10 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Update rk_set_reg_speed() to use either the grf or php_grf regmap
depending on the SoC's requirements and convert rk3588, removing
its custom code.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 62 ++++++++++---------
1 file changed, 33 insertions(+), 29 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index e2c5bfbeadc5..2061ced12d6c 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -52,6 +52,7 @@ struct rk_gmac_ops {
u16 speed_grf_reg;
+ bool speed_reg_php_grf;
bool php_grf_required;
bool regs_valid;
u32 regs[];
@@ -134,6 +135,7 @@ static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
const struct rk_reg_speed_data *rsd,
phy_interface_t interface, int speed)
{
+ struct regmap *regmap;
unsigned int val;
if (phy_interface_mode_is_rgmii(interface)) {
@@ -168,7 +170,12 @@ static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
return -EINVAL;
}
- regmap_write(bsp_priv->grf, bsp_priv->speed_grf_reg, val);
+ if (bsp_priv->ops->speed_reg_php_grf)
+ regmap = bsp_priv->php_grf;
+ else
+ regmap = bsp_priv->grf;
+
+ regmap_write(regmap, bsp_priv->speed_grf_reg, val);
return 0;
@@ -1318,39 +1325,33 @@ static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
RK3588_GMAC_CLK_RMII_MODE(bsp_priv->id));
}
+static const struct rk_reg_speed_data rk3588_gmac0_speed_data = {
+ .rgmii_10 = RK3588_GMAC_CLK_RGMII(0, GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3588_GMAC_CLK_RGMII(0, GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3588_GMAC_CLK_RGMII(0, GMAC_CLK_DIV1_125M),
+ .rmii_10 = RK3588_GMA_CLK_RMII_DIV20(0),
+ .rmii_100 = RK3588_GMA_CLK_RMII_DIV2(0),
+};
+
+static const struct rk_reg_speed_data rk3588_gmac1_speed_data = {
+ .rgmii_10 = RK3588_GMAC_CLK_RGMII(1, GMAC_CLK_DIV50_2_5M),
+ .rgmii_100 = RK3588_GMAC_CLK_RGMII(1, GMAC_CLK_DIV5_25M),
+ .rgmii_1000 = RK3588_GMAC_CLK_RGMII(1, GMAC_CLK_DIV1_125M),
+ .rmii_10 = RK3588_GMA_CLK_RMII_DIV20(1),
+ .rmii_100 = RK3588_GMA_CLK_RMII_DIV2(1),
+};
+
static int rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- unsigned int val = 0, id = bsp_priv->id;
-
- switch (speed) {
- case 10:
- if (interface == PHY_INTERFACE_MODE_RMII)
- val = RK3588_GMA_CLK_RMII_DIV20(id);
- else
- val = RK3588_GMAC_CLK_RGMII(id, GMAC_CLK_DIV50_2_5M);
- break;
- case 100:
- if (interface == PHY_INTERFACE_MODE_RMII)
- val = RK3588_GMA_CLK_RMII_DIV2(id);
- else
- val = RK3588_GMAC_CLK_RGMII(id, GMAC_CLK_DIV5_25M);
- break;
- case 1000:
- if (interface != PHY_INTERFACE_MODE_RMII)
- val = RK3588_GMAC_CLK_RGMII(id, GMAC_CLK_DIV1_125M);
- else
- goto err;
- break;
- default:
- goto err;
- }
+ const struct rk_reg_speed_data *rsd;
- regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, val);
+ if (bsp_priv->id == 0)
+ rsd = &rk3588_gmac0_speed_data;
+ else
+ rsd = &rk3588_gmac1_speed_data;
- return 0;
-err:
- return -EINVAL;
+ return rk_set_reg_speed(bsp_priv, rsd, interface, speed);
}
static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
@@ -1374,6 +1375,9 @@ static const struct rk_gmac_ops rk3588_ops = {
.phy_intf_sel_grf_reg = RK3588_GRF_GMAC_CON0,
+ .speed_reg_php_grf = true,
+ .speed_grf_reg = RK3588_GRF_CLK_CON1,
+
.php_grf_required = true,
.regs_valid = true,
.regs = {
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 07/15] net: stmmac: rk: use rk_encode_wm16() for RGMII clocks
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (5 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 06/15] net: stmmac: rk: convert rk3588 to rk_set_reg_speed() Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 08/15] net: stmmac: rk: use rk_encode_wm16() for RMII speed Russell King (Oracle)
` (9 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
As all of the RGMII clock selection bitfields (gmii_clk_sel) use the
same encoding, parameterise this by providing the bitfield mask in
the BSP private data.
One additional change is for RK3328 - as only gmac2io supports RGMII,
only initialise the mask for this instance.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 94 +++++++------------
1 file changed, 32 insertions(+), 62 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 2061ced12d6c..d11a58d7f24b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -27,9 +27,6 @@
struct rk_priv_data;
struct rk_reg_speed_data {
- unsigned int rgmii_10;
- unsigned int rgmii_100;
- unsigned int rgmii_1000;
unsigned int rmii_10;
unsigned int rmii_100;
};
@@ -51,6 +48,7 @@ struct rk_gmac_ops {
u16 rmii_mode_mask;
u16 speed_grf_reg;
+ u16 gmii_clk_sel_mask;
bool speed_reg_php_grf;
bool php_grf_required;
@@ -104,12 +102,24 @@ struct rk_priv_data {
u16 rmii_mode_mask;
u16 speed_grf_reg;
+ u16 gmii_clk_sel_mask;
};
#define GMAC_CLK_DIV1_125M 0
#define GMAC_CLK_DIV50_2_5M 2
#define GMAC_CLK_DIV5_25M 3
+static int rk_gmac_rgmii_clk_div(int speed)
+{
+ if (speed == SPEED_10)
+ return GMAC_CLK_DIV50_2_5M;
+ if (speed == SPEED_100)
+ return GMAC_CLK_DIV5_25M;
+ if (speed == SPEED_1000)
+ return GMAC_CLK_DIV1_125M;
+ return -EINVAL;
+}
+
static int rk_get_phy_intf_sel(phy_interface_t interface)
{
int ret = stmmac_get_phy_intf_sel(interface);
@@ -137,20 +147,14 @@ static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
{
struct regmap *regmap;
unsigned int val;
+ int ret;
if (phy_interface_mode_is_rgmii(interface)) {
- if (speed == SPEED_10) {
- val = rsd->rgmii_10;
- } else if (speed == SPEED_100) {
- val = rsd->rgmii_100;
- } else if (speed == SPEED_1000) {
- val = rsd->rgmii_1000;
- } else {
- /* Phylink will not allow inappropriate speeds for
- * interface modes, so this should never happen.
- */
- return -EINVAL;
- }
+ ret = rk_gmac_rgmii_clk_div(speed);
+ if (ret < 0)
+ return ret;
+
+ val = rk_encode_wm16(ret, bsp_priv->gmii_clk_sel_mask);
} else if (interface == PHY_INTERFACE_MODE_RMII) {
if (speed == SPEED_10) {
val = rsd->rmii_10;
@@ -341,7 +345,6 @@ static const struct rk_gmac_ops px30_ops = {
#define RK3128_GMAC_SPEED_100M GRF_BIT(10)
#define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
#define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
-#define RK3128_GMAC_CLK(val) GRF_FIELD_CONST(13, 12, val)
static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
@@ -357,9 +360,6 @@ static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3128_reg_speed_data = {
- .rgmii_10 = RK3128_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3128_GMAC_CLK(GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3128_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3128_GMAC_RMII_CLK_2_5M | RK3128_GMAC_SPEED_10M,
.rmii_100 = RK3128_GMAC_RMII_CLK_25M | RK3128_GMAC_SPEED_100M,
};
@@ -381,6 +381,7 @@ static const struct rk_gmac_ops rk3128_ops = {
.rmii_mode_mask = BIT_U16(14),
.speed_grf_reg = RK3128_GRF_MAC_CON1,
+ .gmii_clk_sel_mask = GENMASK_U16(13, 12),
};
#define RK3228_GRF_MAC_CON0 0x0900
@@ -399,7 +400,6 @@ static const struct rk_gmac_ops rk3128_ops = {
#define RK3228_GMAC_SPEED_100M GRF_BIT(2)
#define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
#define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
-#define RK3228_GMAC_CLK(val) GRF_FIELD_CONST(9, 8, val)
#define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
#define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
#define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
@@ -426,9 +426,6 @@ static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3228_reg_speed_data = {
- .rgmii_10 = RK3228_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3228_GMAC_CLK(GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3228_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_SPEED_10M,
.rmii_100 = RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_SPEED_100M,
};
@@ -460,6 +457,7 @@ static const struct rk_gmac_ops rk3228_ops = {
.rmii_mode_mask = BIT_U16(10),
.speed_grf_reg = RK3228_GRF_MAC_CON1,
+ .gmii_clk_sel_mask = GENMASK_U16(9, 8),
};
#define RK3288_GRF_SOC_CON1 0x0248
@@ -472,7 +470,6 @@ static const struct rk_gmac_ops rk3228_ops = {
#define RK3288_GMAC_SPEED_100M GRF_BIT(10)
#define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
#define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
-#define RK3288_GMAC_CLK(val) GRF_FIELD_CONST(13, 12, val)
/*RK3288_GRF_SOC_CON3*/
#define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
@@ -496,9 +493,6 @@ static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3288_reg_speed_data = {
- .rgmii_10 = RK3288_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3288_GMAC_CLK(GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3288_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3288_GMAC_RMII_CLK_2_5M | RK3288_GMAC_SPEED_10M,
.rmii_100 = RK3288_GMAC_RMII_CLK_25M | RK3288_GMAC_SPEED_100M,
};
@@ -520,6 +514,7 @@ static const struct rk_gmac_ops rk3288_ops = {
.rmii_mode_mask = BIT_U16(14),
.speed_grf_reg = RK3288_GRF_SOC_CON1,
+ .gmii_clk_sel_mask = GENMASK_U16(13, 12),
};
#define RK3308_GRF_MAC_CON0 0x04a0
@@ -572,7 +567,6 @@ static const struct rk_gmac_ops rk3308_ops = {
#define RK3328_GMAC_SPEED_100M GRF_BIT(2)
#define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
#define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
-#define RK3328_GMAC_CLK(val) GRF_FIELD_CONST(12, 11, val)
#define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
#define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
@@ -585,6 +579,7 @@ static int rk3328_init(struct rk_priv_data *bsp_priv)
case 0: /* gmac2io */
bsp_priv->phy_intf_sel_grf_reg = RK3328_GRF_MAC_CON1;
bsp_priv->speed_grf_reg = RK3328_GRF_MAC_CON1;
+ bsp_priv->gmii_clk_sel_mask = GENMASK_U16(12, 11);
return 0;
case 1: /* gmac2phy */
@@ -614,9 +609,6 @@ static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3328_reg_speed_data = {
- .rgmii_10 = RK3328_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3328_GMAC_CLK(GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3328_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_SPEED_10M,
.rmii_100 = RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_SPEED_100M,
};
@@ -665,7 +657,6 @@ static const struct rk_gmac_ops rk3328_ops = {
#define RK3366_GMAC_SPEED_100M GRF_BIT(7)
#define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
-#define RK3366_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
/* RK3366_GRF_SOC_CON7 */
#define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
@@ -689,9 +680,6 @@ static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3366_reg_speed_data = {
- .rgmii_10 = RK3366_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3366_GMAC_CLK(GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3366_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3366_GMAC_RMII_CLK_2_5M | RK3366_GMAC_SPEED_10M,
.rmii_100 = RK3366_GMAC_RMII_CLK_25M | RK3366_GMAC_SPEED_100M,
};
@@ -713,6 +701,7 @@ static const struct rk_gmac_ops rk3366_ops = {
.rmii_mode_mask = BIT_U16(6),
.speed_grf_reg = RK3366_GRF_SOC_CON6,
+ .gmii_clk_sel_mask = GENMASK_U16(5, 4),
};
#define RK3368_GRF_SOC_CON15 0x043c
@@ -725,7 +714,6 @@ static const struct rk_gmac_ops rk3366_ops = {
#define RK3368_GMAC_SPEED_100M GRF_BIT(7)
#define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
-#define RK3368_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
/* RK3368_GRF_SOC_CON16 */
#define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
@@ -749,9 +737,6 @@ static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3368_reg_speed_data = {
- .rgmii_10 = RK3368_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3368_GMAC_CLK(GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3368_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3368_GMAC_RMII_CLK_2_5M | RK3368_GMAC_SPEED_10M,
.rmii_100 = RK3368_GMAC_RMII_CLK_25M | RK3368_GMAC_SPEED_100M,
};
@@ -773,6 +758,7 @@ static const struct rk_gmac_ops rk3368_ops = {
.rmii_mode_mask = BIT_U16(6),
.speed_grf_reg = RK3368_GRF_SOC_CON15,
+ .gmii_clk_sel_mask = GENMASK_U16(5, 4),
};
#define RK3399_GRF_SOC_CON5 0xc214
@@ -785,7 +771,6 @@ static const struct rk_gmac_ops rk3368_ops = {
#define RK3399_GMAC_SPEED_100M GRF_BIT(7)
#define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
-#define RK3399_GMAC_CLK(val) GRF_FIELD_CONST(5, 4, val)
/* RK3399_GRF_SOC_CON6 */
#define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
@@ -809,9 +794,6 @@ static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3399_reg_speed_data = {
- .rgmii_10 = RK3399_GMAC_CLK(GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3399_GMAC_CLK(GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3399_GMAC_CLK(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3399_GMAC_RMII_CLK_2_5M | RK3399_GMAC_SPEED_10M,
.rmii_100 = RK3399_GMAC_RMII_CLK_25M | RK3399_GMAC_SPEED_100M,
};
@@ -833,6 +815,7 @@ static const struct rk_gmac_ops rk3399_ops = {
.rmii_mode_mask = BIT_U16(6),
.speed_grf_reg = RK3399_GRF_SOC_CON5,
+ .gmii_clk_sel_mask = GENMASK_U16(5, 4),
};
#define RK3506_GRF_SOC_CON8 0x0020
@@ -938,8 +921,6 @@ static const struct rk_gmac_ops rk3506_ops = {
#define RK3528_GMAC1_CLK_RMII_DIV2 GRF_BIT(10)
#define RK3528_GMAC1_CLK_RMII_DIV20 GRF_CLR_BIT(10)
-#define RK3528_GMAC1_CLK_RGMII(val) GRF_FIELD_CONST(11, 10, val)
-
#define RK3528_GMAC0_CLK_RMII_GATE GRF_BIT(2)
#define RK3528_GMAC0_CLK_RMII_NOGATE GRF_CLR_BIT(2)
#define RK3528_GMAC1_CLK_RMII_GATE GRF_BIT(9)
@@ -954,6 +935,7 @@ static int rk3528_init(struct rk_priv_data *bsp_priv)
case 1:
bsp_priv->speed_grf_reg = RK3528_VPU_GRF_GMAC_CON5;
+ bsp_priv->gmii_clk_sel_mask = GENMASK_U16(11, 10);
return 0;
default:
@@ -992,9 +974,6 @@ static const struct rk_reg_speed_data rk3528_gmac0_reg_speed_data = {
};
static const struct rk_reg_speed_data rk3528_gmac1_reg_speed_data = {
- .rgmii_10 = RK3528_GMAC1_CLK_RGMII(GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3528_GMAC1_CLK_RGMII(GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3528_GMAC1_CLK_RGMII(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3528_GMAC1_CLK_RMII_DIV20,
.rmii_100 = RK3528_GMAC1_CLK_RMII_DIV2,
};
@@ -1152,8 +1131,6 @@ static const struct rk_gmac_ops rk3568_ops = {
#define RK3576_GMAC_CLK_RMII_DIV2 GRF_BIT(5)
#define RK3576_GMAC_CLK_RMII_DIV20 GRF_CLR_BIT(5)
-#define RK3576_GMAC_CLK_RGMII(val) GRF_FIELD_CONST(6, 5, val)
-
#define RK3576_GMAC_CLK_RMII_GATE GRF_BIT(4)
#define RK3576_GMAC_CLK_RMII_NOGATE GRF_CLR_BIT(4)
@@ -1203,9 +1180,6 @@ static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3578_reg_speed_data = {
- .rgmii_10 = RK3576_GMAC_CLK_RGMII(GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3576_GMAC_CLK_RGMII(GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3576_GMAC_CLK_RGMII(GMAC_CLK_DIV1_125M),
.rmii_10 = RK3576_GMAC_CLK_RMII_DIV20,
.rmii_100 = RK3576_GMAC_CLK_RMII_DIV2,
};
@@ -1242,6 +1216,8 @@ static const struct rk_gmac_ops rk3576_ops = {
.rmii_mode_mask = BIT_U16(3),
+ .gmii_clk_sel_mask = GENMASK_U16(6, 5),
+
.php_grf_required = true,
.regs_valid = true,
.regs = {
@@ -1277,9 +1253,6 @@ static const struct rk_gmac_ops rk3576_ops = {
#define RK3588_GMA_CLK_RMII_DIV2(id) GRF_BIT(5 * (id) + 2)
#define RK3588_GMA_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + 2)
-#define RK3588_GMAC_CLK_RGMII(id, val) \
- (GRF_FIELD_CONST(3, 2, val) << ((id) * 5))
-
#define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1)
#define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + 1)
@@ -1288,10 +1261,12 @@ static int rk3588_init(struct rk_priv_data *bsp_priv)
switch (bsp_priv->id) {
case 0:
bsp_priv->phy_intf_sel_mask = GENMASK_U16(5, 3);
+ bsp_priv->gmii_clk_sel_mask = GENMASK_U16(3, 2);
return 0;
case 1:
bsp_priv->phy_intf_sel_mask = GENMASK_U16(11, 9);
+ bsp_priv->gmii_clk_sel_mask = GENMASK_U16(8, 7);
return 0;
default:
@@ -1326,17 +1301,11 @@ static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3588_gmac0_speed_data = {
- .rgmii_10 = RK3588_GMAC_CLK_RGMII(0, GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3588_GMAC_CLK_RGMII(0, GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3588_GMAC_CLK_RGMII(0, GMAC_CLK_DIV1_125M),
.rmii_10 = RK3588_GMA_CLK_RMII_DIV20(0),
.rmii_100 = RK3588_GMA_CLK_RMII_DIV2(0),
};
static const struct rk_reg_speed_data rk3588_gmac1_speed_data = {
- .rgmii_10 = RK3588_GMAC_CLK_RGMII(1, GMAC_CLK_DIV50_2_5M),
- .rgmii_100 = RK3588_GMAC_CLK_RGMII(1, GMAC_CLK_DIV5_25M),
- .rgmii_1000 = RK3588_GMAC_CLK_RGMII(1, GMAC_CLK_DIV1_125M),
.rmii_10 = RK3588_GMA_CLK_RMII_DIV20(1),
.rmii_100 = RK3588_GMA_CLK_RMII_DIV2(1),
};
@@ -1702,6 +1671,7 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
/* Set the default speed related parameters */
bsp_priv->speed_grf_reg = ops->speed_grf_reg;
+ bsp_priv->gmii_clk_sel_mask = ops->gmii_clk_sel_mask;
if (ops->init) {
ret = ops->init(bsp_priv);
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 08/15] net: stmmac: rk: use rk_encode_wm16() for RMII speed
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (6 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 07/15] net: stmmac: rk: use rk_encode_wm16() for RGMII clocks Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 09/15] net: stmmac: rk: use rk_encode_wm16() for RMII clock Russell King (Oracle)
` (8 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 71 +++++++++----------
1 file changed, 33 insertions(+), 38 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index d11a58d7f24b..5f586782d595 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -49,6 +49,7 @@ struct rk_gmac_ops {
u16 speed_grf_reg;
u16 gmii_clk_sel_mask;
+ u16 mac_speed_mask;
bool speed_reg_php_grf;
bool php_grf_required;
@@ -103,6 +104,7 @@ struct rk_priv_data {
u16 speed_grf_reg;
u16 gmii_clk_sel_mask;
+ u16 mac_speed_mask;
};
#define GMAC_CLK_DIV1_125M 0
@@ -156,10 +158,12 @@ static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
val = rk_encode_wm16(ret, bsp_priv->gmii_clk_sel_mask);
} else if (interface == PHY_INTERFACE_MODE_RMII) {
+ val = rk_encode_wm16(speed == SPEED_100,
+ bsp_priv->mac_speed_mask);
if (speed == SPEED_10) {
- val = rsd->rmii_10;
+ val |= rsd->rmii_10;
} else if (speed == SPEED_100) {
- val = rsd->rmii_100;
+ val |= rsd->rmii_100;
} else {
/* Phylink will not allow inappropriate speeds for
* interface modes, so this should never happen.
@@ -341,8 +345,6 @@ static const struct rk_gmac_ops px30_ops = {
/* RK3128_GRF_MAC_CON1 */
#define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
#define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
-#define RK3128_GMAC_SPEED_10M GRF_CLR_BIT(10)
-#define RK3128_GMAC_SPEED_100M GRF_BIT(10)
#define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
#define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
@@ -360,8 +362,8 @@ static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3128_reg_speed_data = {
- .rmii_10 = RK3128_GMAC_RMII_CLK_2_5M | RK3128_GMAC_SPEED_10M,
- .rmii_100 = RK3128_GMAC_RMII_CLK_25M | RK3128_GMAC_SPEED_100M,
+ .rmii_10 = RK3128_GMAC_RMII_CLK_2_5M,
+ .rmii_100 = RK3128_GMAC_RMII_CLK_25M,
};
static int rk3128_set_speed(struct rk_priv_data *bsp_priv,
@@ -382,6 +384,7 @@ static const struct rk_gmac_ops rk3128_ops = {
.speed_grf_reg = RK3128_GRF_MAC_CON1,
.gmii_clk_sel_mask = GENMASK_U16(13, 12),
+ .mac_speed_mask = BIT_U16(10),
};
#define RK3228_GRF_MAC_CON0 0x0900
@@ -396,8 +399,6 @@ static const struct rk_gmac_ops rk3128_ops = {
/* RK3228_GRF_MAC_CON1 */
#define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
-#define RK3228_GMAC_SPEED_10M GRF_CLR_BIT(2)
-#define RK3228_GMAC_SPEED_100M GRF_BIT(2)
#define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
#define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
#define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
@@ -426,8 +427,8 @@ static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3228_reg_speed_data = {
- .rmii_10 = RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_SPEED_10M,
- .rmii_100 = RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_SPEED_100M,
+ .rmii_10 = RK3228_GMAC_RMII_CLK_2_5M,
+ .rmii_100 = RK3228_GMAC_RMII_CLK_25M,
};
static int rk3228_set_speed(struct rk_priv_data *bsp_priv,
@@ -458,6 +459,7 @@ static const struct rk_gmac_ops rk3228_ops = {
.speed_grf_reg = RK3228_GRF_MAC_CON1,
.gmii_clk_sel_mask = GENMASK_U16(9, 8),
+ .mac_speed_mask = BIT_U16(2),
};
#define RK3288_GRF_SOC_CON1 0x0248
@@ -466,8 +468,6 @@ static const struct rk_gmac_ops rk3228_ops = {
/*RK3288_GRF_SOC_CON1*/
#define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
#define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
-#define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10)
-#define RK3288_GMAC_SPEED_100M GRF_BIT(10)
#define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
#define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
@@ -493,8 +493,8 @@ static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3288_reg_speed_data = {
- .rmii_10 = RK3288_GMAC_RMII_CLK_2_5M | RK3288_GMAC_SPEED_10M,
- .rmii_100 = RK3288_GMAC_RMII_CLK_25M | RK3288_GMAC_SPEED_100M,
+ .rmii_10 = RK3288_GMAC_RMII_CLK_2_5M,
+ .rmii_100 = RK3288_GMAC_RMII_CLK_25M,
};
static int rk3288_set_speed(struct rk_priv_data *bsp_priv,
@@ -515,6 +515,7 @@ static const struct rk_gmac_ops rk3288_ops = {
.speed_grf_reg = RK3288_GRF_SOC_CON1,
.gmii_clk_sel_mask = GENMASK_U16(13, 12),
+ .mac_speed_mask = BIT_U16(10),
};
#define RK3308_GRF_MAC_CON0 0x04a0
@@ -522,16 +523,12 @@ static const struct rk_gmac_ops rk3288_ops = {
/* RK3308_GRF_MAC_CON0 */
#define RK3308_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3308_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
-#define RK3308_GMAC_SPEED_10M GRF_CLR_BIT(0)
-#define RK3308_GMAC_SPEED_100M GRF_BIT(0)
static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
static const struct rk_reg_speed_data rk3308_reg_speed_data = {
- .rmii_10 = RK3308_GMAC_SPEED_10M,
- .rmii_100 = RK3308_GMAC_SPEED_100M,
};
static int rk3308_set_speed(struct rk_priv_data *bsp_priv,
@@ -549,6 +546,7 @@ static const struct rk_gmac_ops rk3308_ops = {
.phy_intf_sel_mask = GENMASK_U16(4, 2),
.speed_grf_reg = RK3308_GRF_MAC_CON0,
+ .mac_speed_mask = BIT_U16(0),
};
#define RK3328_GRF_MAC_CON0 0x0900
@@ -563,8 +561,6 @@ static const struct rk_gmac_ops rk3308_ops = {
/* RK3328_GRF_MAC_CON1 */
#define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
-#define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
-#define RK3328_GMAC_SPEED_100M GRF_BIT(2)
#define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
#define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
#define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
@@ -609,8 +605,8 @@ static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3328_reg_speed_data = {
- .rmii_10 = RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_SPEED_10M,
- .rmii_100 = RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_SPEED_100M,
+ .rmii_10 = RK3328_GMAC_RMII_CLK_2_5M,
+ .rmii_100 = RK3328_GMAC_RMII_CLK_25M,
};
static int rk3328_set_speed(struct rk_priv_data *bsp_priv,
@@ -639,6 +635,8 @@ static const struct rk_gmac_ops rk3328_ops = {
.phy_intf_sel_mask = GENMASK_U16(6, 4),
.rmii_mode_mask = BIT_U16(9),
+ .mac_speed_mask = BIT_U16(2),
+
.regs_valid = true,
.regs = {
0xff540000, /* gmac2io */
@@ -653,8 +651,6 @@ static const struct rk_gmac_ops rk3328_ops = {
/* RK3366_GRF_SOC_CON6 */
#define RK3366_GMAC_FLOW_CTRL GRF_BIT(8)
#define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
-#define RK3366_GMAC_SPEED_10M GRF_CLR_BIT(7)
-#define RK3366_GMAC_SPEED_100M GRF_BIT(7)
#define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
@@ -680,8 +676,8 @@ static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3366_reg_speed_data = {
- .rmii_10 = RK3366_GMAC_RMII_CLK_2_5M | RK3366_GMAC_SPEED_10M,
- .rmii_100 = RK3366_GMAC_RMII_CLK_25M | RK3366_GMAC_SPEED_100M,
+ .rmii_10 = RK3366_GMAC_RMII_CLK_2_5M,
+ .rmii_100 = RK3366_GMAC_RMII_CLK_25M,
};
static int rk3366_set_speed(struct rk_priv_data *bsp_priv,
@@ -702,6 +698,7 @@ static const struct rk_gmac_ops rk3366_ops = {
.speed_grf_reg = RK3366_GRF_SOC_CON6,
.gmii_clk_sel_mask = GENMASK_U16(5, 4),
+ .mac_speed_mask = BIT_U16(7),
};
#define RK3368_GRF_SOC_CON15 0x043c
@@ -710,8 +707,6 @@ static const struct rk_gmac_ops rk3366_ops = {
/* RK3368_GRF_SOC_CON15 */
#define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
#define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
-#define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7)
-#define RK3368_GMAC_SPEED_100M GRF_BIT(7)
#define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
@@ -737,8 +732,8 @@ static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3368_reg_speed_data = {
- .rmii_10 = RK3368_GMAC_RMII_CLK_2_5M | RK3368_GMAC_SPEED_10M,
- .rmii_100 = RK3368_GMAC_RMII_CLK_25M | RK3368_GMAC_SPEED_100M,
+ .rmii_10 = RK3368_GMAC_RMII_CLK_2_5M,
+ .rmii_100 = RK3368_GMAC_RMII_CLK_25M,
};
static int rk3368_set_speed(struct rk_priv_data *bsp_priv,
@@ -759,6 +754,7 @@ static const struct rk_gmac_ops rk3368_ops = {
.speed_grf_reg = RK3368_GRF_SOC_CON15,
.gmii_clk_sel_mask = GENMASK_U16(5, 4),
+ .mac_speed_mask = BIT_U16(7),
};
#define RK3399_GRF_SOC_CON5 0xc214
@@ -767,8 +763,6 @@ static const struct rk_gmac_ops rk3368_ops = {
/* RK3399_GRF_SOC_CON5 */
#define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
#define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
-#define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7)
-#define RK3399_GMAC_SPEED_100M GRF_BIT(7)
#define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
#define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
@@ -794,8 +788,8 @@ static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rk3399_reg_speed_data = {
- .rmii_10 = RK3399_GMAC_RMII_CLK_2_5M | RK3399_GMAC_SPEED_10M,
- .rmii_100 = RK3399_GMAC_RMII_CLK_25M | RK3399_GMAC_SPEED_100M,
+ .rmii_10 = RK3399_GMAC_RMII_CLK_2_5M,
+ .rmii_100 = RK3399_GMAC_RMII_CLK_25M,
};
static int rk3399_set_speed(struct rk_priv_data *bsp_priv,
@@ -816,6 +810,7 @@ static const struct rk_gmac_ops rk3399_ops = {
.speed_grf_reg = RK3399_GRF_SOC_CON5,
.gmii_clk_sel_mask = GENMASK_U16(5, 4),
+ .mac_speed_mask = BIT_U16(7),
};
#define RK3506_GRF_SOC_CON8 0x0020
@@ -1361,8 +1356,6 @@ static const struct rk_gmac_ops rk3588_ops = {
/* RV1108_GRF_GMAC_CON0 */
#define RV1108_GMAC_FLOW_CTRL GRF_BIT(3)
#define RV1108_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
-#define RV1108_GMAC_SPEED_10M GRF_CLR_BIT(2)
-#define RV1108_GMAC_SPEED_100M GRF_BIT(2)
#define RV1108_GMAC_RMII_CLK_25M GRF_BIT(7)
#define RV1108_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
@@ -1371,8 +1364,8 @@ static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
}
static const struct rk_reg_speed_data rv1108_reg_speed_data = {
- .rmii_10 = RV1108_GMAC_RMII_CLK_2_5M | RV1108_GMAC_SPEED_10M,
- .rmii_100 = RV1108_GMAC_RMII_CLK_25M | RV1108_GMAC_SPEED_100M,
+ .rmii_10 = RV1108_GMAC_RMII_CLK_2_5M,
+ .rmii_100 = RV1108_GMAC_RMII_CLK_25M,
};
static int rv1108_set_speed(struct rk_priv_data *bsp_priv,
@@ -1390,6 +1383,7 @@ static const struct rk_gmac_ops rv1108_ops = {
.phy_intf_sel_mask = GENMASK_U16(6, 4),
.speed_grf_reg = RV1108_GRF_GMAC_CON0,
+ .mac_speed_mask = BIT_U16(2),
};
#define RV1126_GRF_GMAC_CON0 0X0070
@@ -1672,6 +1666,7 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
/* Set the default speed related parameters */
bsp_priv->speed_grf_reg = ops->speed_grf_reg;
bsp_priv->gmii_clk_sel_mask = ops->gmii_clk_sel_mask;
+ bsp_priv->mac_speed_mask = ops->mac_speed_mask;
if (ops->init) {
ret = ops->init(bsp_priv);
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 09/15] net: stmmac: rk: use rk_encode_wm16() for RMII clock
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (7 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 08/15] net: stmmac: rk: use rk_encode_wm16() for RMII speed Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 10/15] net: stmmac: rk: move speed register into bsp_priv Russell King (Oracle)
` (7 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 187 ++++--------------
1 file changed, 34 insertions(+), 153 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 5f586782d595..a77ce36e0da6 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -26,11 +26,6 @@
struct rk_priv_data;
-struct rk_reg_speed_data {
- unsigned int rmii_10;
- unsigned int rmii_100;
-};
-
struct rk_gmac_ops {
int (*init)(struct rk_priv_data *bsp_priv);
void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
@@ -49,6 +44,7 @@ struct rk_gmac_ops {
u16 speed_grf_reg;
u16 gmii_clk_sel_mask;
+ u16 rmii_clk_sel_mask;
u16 mac_speed_mask;
bool speed_reg_php_grf;
@@ -104,6 +100,7 @@ struct rk_priv_data {
u16 speed_grf_reg;
u16 gmii_clk_sel_mask;
+ u16 rmii_clk_sel_mask;
u16 mac_speed_mask;
};
@@ -144,7 +141,6 @@ static u32 rk_encode_wm16(u16 val, u16 mask)
}
static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
- const struct rk_reg_speed_data *rsd,
phy_interface_t interface, int speed)
{
struct regmap *regmap;
@@ -159,17 +155,9 @@ static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
val = rk_encode_wm16(ret, bsp_priv->gmii_clk_sel_mask);
} else if (interface == PHY_INTERFACE_MODE_RMII) {
val = rk_encode_wm16(speed == SPEED_100,
- bsp_priv->mac_speed_mask);
- if (speed == SPEED_10) {
- val |= rsd->rmii_10;
- } else if (speed == SPEED_100) {
- val |= rsd->rmii_100;
- } else {
- /* Phylink will not allow inappropriate speeds for
- * interface modes, so this should never happen.
- */
- return -EINVAL;
- }
+ bsp_priv->mac_speed_mask) |
+ rk_encode_wm16(speed == SPEED_100,
+ bsp_priv->rmii_clk_sel_mask);
} else {
/* This should never happen, as .get_interfaces() limits
* the interface modes that are supported to RGMII and/or
@@ -345,8 +333,6 @@ static const struct rk_gmac_ops px30_ops = {
/* RK3128_GRF_MAC_CON1 */
#define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
#define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
-#define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
-#define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
int tx_delay, int rx_delay)
@@ -361,16 +347,10 @@ static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static const struct rk_reg_speed_data rk3128_reg_speed_data = {
- .rmii_10 = RK3128_GMAC_RMII_CLK_2_5M,
- .rmii_100 = RK3128_GMAC_RMII_CLK_25M,
-};
-
static int rk3128_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rk3128_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static const struct rk_gmac_ops rk3128_ops = {
@@ -384,6 +364,7 @@ static const struct rk_gmac_ops rk3128_ops = {
.speed_grf_reg = RK3128_GRF_MAC_CON1,
.gmii_clk_sel_mask = GENMASK_U16(13, 12),
+ .rmii_clk_sel_mask = BIT_U16(11),
.mac_speed_mask = BIT_U16(10),
};
@@ -399,8 +380,6 @@ static const struct rk_gmac_ops rk3128_ops = {
/* RK3228_GRF_MAC_CON1 */
#define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
-#define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
-#define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
#define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
#define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
#define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
@@ -426,16 +405,10 @@ static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
}
-static const struct rk_reg_speed_data rk3228_reg_speed_data = {
- .rmii_10 = RK3228_GMAC_RMII_CLK_2_5M,
- .rmii_100 = RK3228_GMAC_RMII_CLK_25M,
-};
-
static int rk3228_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rk3228_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
@@ -459,6 +432,7 @@ static const struct rk_gmac_ops rk3228_ops = {
.speed_grf_reg = RK3228_GRF_MAC_CON1,
.gmii_clk_sel_mask = GENMASK_U16(9, 8),
+ .rmii_clk_sel_mask = BIT_U16(7),
.mac_speed_mask = BIT_U16(2),
};
@@ -468,8 +442,6 @@ static const struct rk_gmac_ops rk3228_ops = {
/*RK3288_GRF_SOC_CON1*/
#define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
#define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
-#define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
-#define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
/*RK3288_GRF_SOC_CON3*/
#define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
@@ -492,16 +464,10 @@ static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static const struct rk_reg_speed_data rk3288_reg_speed_data = {
- .rmii_10 = RK3288_GMAC_RMII_CLK_2_5M,
- .rmii_100 = RK3288_GMAC_RMII_CLK_25M,
-};
-
static int rk3288_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rk3288_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static const struct rk_gmac_ops rk3288_ops = {
@@ -515,6 +481,7 @@ static const struct rk_gmac_ops rk3288_ops = {
.speed_grf_reg = RK3288_GRF_SOC_CON1,
.gmii_clk_sel_mask = GENMASK_U16(13, 12),
+ .rmii_clk_sel_mask = BIT_U16(11),
.mac_speed_mask = BIT_U16(10),
};
@@ -561,8 +528,6 @@ static const struct rk_gmac_ops rk3308_ops = {
/* RK3328_GRF_MAC_CON1 */
#define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
-#define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
-#define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
#define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
#define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
@@ -604,16 +569,10 @@ static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static const struct rk_reg_speed_data rk3328_reg_speed_data = {
- .rmii_10 = RK3328_GMAC_RMII_CLK_2_5M,
- .rmii_100 = RK3328_GMAC_RMII_CLK_25M,
-};
-
static int rk3328_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rk3328_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
@@ -635,6 +594,7 @@ static const struct rk_gmac_ops rk3328_ops = {
.phy_intf_sel_mask = GENMASK_U16(6, 4),
.rmii_mode_mask = BIT_U16(9),
+ .rmii_clk_sel_mask = BIT_U16(7),
.mac_speed_mask = BIT_U16(2),
.regs_valid = true,
@@ -651,8 +611,6 @@ static const struct rk_gmac_ops rk3328_ops = {
/* RK3366_GRF_SOC_CON6 */
#define RK3366_GMAC_FLOW_CTRL GRF_BIT(8)
#define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
-#define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
-#define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
/* RK3366_GRF_SOC_CON7 */
#define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
@@ -675,16 +633,10 @@ static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static const struct rk_reg_speed_data rk3366_reg_speed_data = {
- .rmii_10 = RK3366_GMAC_RMII_CLK_2_5M,
- .rmii_100 = RK3366_GMAC_RMII_CLK_25M,
-};
-
static int rk3366_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rk3366_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static const struct rk_gmac_ops rk3366_ops = {
@@ -698,6 +650,7 @@ static const struct rk_gmac_ops rk3366_ops = {
.speed_grf_reg = RK3366_GRF_SOC_CON6,
.gmii_clk_sel_mask = GENMASK_U16(5, 4),
+ .rmii_clk_sel_mask = BIT_U16(3),
.mac_speed_mask = BIT_U16(7),
};
@@ -707,8 +660,6 @@ static const struct rk_gmac_ops rk3366_ops = {
/* RK3368_GRF_SOC_CON15 */
#define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
#define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
-#define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
-#define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
/* RK3368_GRF_SOC_CON16 */
#define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
@@ -731,16 +682,10 @@ static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static const struct rk_reg_speed_data rk3368_reg_speed_data = {
- .rmii_10 = RK3368_GMAC_RMII_CLK_2_5M,
- .rmii_100 = RK3368_GMAC_RMII_CLK_25M,
-};
-
static int rk3368_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rk3368_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static const struct rk_gmac_ops rk3368_ops = {
@@ -754,6 +699,7 @@ static const struct rk_gmac_ops rk3368_ops = {
.speed_grf_reg = RK3368_GRF_SOC_CON15,
.gmii_clk_sel_mask = GENMASK_U16(5, 4),
+ .rmii_clk_sel_mask = BIT_U16(3),
.mac_speed_mask = BIT_U16(7),
};
@@ -763,8 +709,6 @@ static const struct rk_gmac_ops rk3368_ops = {
/* RK3399_GRF_SOC_CON5 */
#define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
#define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
-#define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
-#define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
/* RK3399_GRF_SOC_CON6 */
#define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
@@ -787,16 +731,10 @@ static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static const struct rk_reg_speed_data rk3399_reg_speed_data = {
- .rmii_10 = RK3399_GMAC_RMII_CLK_2_5M,
- .rmii_100 = RK3399_GMAC_RMII_CLK_25M,
-};
-
static int rk3399_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rk3399_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static const struct rk_gmac_ops rk3399_ops = {
@@ -810,6 +748,7 @@ static const struct rk_gmac_ops rk3399_ops = {
.speed_grf_reg = RK3399_GRF_SOC_CON5,
.gmii_clk_sel_mask = GENMASK_U16(5, 4),
+ .rmii_clk_sel_mask = BIT_U16(3),
.mac_speed_mask = BIT_U16(7),
};
@@ -818,9 +757,6 @@ static const struct rk_gmac_ops rk3399_ops = {
#define RK3506_GMAC_RMII_MODE GRF_BIT(1)
-#define RK3506_GMAC_CLK_RMII_DIV2 GRF_BIT(3)
-#define RK3506_GMAC_CLK_RMII_DIV20 GRF_CLR_BIT(3)
-
#define RK3506_GMAC_CLK_SELECT_CRU GRF_CLR_BIT(5)
#define RK3506_GMAC_CLK_SELECT_IO GRF_BIT(5)
@@ -851,16 +787,10 @@ static void rk3506_set_to_rmii(struct rk_priv_data *bsp_priv)
regmap_write(bsp_priv->grf, offset, RK3506_GMAC_RMII_MODE);
}
-static const struct rk_reg_speed_data rk3506_reg_speed_data = {
- .rmii_10 = RK3506_GMAC_CLK_RMII_DIV20,
- .rmii_100 = RK3506_GMAC_CLK_RMII_DIV2,
-};
-
static int rk3506_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rk3506_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static void rk3506_set_clock_selection(struct rk_priv_data *bsp_priv,
@@ -882,6 +812,9 @@ static const struct rk_gmac_ops rk3506_ops = {
.set_to_rmii = rk3506_set_to_rmii,
.set_speed = rk3506_set_speed,
.set_clock_selection = rk3506_set_clock_selection,
+
+ .rmii_clk_sel_mask = BIT_U16(3),
+
.regs_valid = true,
.regs = {
0xff4c8000, /* gmac0 */
@@ -911,11 +844,6 @@ static const struct rk_gmac_ops rk3506_ops = {
#define RK3528_GMAC1_CLK_SELECT_CRU GRF_CLR_BIT(12)
#define RK3528_GMAC1_CLK_SELECT_IO GRF_BIT(12)
-#define RK3528_GMAC0_CLK_RMII_DIV2 GRF_BIT(3)
-#define RK3528_GMAC0_CLK_RMII_DIV20 GRF_CLR_BIT(3)
-#define RK3528_GMAC1_CLK_RMII_DIV2 GRF_BIT(10)
-#define RK3528_GMAC1_CLK_RMII_DIV20 GRF_CLR_BIT(10)
-
#define RK3528_GMAC0_CLK_RMII_GATE GRF_BIT(2)
#define RK3528_GMAC0_CLK_RMII_NOGATE GRF_CLR_BIT(2)
#define RK3528_GMAC1_CLK_RMII_GATE GRF_BIT(9)
@@ -926,11 +854,13 @@ static int rk3528_init(struct rk_priv_data *bsp_priv)
switch (bsp_priv->id) {
case 0:
bsp_priv->speed_grf_reg = RK3528_VO_GRF_GMAC_CON;
+ bsp_priv->rmii_clk_sel_mask = BIT_U16(3);
return 0;
case 1:
bsp_priv->speed_grf_reg = RK3528_VPU_GRF_GMAC_CON5;
bsp_priv->gmii_clk_sel_mask = GENMASK_U16(11, 10);
+ bsp_priv->rmii_clk_sel_mask = BIT_U16(10);
return 0;
default:
@@ -963,27 +893,10 @@ static void rk3528_set_to_rmii(struct rk_priv_data *bsp_priv)
RK3528_GMAC0_CLK_RMII_DIV2);
}
-static const struct rk_reg_speed_data rk3528_gmac0_reg_speed_data = {
- .rmii_10 = RK3528_GMAC0_CLK_RMII_DIV20,
- .rmii_100 = RK3528_GMAC0_CLK_RMII_DIV2,
-};
-
-static const struct rk_reg_speed_data rk3528_gmac1_reg_speed_data = {
- .rmii_10 = RK3528_GMAC1_CLK_RMII_DIV20,
- .rmii_100 = RK3528_GMAC1_CLK_RMII_DIV2,
-};
-
static int rk3528_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- const struct rk_reg_speed_data *rsd;
-
- if (bsp_priv->id == 1)
- rsd = &rk3528_gmac1_reg_speed_data;
- else
- rsd = &rk3528_gmac0_reg_speed_data;
-
- return rk_set_reg_speed(bsp_priv, rsd, interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static void rk3528_set_clock_selection(struct rk_priv_data *bsp_priv,
@@ -1123,9 +1036,6 @@ static const struct rk_gmac_ops rk3568_ops = {
#define RK3576_GMAC_CLK_SELECT_IO GRF_BIT(7)
#define RK3576_GMAC_CLK_SELECT_CRU GRF_CLR_BIT(7)
-#define RK3576_GMAC_CLK_RMII_DIV2 GRF_BIT(5)
-#define RK3576_GMAC_CLK_RMII_DIV20 GRF_CLR_BIT(5)
-
#define RK3576_GMAC_CLK_RMII_GATE GRF_BIT(4)
#define RK3576_GMAC_CLK_RMII_NOGATE GRF_CLR_BIT(4)
@@ -1174,16 +1084,10 @@ static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static const struct rk_reg_speed_data rk3578_reg_speed_data = {
- .rmii_10 = RK3576_GMAC_CLK_RMII_DIV20,
- .rmii_100 = RK3576_GMAC_CLK_RMII_DIV2,
-};
-
static int rk3576_set_gmac_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rk3578_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
@@ -1212,6 +1116,7 @@ static const struct rk_gmac_ops rk3576_ops = {
.rmii_mode_mask = BIT_U16(3),
.gmii_clk_sel_mask = GENMASK_U16(6, 5),
+ .rmii_clk_sel_mask = BIT_U16(5),
.php_grf_required = true,
.regs_valid = true,
@@ -1245,9 +1150,6 @@ static const struct rk_gmac_ops rk3576_ops = {
#define RK3588_GMAC_CLK_SELECT_CRU(id) GRF_BIT(5 * (id) + 4)
#define RK3588_GMAC_CLK_SELECT_IO(id) GRF_CLR_BIT(5 * (id) + 4)
-#define RK3588_GMA_CLK_RMII_DIV2(id) GRF_BIT(5 * (id) + 2)
-#define RK3588_GMA_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + 2)
-
#define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1)
#define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + 1)
@@ -1257,11 +1159,13 @@ static int rk3588_init(struct rk_priv_data *bsp_priv)
case 0:
bsp_priv->phy_intf_sel_mask = GENMASK_U16(5, 3);
bsp_priv->gmii_clk_sel_mask = GENMASK_U16(3, 2);
+ bsp_priv->rmii_clk_sel_mask = BIT_U16(2);
return 0;
case 1:
bsp_priv->phy_intf_sel_mask = GENMASK_U16(11, 9);
bsp_priv->gmii_clk_sel_mask = GENMASK_U16(8, 7);
+ bsp_priv->rmii_clk_sel_mask = BIT_U16(7);
return 0;
default:
@@ -1295,27 +1199,10 @@ static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
RK3588_GMAC_CLK_RMII_MODE(bsp_priv->id));
}
-static const struct rk_reg_speed_data rk3588_gmac0_speed_data = {
- .rmii_10 = RK3588_GMA_CLK_RMII_DIV20(0),
- .rmii_100 = RK3588_GMA_CLK_RMII_DIV2(0),
-};
-
-static const struct rk_reg_speed_data rk3588_gmac1_speed_data = {
- .rmii_10 = RK3588_GMA_CLK_RMII_DIV20(1),
- .rmii_100 = RK3588_GMA_CLK_RMII_DIV2(1),
-};
-
static int rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- const struct rk_reg_speed_data *rsd;
-
- if (bsp_priv->id == 0)
- rsd = &rk3588_gmac0_speed_data;
- else
- rsd = &rk3588_gmac1_speed_data;
-
- return rk_set_reg_speed(bsp_priv, rsd, interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
@@ -1356,23 +1243,15 @@ static const struct rk_gmac_ops rk3588_ops = {
/* RV1108_GRF_GMAC_CON0 */
#define RV1108_GMAC_FLOW_CTRL GRF_BIT(3)
#define RV1108_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
-#define RV1108_GMAC_RMII_CLK_25M GRF_BIT(7)
-#define RV1108_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static const struct rk_reg_speed_data rv1108_reg_speed_data = {
- .rmii_10 = RV1108_GMAC_RMII_CLK_2_5M,
- .rmii_100 = RV1108_GMAC_RMII_CLK_25M,
-};
-
static int rv1108_set_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
- return rk_set_reg_speed(bsp_priv, &rv1108_reg_speed_data,
- interface, speed);
+ return rk_set_reg_speed(bsp_priv, interface, speed);
}
static const struct rk_gmac_ops rv1108_ops = {
@@ -1383,6 +1262,7 @@ static const struct rk_gmac_ops rv1108_ops = {
.phy_intf_sel_mask = GENMASK_U16(6, 4),
.speed_grf_reg = RV1108_GRF_GMAC_CON0,
+ .rmii_clk_sel_mask = BIT_U16(7),
.mac_speed_mask = BIT_U16(2),
};
@@ -1666,6 +1546,7 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
/* Set the default speed related parameters */
bsp_priv->speed_grf_reg = ops->speed_grf_reg;
bsp_priv->gmii_clk_sel_mask = ops->gmii_clk_sel_mask;
+ bsp_priv->rmii_clk_sel_mask = ops->rmii_clk_sel_mask;
bsp_priv->mac_speed_mask = ops->mac_speed_mask;
if (ops->init) {
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 10/15] net: stmmac: rk: move speed register into bsp_priv
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (8 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 09/15] net: stmmac: rk: use rk_encode_wm16() for RMII clock Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 11/15] net: stmmac: rk: convert px30 Russell King (Oracle)
` (6 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 169 ++++--------------
1 file changed, 34 insertions(+), 135 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index a77ce36e0da6..c26bd22658c6 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -140,43 +140,6 @@ static u32 rk_encode_wm16(u16 val, u16 mask)
return reg_val;
}
-static int rk_set_reg_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- struct regmap *regmap;
- unsigned int val;
- int ret;
-
- if (phy_interface_mode_is_rgmii(interface)) {
- ret = rk_gmac_rgmii_clk_div(speed);
- if (ret < 0)
- return ret;
-
- val = rk_encode_wm16(ret, bsp_priv->gmii_clk_sel_mask);
- } else if (interface == PHY_INTERFACE_MODE_RMII) {
- val = rk_encode_wm16(speed == SPEED_100,
- bsp_priv->mac_speed_mask) |
- rk_encode_wm16(speed == SPEED_100,
- bsp_priv->rmii_clk_sel_mask);
- } else {
- /* This should never happen, as .get_interfaces() limits
- * the interface modes that are supported to RGMII and/or
- * RMII.
- */
- return -EINVAL;
- }
-
- if (bsp_priv->ops->speed_reg_php_grf)
- regmap = bsp_priv->php_grf;
- else
- regmap = bsp_priv->grf;
-
- regmap_write(regmap, bsp_priv->speed_grf_reg, val);
-
- return 0;
-
-}
-
static int rk_set_clk_mac_speed(struct rk_priv_data *bsp_priv,
phy_interface_t interface, int speed)
{
@@ -347,16 +310,9 @@ static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static int rk3128_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static const struct rk_gmac_ops rk3128_ops = {
.set_to_rgmii = rk3128_set_to_rgmii,
.set_to_rmii = rk3128_set_to_rmii,
- .set_speed = rk3128_set_speed,
.phy_intf_sel_grf_reg = RK3128_GRF_MAC_CON1,
.phy_intf_sel_mask = GENMASK_U16(8, 6),
@@ -405,12 +361,6 @@ static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
}
-static int rk3228_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
{
regmap_write(priv->grf, RK3228_GRF_CON_MUX,
@@ -422,7 +372,6 @@ static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
static const struct rk_gmac_ops rk3228_ops = {
.set_to_rgmii = rk3228_set_to_rgmii,
.set_to_rmii = rk3228_set_to_rmii,
- .set_speed = rk3228_set_speed,
.integrated_phy_powerup = rk3228_integrated_phy_powerup,
.integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
@@ -464,16 +413,9 @@ static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static int rk3288_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static const struct rk_gmac_ops rk3288_ops = {
.set_to_rgmii = rk3288_set_to_rgmii,
.set_to_rmii = rk3288_set_to_rmii,
- .set_speed = rk3288_set_speed,
.phy_intf_sel_grf_reg = RK3288_GRF_SOC_CON1,
.phy_intf_sel_mask = GENMASK_U16(8, 6),
@@ -495,19 +437,8 @@ static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static const struct rk_reg_speed_data rk3308_reg_speed_data = {
-};
-
-static int rk3308_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, &rk3308_reg_speed_data,
- interface, speed);
-}
-
static const struct rk_gmac_ops rk3308_ops = {
.set_to_rmii = rk3308_set_to_rmii,
- .set_speed = rk3308_set_speed,
.phy_intf_sel_grf_reg = RK3308_GRF_MAC_CON0,
.phy_intf_sel_mask = GENMASK_U16(4, 2),
@@ -569,12 +500,6 @@ static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static int rk3328_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
{
regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
@@ -587,7 +512,6 @@ static const struct rk_gmac_ops rk3328_ops = {
.init = rk3328_init,
.set_to_rgmii = rk3328_set_to_rgmii,
.set_to_rmii = rk3328_set_to_rmii,
- .set_speed = rk3328_set_speed,
.integrated_phy_powerup = rk3328_integrated_phy_powerup,
.integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
@@ -633,16 +557,9 @@ static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static int rk3366_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static const struct rk_gmac_ops rk3366_ops = {
.set_to_rgmii = rk3366_set_to_rgmii,
.set_to_rmii = rk3366_set_to_rmii,
- .set_speed = rk3366_set_speed,
.phy_intf_sel_grf_reg = RK3366_GRF_SOC_CON6,
.phy_intf_sel_mask = GENMASK_U16(11, 9),
@@ -682,16 +599,9 @@ static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static int rk3368_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static const struct rk_gmac_ops rk3368_ops = {
.set_to_rgmii = rk3368_set_to_rgmii,
.set_to_rmii = rk3368_set_to_rmii,
- .set_speed = rk3368_set_speed,
.phy_intf_sel_grf_reg = RK3368_GRF_SOC_CON15,
.phy_intf_sel_mask = GENMASK_U16(11, 9),
@@ -731,16 +641,9 @@ static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static int rk3399_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static const struct rk_gmac_ops rk3399_ops = {
.set_to_rgmii = rk3399_set_to_rgmii,
.set_to_rmii = rk3399_set_to_rmii,
- .set_speed = rk3399_set_speed,
.phy_intf_sel_grf_reg = RK3399_GRF_SOC_CON5,
.phy_intf_sel_mask = GENMASK_U16(11, 9),
@@ -787,12 +690,6 @@ static void rk3506_set_to_rmii(struct rk_priv_data *bsp_priv)
regmap_write(bsp_priv->grf, offset, RK3506_GMAC_RMII_MODE);
}
-static int rk3506_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static void rk3506_set_clock_selection(struct rk_priv_data *bsp_priv,
bool input, bool enable)
{
@@ -810,7 +707,6 @@ static void rk3506_set_clock_selection(struct rk_priv_data *bsp_priv,
static const struct rk_gmac_ops rk3506_ops = {
.init = rk3506_init,
.set_to_rmii = rk3506_set_to_rmii,
- .set_speed = rk3506_set_speed,
.set_clock_selection = rk3506_set_clock_selection,
.rmii_clk_sel_mask = BIT_U16(3),
@@ -893,12 +789,6 @@ static void rk3528_set_to_rmii(struct rk_priv_data *bsp_priv)
RK3528_GMAC0_CLK_RMII_DIV2);
}
-static int rk3528_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static void rk3528_set_clock_selection(struct rk_priv_data *bsp_priv,
bool input, bool enable)
{
@@ -931,7 +821,6 @@ static const struct rk_gmac_ops rk3528_ops = {
.init = rk3528_init,
.set_to_rgmii = rk3528_set_to_rgmii,
.set_to_rmii = rk3528_set_to_rmii,
- .set_speed = rk3528_set_speed,
.set_clock_selection = rk3528_set_clock_selection,
.integrated_phy_powerup = rk3528_integrated_phy_powerup,
.integrated_phy_powerdown = rk3528_integrated_phy_powerdown,
@@ -1084,12 +973,6 @@ static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static int rk3576_set_gmac_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
bool enable)
{
@@ -1110,7 +993,6 @@ static const struct rk_gmac_ops rk3576_ops = {
.init = rk3576_init,
.set_to_rgmii = rk3576_set_to_rgmii,
.set_to_rmii = rk3576_set_to_rmii,
- .set_speed = rk3576_set_gmac_speed,
.set_clock_selection = rk3576_set_clock_selection,
.rmii_mode_mask = BIT_U16(3),
@@ -1199,12 +1081,6 @@ static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
RK3588_GMAC_CLK_RMII_MODE(bsp_priv->id));
}
-static int rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
bool enable)
{
@@ -1221,7 +1097,6 @@ static const struct rk_gmac_ops rk3588_ops = {
.init = rk3588_init,
.set_to_rgmii = rk3588_set_to_rgmii,
.set_to_rmii = rk3588_set_to_rmii,
- .set_speed = rk3588_set_gmac_speed,
.set_clock_selection = rk3588_set_clock_selection,
.phy_intf_sel_grf_reg = RK3588_GRF_GMAC_CON0,
@@ -1248,15 +1123,8 @@ static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static int rv1108_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- return rk_set_reg_speed(bsp_priv, interface, speed);
-}
-
static const struct rk_gmac_ops rv1108_ops = {
.set_to_rmii = rv1108_set_to_rmii,
- .set_speed = rv1108_set_speed,
.phy_intf_sel_grf_reg = RV1108_GRF_GMAC_CON0,
.phy_intf_sel_mask = GENMASK_U16(6, 4),
@@ -1681,11 +1549,42 @@ static int rk_set_clk_tx_rate(void *bsp_priv_, struct clk *clk_tx_i,
phy_interface_t interface, int speed)
{
struct rk_priv_data *bsp_priv = bsp_priv_;
+ struct regmap *regmap;
+ int ret = -EINVAL;
+ bool is_100m;
+ u32 val;
- if (bsp_priv->ops->set_speed)
- return bsp_priv->ops->set_speed(bsp_priv, interface, speed);
+ if (bsp_priv->ops->set_speed) {
+ ret = bsp_priv->ops->set_speed(bsp_priv, interface, speed);
+ if (ret < 0)
+ return ret;
+ }
- return -EINVAL;
+ if (bsp_priv->ops->speed_reg_php_grf)
+ regmap = bsp_priv->php_grf;
+ else
+ regmap = bsp_priv->grf;
+
+ if (phy_interface_mode_is_rgmii(interface) &&
+ bsp_priv->gmii_clk_sel_mask) {
+ ret = rk_gmac_rgmii_clk_div(speed);
+ if (ret < 0)
+ return ret;
+
+ val = rk_encode_wm16(ret, bsp_priv->gmii_clk_sel_mask);
+
+ ret = regmap_write(regmap, bsp_priv->speed_grf_reg, val);
+ } else if (interface == PHY_INTERFACE_MODE_RMII &&
+ (bsp_priv->rmii_clk_sel_mask ||
+ bsp_priv->mac_speed_mask)) {
+ is_100m = speed == SPEED_100;
+ val = rk_encode_wm16(is_100m, bsp_priv->mac_speed_mask) |
+ rk_encode_wm16(is_100m, bsp_priv->rmii_clk_sel_mask);
+
+ ret = regmap_write(regmap, bsp_priv->speed_grf_reg, val);
+ }
+
+ return ret;
}
static int rk_gmac_suspend(struct device *dev, void *bsp_priv_)
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 11/15] net: stmmac: rk: convert px30
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (9 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 10/15] net: stmmac: rk: move speed register into bsp_priv Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 12/15] net: stmmac: rk: introduce flags indicating support for RGMII/RMII Russell King (Oracle)
` (5 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 38 ++-----------------
1 file changed, 4 insertions(+), 34 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index c26bd22658c6..4c80a73bbf74 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -237,49 +237,19 @@ static void rk_gmac_integrated_fephy_powerdown(struct rk_priv_data *priv,
#define PX30_GRF_GMAC_CON1 0x0904
-/* PX30_GRF_GMAC_CON1 */
-#define PX30_GMAC_SPEED_10M GRF_CLR_BIT(2)
-#define PX30_GMAC_SPEED_100M GRF_BIT(2)
-
static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
{
}
-static int px30_set_speed(struct rk_priv_data *bsp_priv,
- phy_interface_t interface, int speed)
-{
- struct clk *clk_mac_speed = bsp_priv->clks[RK_CLK_MAC_SPEED].clk;
- struct device *dev = bsp_priv->dev;
- unsigned int con1;
- long rate;
-
- if (!clk_mac_speed) {
- dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
- return -EINVAL;
- }
-
- if (speed == 10) {
- con1 = PX30_GMAC_SPEED_10M;
- rate = 2500000;
- } else if (speed == 100) {
- con1 = PX30_GMAC_SPEED_100M;
- rate = 25000000;
- } else {
- dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
- return -EINVAL;
- }
-
- regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1, con1);
-
- return clk_set_rate(clk_mac_speed, rate);
-}
-
static const struct rk_gmac_ops px30_ops = {
.set_to_rmii = px30_set_to_rmii,
- .set_speed = px30_set_speed,
+ .set_speed = rk_set_clk_mac_speed,
.phy_intf_sel_grf_reg = PX30_GRF_GMAC_CON1,
.phy_intf_sel_mask = GENMASK_U16(6, 4),
+
+ .speed_grf_reg = PX30_GRF_GMAC_CON1,
+ .mac_speed_mask = BIT_U16(2),
};
#define RK3128_GRF_MAC_CON0 0x0168
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 12/15] net: stmmac: rk: introduce flags indicating support for RGMII/RMII
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (10 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 11/15] net: stmmac: rk: convert px30 Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 13/15] net: stmmac: rk: replace empty set_to_rmii() with supports_rmii Russell King (Oracle)
` (4 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
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>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 35 +++++++++++++------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 4c80a73bbf74..fbc0e50519f6 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -48,6 +48,8 @@ struct rk_gmac_ops {
u16 mac_speed_mask;
bool speed_reg_php_grf;
+ bool supports_rgmii;
+ bool supports_rmii;
bool php_grf_required;
bool regs_valid;
u32 regs[];
@@ -81,6 +83,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;
@@ -1387,6 +1391,9 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
bsp_priv->rmii_clk_sel_mask = ops->rmii_clk_sel_mask;
bsp_priv->mac_speed_mask = ops->mac_speed_mask;
+ 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) {
@@ -1405,11 +1412,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:
@@ -1455,24 +1462,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");
@@ -1508,10 +1523,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);
}
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 13/15] net: stmmac: rk: replace empty set_to_rmii() with supports_rmii
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (11 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 12/15] net: stmmac: rk: introduce flags indicating support for RGMII/RMII Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 14/15] net: stmmac: rk: rk3328: gmac2phy only supports RMII Russell King (Oracle)
` (3 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
Rather than providing a now-empty set_to_rmii() method to indicate
that RMII is supported, switch to setting ops->supports_rmii instead.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 86 ++++++-------------
1 file changed, 24 insertions(+), 62 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index fbc0e50519f6..c9a915b2cb84 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -241,12 +241,7 @@ static void rk_gmac_integrated_fephy_powerdown(struct rk_priv_data *priv,
#define PX30_GRF_GMAC_CON1 0x0904
-static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops px30_ops = {
- .set_to_rmii = px30_set_to_rmii,
.set_speed = rk_set_clk_mac_speed,
.phy_intf_sel_grf_reg = PX30_GRF_GMAC_CON1,
@@ -254,6 +249,8 @@ static const struct rk_gmac_ops px30_ops = {
.speed_grf_reg = PX30_GRF_GMAC_CON1,
.mac_speed_mask = BIT_U16(2),
+
+ .supports_rmii = true,
};
#define RK3128_GRF_MAC_CON0 0x0168
@@ -280,13 +277,8 @@ static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
RK3128_GMAC_CLK_TX_DL_CFG(tx_delay));
}
-static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops rk3128_ops = {
.set_to_rgmii = rk3128_set_to_rgmii,
- .set_to_rmii = rk3128_set_to_rmii,
.phy_intf_sel_grf_reg = RK3128_GRF_MAC_CON1,
.phy_intf_sel_mask = GENMASK_U16(8, 6),
@@ -296,6 +288,8 @@ static const struct rk_gmac_ops rk3128_ops = {
.gmii_clk_sel_mask = GENMASK_U16(13, 12),
.rmii_clk_sel_mask = BIT_U16(11),
.mac_speed_mask = BIT_U16(10),
+
+ .supports_rmii = true,
};
#define RK3228_GRF_MAC_CON0 0x0900
@@ -383,13 +377,8 @@ static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
RK3288_GMAC_CLK_TX_DL_CFG(tx_delay));
}
-static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops rk3288_ops = {
.set_to_rgmii = rk3288_set_to_rgmii,
- .set_to_rmii = rk3288_set_to_rmii,
.phy_intf_sel_grf_reg = RK3288_GRF_SOC_CON1,
.phy_intf_sel_mask = GENMASK_U16(8, 6),
@@ -399,6 +388,8 @@ static const struct rk_gmac_ops rk3288_ops = {
.gmii_clk_sel_mask = GENMASK_U16(13, 12),
.rmii_clk_sel_mask = BIT_U16(11),
.mac_speed_mask = BIT_U16(10),
+
+ .supports_rmii = true,
};
#define RK3308_GRF_MAC_CON0 0x04a0
@@ -407,18 +398,14 @@ static const struct rk_gmac_ops rk3288_ops = {
#define RK3308_GMAC_FLOW_CTRL GRF_BIT(3)
#define RK3308_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
-static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops rk3308_ops = {
- .set_to_rmii = rk3308_set_to_rmii,
-
.phy_intf_sel_grf_reg = RK3308_GRF_MAC_CON0,
.phy_intf_sel_mask = GENMASK_U16(4, 2),
.speed_grf_reg = RK3308_GRF_MAC_CON0,
.mac_speed_mask = BIT_U16(0),
+
+ .supports_rmii = true,
};
#define RK3328_GRF_MAC_CON0 0x0900
@@ -470,10 +457,6 @@ static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
RK3328_GMAC_CLK_TX_DL_CFG(tx_delay));
}
-static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
{
regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
@@ -485,7 +468,6 @@ static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
static const struct rk_gmac_ops rk3328_ops = {
.init = rk3328_init,
.set_to_rgmii = rk3328_set_to_rgmii,
- .set_to_rmii = rk3328_set_to_rmii,
.integrated_phy_powerup = rk3328_integrated_phy_powerup,
.integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
@@ -495,6 +477,8 @@ static const struct rk_gmac_ops rk3328_ops = {
.rmii_clk_sel_mask = BIT_U16(7),
.mac_speed_mask = BIT_U16(2),
+ .supports_rmii = true,
+
.regs_valid = true,
.regs = {
0xff540000, /* gmac2io */
@@ -527,13 +511,8 @@ static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
RK3366_GMAC_CLK_TX_DL_CFG(tx_delay));
}
-static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops rk3366_ops = {
.set_to_rgmii = rk3366_set_to_rgmii,
- .set_to_rmii = rk3366_set_to_rmii,
.phy_intf_sel_grf_reg = RK3366_GRF_SOC_CON6,
.phy_intf_sel_mask = GENMASK_U16(11, 9),
@@ -543,6 +522,8 @@ static const struct rk_gmac_ops rk3366_ops = {
.gmii_clk_sel_mask = GENMASK_U16(5, 4),
.rmii_clk_sel_mask = BIT_U16(3),
.mac_speed_mask = BIT_U16(7),
+
+ .supports_rmii = true,
};
#define RK3368_GRF_SOC_CON15 0x043c
@@ -569,13 +550,8 @@ static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
RK3368_GMAC_CLK_TX_DL_CFG(tx_delay));
}
-static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops rk3368_ops = {
.set_to_rgmii = rk3368_set_to_rgmii,
- .set_to_rmii = rk3368_set_to_rmii,
.phy_intf_sel_grf_reg = RK3368_GRF_SOC_CON15,
.phy_intf_sel_mask = GENMASK_U16(11, 9),
@@ -585,6 +561,8 @@ static const struct rk_gmac_ops rk3368_ops = {
.gmii_clk_sel_mask = GENMASK_U16(5, 4),
.rmii_clk_sel_mask = BIT_U16(3),
.mac_speed_mask = BIT_U16(7),
+
+ .supports_rmii = true,
};
#define RK3399_GRF_SOC_CON5 0xc214
@@ -611,13 +589,8 @@ static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
RK3399_GMAC_CLK_TX_DL_CFG(tx_delay));
}
-static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops rk3399_ops = {
.set_to_rgmii = rk3399_set_to_rgmii,
- .set_to_rmii = rk3399_set_to_rmii,
.phy_intf_sel_grf_reg = RK3399_GRF_SOC_CON5,
.phy_intf_sel_mask = GENMASK_U16(11, 9),
@@ -627,6 +600,8 @@ static const struct rk_gmac_ops rk3399_ops = {
.gmii_clk_sel_mask = GENMASK_U16(5, 4),
.rmii_clk_sel_mask = BIT_U16(3),
.mac_speed_mask = BIT_U16(7),
+
+ .supports_rmii = true,
};
#define RK3506_GRF_SOC_CON8 0x0020
@@ -858,18 +833,15 @@ static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
RK3568_GMAC_TXCLK_DLY_ENABLE);
}
-static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops rk3568_ops = {
.init = rk3568_init,
.set_to_rgmii = rk3568_set_to_rgmii,
- .set_to_rmii = rk3568_set_to_rmii,
.set_speed = rk_set_clk_mac_speed,
.phy_intf_sel_mask = GENMASK_U16(6, 4),
+ .supports_rmii = true,
+
.regs_valid = true,
.regs = {
0xfe2a0000, /* gmac0 */
@@ -943,10 +915,6 @@ static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
RK3576_GMAC_CLK_RX_DL_CFG(rx_delay));
}
-static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
bool enable)
{
@@ -966,7 +934,6 @@ static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv, bool input
static const struct rk_gmac_ops rk3576_ops = {
.init = rk3576_init,
.set_to_rgmii = rk3576_set_to_rgmii,
- .set_to_rmii = rk3576_set_to_rmii,
.set_clock_selection = rk3576_set_clock_selection,
.rmii_mode_mask = BIT_U16(3),
@@ -974,6 +941,8 @@ static const struct rk_gmac_ops rk3576_ops = {
.gmii_clk_sel_mask = GENMASK_U16(6, 5),
.rmii_clk_sel_mask = BIT_U16(5),
+ .supports_rmii = true,
+
.php_grf_required = true,
.regs_valid = true,
.regs = {
@@ -1093,19 +1062,15 @@ static const struct rk_gmac_ops rk3588_ops = {
#define RV1108_GMAC_FLOW_CTRL GRF_BIT(3)
#define RV1108_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
-static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops rv1108_ops = {
- .set_to_rmii = rv1108_set_to_rmii,
-
.phy_intf_sel_grf_reg = RV1108_GRF_GMAC_CON0,
.phy_intf_sel_mask = GENMASK_U16(6, 4),
.speed_grf_reg = RV1108_GRF_GMAC_CON0,
.rmii_clk_sel_mask = BIT_U16(7),
.mac_speed_mask = BIT_U16(2),
+
+ .supports_rmii = true,
};
#define RV1126_GRF_GMAC_CON0 0X0070
@@ -1149,17 +1114,14 @@ static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
RV1126_GMAC_M1_CLK_TX_DL_CFG(tx_delay));
}
-static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv)
-{
-}
-
static const struct rk_gmac_ops rv1126_ops = {
.set_to_rgmii = rv1126_set_to_rgmii,
- .set_to_rmii = rv1126_set_to_rmii,
.set_speed = rk_set_clk_mac_speed,
.phy_intf_sel_grf_reg = RV1126_GRF_GMAC_CON0,
.phy_intf_sel_mask = GENMASK_U16(6, 4),
+
+ .supports_rmii = true,
};
static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 14/15] net: stmmac: rk: rk3328: gmac2phy only supports RMII
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (12 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 13/15] net: stmmac: rk: replace empty set_to_rmii() with supports_rmii Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 14:51 ` [PATCH RFC net-next 15/15] net: stmmac: rk: rk3528: gmac0 " Russell King (Oracle)
` (2 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
As detailed in a previous commit ("net: stmmac: rk: convert rk3328 to
use bsp_priv->id") rk3328 gmac2phy only supports RMII, whereas gmac2io
supports both RMII and RGMII. Clear supports_rgmii for gmac2phy.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index c9a915b2cb84..c04a115beb98 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -438,6 +438,7 @@ static int rk3328_init(struct rk_priv_data *bsp_priv)
case 1: /* gmac2phy */
bsp_priv->phy_intf_sel_grf_reg = RK3328_GRF_MAC_CON2;
bsp_priv->speed_grf_reg = RK3328_GRF_MAC_CON2;
+ bsp_priv->supports_rgmii = false;
return 0;
default:
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH RFC net-next 15/15] net: stmmac: rk: rk3528: gmac0 only supports RMII
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (13 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 14/15] net: stmmac: rk: rk3328: gmac2phy only supports RMII Russell King (Oracle)
@ 2025-12-01 14:51 ` Russell King (Oracle)
2025-12-01 15:55 ` [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Andrew Lunn
2025-12-01 16:44 ` Russell King (Oracle)
16 siblings, 0 replies; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 14:51 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
RK3528 gmac0 dtsi contains:
gmac0: ethernet@ffbd0000 {
phy-handle = <&rmii0_phy>;
phy-mode = "rmii";
mdio0: mdio {
rmii0_phy: ethernet-phy@2 {
phy-is-integrated;
};
};
};
This follows the same pattern as rk3328, where this gmac instance
only supports RMII. Disable RGMII in phylink's supported_interfaces
mask for this gmac instance.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index c04a115beb98..290fd5f06267 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -701,6 +701,7 @@ static int rk3528_init(struct rk_priv_data *bsp_priv)
case 0:
bsp_priv->speed_grf_reg = RK3528_VO_GRF_GMAC_CON;
bsp_priv->rmii_clk_sel_mask = BIT_U16(3);
+ bsp_priv->supports_rgmii = false;
return 0;
case 1:
--
2.47.3
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (14 preceding siblings ...)
2025-12-01 14:51 ` [PATCH RFC net-next 15/15] net: stmmac: rk: rk3528: gmac0 " Russell King (Oracle)
@ 2025-12-01 15:55 ` Andrew Lunn
2025-12-01 16:38 ` Russell King (Oracle)
2025-12-01 16:44 ` Russell King (Oracle)
16 siblings, 1 reply; 23+ messages in thread
From: Andrew Lunn @ 2025-12-01 15:55 UTC (permalink / raw)
To: Russell King (Oracle)
Cc: Heiner Kallweit, Alexandre Torgue, Andrew Lunn, David S. Miller,
Eric Dumazet, Heiko Stuebner, Jakub Kicinski, linux-arm-kernel,
linux-rockchip, linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
> One of the interesting things is that this appears to deal with RGMII
> delays at the MAC end of the link, but there's no way to tell phylib
> that's the case. I've not looked deeply into what is going on there,
> but it is surprising that the driver insists that the delays (in
> register values?) are provided, but then ignores them depending on the
> exact RGMII mode selected.
Yes, many Rockchip .dts files use phy-mode = 'rgmii', and then do the
delays in the MAC. I've been pushing back on this for a while now, and
in most cases, it is possible to set the delays to 0, and use
'rgmii-id'.
Unfortunately, the vendor version of the driver comes with a debugfs
interface which puts the PHY into loopback, and then steps through the
different delay values to find the range of values which result in no
packet loss. The vendor documentation then recommends
phy-mode='rgmii', and set the delays to the middle value for this
range. So the vendor is leading developers up the garden path.
These delay values also appear to be magical. There has been at least
one attempt to reverse engineer the values back to ns, but it was not
possible to get consistent results across a collection of boards.
Andrew
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore
2025-12-01 15:55 ` [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Andrew Lunn
@ 2025-12-01 16:38 ` Russell King (Oracle)
2025-12-04 0:50 ` Jacob Keller
0 siblings, 1 reply; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 16:38 UTC (permalink / raw)
To: Andrew Lunn
Cc: Heiner Kallweit, Alexandre Torgue, Andrew Lunn, David S. Miller,
Eric Dumazet, Heiko Stuebner, Jakub Kicinski, linux-arm-kernel,
linux-rockchip, linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
On Mon, Dec 01, 2025 at 04:55:21PM +0100, Andrew Lunn wrote:
> > One of the interesting things is that this appears to deal with RGMII
> > delays at the MAC end of the link, but there's no way to tell phylib
> > that's the case. I've not looked deeply into what is going on there,
> > but it is surprising that the driver insists that the delays (in
> > register values?) are provided, but then ignores them depending on the
> > exact RGMII mode selected.
>
> Yes, many Rockchip .dts files use phy-mode = 'rgmii', and then do the
> delays in the MAC. I've been pushing back on this for a while now, and
> in most cases, it is possible to set the delays to 0, and use
> 'rgmii-id'.
>
> Unfortunately, the vendor version of the driver comes with a debugfs
> interface which puts the PHY into loopback, and then steps through the
> different delay values to find the range of values which result in no
> packet loss. The vendor documentation then recommends
> phy-mode='rgmii', and set the delays to the middle value for this
> range. So the vendor is leading developers up the garden path.
>
> These delay values also appear to be magical. There has been at least
> one attempt to reverse engineer the values back to ns, but it was not
> possible to get consistent results across a collection of boards.
Oh yes, I remember that. I also remember that I had asked for the
re-use of "phy_power_on()" to be fixed:
https://lore.kernel.org/netdev/aDne1Ybuvbk0AwG0@shell.armlinux.org.uk/
but that never happened... which makes me wonder whether we *shouldn't*
have applied "sensor101"'s patch until such a requested patch was
available. In my experience, this is the standard behaviour - as a
reviewer, you ask a contributor to do something as part of their
patch submission, and as long as their patch gets merged, they
couldn't give a monkeys about your request.
So, in future, I'm going to take the attitude that I will NAK
contributions if I think there's a side issue that the contributor
should also be addressing until that side issue is addressed.
This shouldn't be necessary, I wish this weren't necessary, and I wish
people could be relied upon to do the right thing, but apparently it is
going to take a stick (not merging their patches) to get them to co-
operate. More fool me for trusting someone to do something.
I now have a couple of extra patches addressing my point raised in
that email... which I myself shouldn't have had to write.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore
2025-12-01 16:38 ` Russell King (Oracle)
@ 2025-12-04 0:50 ` Jacob Keller
0 siblings, 0 replies; 23+ messages in thread
From: Jacob Keller @ 2025-12-04 0:50 UTC (permalink / raw)
To: Russell King (Oracle), Andrew Lunn
Cc: Heiner Kallweit, Alexandre Torgue, Andrew Lunn, David S. Miller,
Eric Dumazet, Heiko Stuebner, Jakub Kicinski, linux-arm-kernel,
linux-rockchip, linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
[-- Attachment #1.1: Type: text/plain, Size: 1131 bytes --]
On 12/1/2025 8:38 AM, Russell King (Oracle) wrote:
> So, in future, I'm going to take the attitude that I will NAK
> contributions if I think there's a side issue that the contributor
> should also be addressing until that side issue is addressed.
>
> This shouldn't be necessary, I wish this weren't necessary, and I wish
> people could be relied upon to do the right thing, but apparently it is
> going to take a stick (not merging their patches) to get them to co-
> operate. More fool me for trusting someone to do something.
>
Yep this is unfortunately a reality of dealing with many contributors.
While its frustrating to require this.. If you don't, and end up never
getting things fixed the end result is worse.
As a maintainer, sometimes the only leverage you have is when someone
wants a contribution to merge. Balancing so that relevant improvements
and work get done while not being so harsh that contributors stop
returning is a difficult problem.
> I now have a couple of extra patches addressing my point raised in
> that email... which I myself shouldn't have had to write.
>
:(
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore
2025-12-01 14:49 [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Russell King (Oracle)
` (15 preceding siblings ...)
2025-12-01 15:55 ` [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore Andrew Lunn
@ 2025-12-01 16:44 ` Russell King (Oracle)
2025-12-04 0:51 ` Jacob Keller
16 siblings, 1 reply; 23+ messages in thread
From: Russell King (Oracle) @ 2025-12-01 16:44 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
On Mon, Dec 01, 2025 at 02:49:56PM +0000, Russell King (Oracle) wrote:
> This is work in progress, cleaning up the excessively large Rockchip
> glue driver somewhat. This series as it currently stands removes
> approximately 200 lines from this file, while adding slightly to its
> flexibility.
>
> A brief overview of the changes:
>
> - similar to previous commits, it seems the RGMII clock field follows
> a common pattern irrespective of the SoC.
> - update rk3328 to use the ->id mechanism rather than guessing from
> the PHY interface mode and whether the PHY is integrated.
> - switch to wm16 based masking, providing the lower-16 bits of the
> mask to indicate appropriate fields, and use this to construct the
> values to write to the registers.
> - convert px30 to these methods.
> - since many set_to_rmii() methods are now empty, add flags to indicate
> whether RMII / RGMII are supported.
> - clear RGMII where the specific SoC's GMAC instance doesn't support
> this.
>
> I've spent quite a while mulling over how to deal with these "wm16"
> registers, none of the kernel bitfield macros (not even the
> hw_bitfield.h macros) allow for what I present here, because the
> masks are not constant.
>
> One of the interesting things is that this appears to deal with RGMII
> delays at the MAC end of the link, but there's no way to tell phylib
> that's the case. I've not looked deeply into what is going on there,
> but it is surprising that the driver insists that the delays (in
> register values?) are provided, but then ignores them depending on the
> exact RGMII mode selected.
>
> One outstanding issue with these patches: RK3528_GMAC0_CLK_RMII_DIV2
> remains, although I deleted its definition, so there's build errors
> in this series. Before I do anything about that, I would like to hear
> from the Rockchip guys whether it is necessary for rk3528_set_to_rmii()
> to set the clock rate, given that rk_set_clk_tx_rate() will do this
> when the link comes up. Does it matter whether it was set to 2.5MHz
> (/ 20) or 25MHz (/ 2) when we switch to RMII mode?
Another issue has come up while looking at this driver -
gmac_clk_enable() is buggy.
If clk_bulk_prepare_enable() succeeds, but then the following
clk_prepare_enable() fails, we simply return its error code, failing
gmac_clk_enable(, true), leaving the bulk clocks prepared and enabled.
Calling this with "false" to disable clocks won't - because we never
get as far as setting bsp_priv->clk_enabled, and even if we did, we'd
disable and unprepare clk_phy which failed to prepare/enable.
Again, I don't like this foo_enable() / foo_power_on() pattern with
a true/false argument - when false, the function is not enabling
nor "on"-ing, but disabling or "off"-ing. So, gmac_clk_enable() is
going to get split up and renamed.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH RFC net-next 00/15] net: stmmac: rk: cleanups galore
2025-12-01 16:44 ` Russell King (Oracle)
@ 2025-12-04 0:51 ` Jacob Keller
0 siblings, 0 replies; 23+ messages in thread
From: Jacob Keller @ 2025-12-04 0:51 UTC (permalink / raw)
To: Russell King (Oracle), Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, David S. Miller, Eric Dumazet,
Heiko Stuebner, Jakub Kicinski, linux-arm-kernel, linux-rockchip,
linux-stm32, Maxime Coquelin, netdev, Paolo Abeni
[-- Attachment #1.1: Type: text/plain, Size: 441 bytes --]
On 12/1/2025 8:44 AM, Russell King (Oracle) wrote:
> Again, I don't like this foo_enable() / foo_power_on() pattern with
> a true/false argument - when false, the function is not enabling
> nor "on"-ing, but disabling or "off"-ing. So, gmac_clk_enable() is
> going to get split up and renamed.
>
Agreed, removing this anti-pattern is good. It makes the logic more
difficult to follow and understand than well named functions.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]
^ permalink raw reply [flat|nested] 23+ messages in thread