[PATCH 2/2] net: gmac_rockchip: Add RMII support for rk3288
Kever Yang
kever.yang at rock-chips.com
Thu May 8 05:12:44 CEST 2025
On 2025/4/16 19:45, Christoph Fritz wrote:
> Add RMII-specific handling to rk3288_gmac_fix_mac_speed() so that it
> properly sets the RMII clock (2.5 MHz vs. 25 MHz) and speed bits
> (10 Mbps vs. 100 Mbps). Also define a new rk3288_gmac_set_to_rmii()
> function to set the PHY interface field and RMII_MODE bit.
>
> Signed-off-by: Christoph Fritz <chf.fritz at googlemail.com>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
> ---
> drivers/net/gmac_rockchip.c | 69 ++++++++++++++++++++++++++++---------
> 1 file changed, 53 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/net/gmac_rockchip.c b/drivers/net/gmac_rockchip.c
> index 8cfeeffe95b..c8cfe7448d4 100644
> --- a/drivers/net/gmac_rockchip.c
> +++ b/drivers/net/gmac_rockchip.c
> @@ -151,26 +151,51 @@ static int rk3228_gmac_fix_mac_speed(struct dw_eth_dev *priv)
>
> static int rk3288_gmac_fix_mac_speed(struct dw_eth_dev *priv)
> {
> + struct dw_eth_pdata *dw_pdata = dev_get_plat(priv->dev);
> + struct eth_pdata *eth_pdata = &dw_pdata->eth_pdata;
> struct rk3288_grf *grf;
> + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
> int clk;
>
> - switch (priv->phydev->speed) {
> - case 10:
> - clk = RK3288_GMAC_CLK_SEL_2_5M;
> - break;
> - case 100:
> - clk = RK3288_GMAC_CLK_SEL_25M;
> - break;
> - case 1000:
> - clk = RK3288_GMAC_CLK_SEL_125M;
> - break;
> - default:
> - debug("Unknown phy speed: %d\n", priv->phydev->speed);
> - return -EINVAL;
> - }
> + if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
> + switch (priv->phydev->speed) {
> + case 10:
> + rk_clrsetreg(&grf->soc_con1,
> + RK3288_RMII_CLK_SEL_MASK |
> + RK3288_GMAC_SPEED_MASK,
> + RK3288_RMII_CLK_SEL_2_5M |
> + RK3288_GMAC_SPEED_10M);
> + break;
> + case 100:
> + rk_clrsetreg(&grf->soc_con1,
> + RK3288_RMII_CLK_SEL_MASK |
> + RK3288_GMAC_SPEED_MASK,
> + RK3288_RMII_CLK_SEL_25M |
> + RK3288_GMAC_SPEED_100M);
> + break;
> + default:
> + debug("Unknown phy speed: %d\n", priv->phydev->speed);
> + return -EINVAL;
> + }
> + } else {
> + switch (priv->phydev->speed) {
> + case 10:
> + clk = RK3288_GMAC_CLK_SEL_2_5M;
> + break;
> + case 100:
> + clk = RK3288_GMAC_CLK_SEL_25M;
> + break;
> + case 1000:
> + clk = RK3288_GMAC_CLK_SEL_125M;
> + break;
> +
> + default:
> + debug("Unknown phy speed: %d\n", priv->phydev->speed);
> + return -EINVAL;
> + }
>
> - grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
> - rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
> + rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
> + }
>
> return 0;
> }
> @@ -401,6 +426,17 @@ static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_plat *pdata)
> pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
> }
>
> +static void rk3288_gmac_set_to_rmii(struct gmac_rockchip_plat *pdata)
> +{
> + struct rk3288_grf *grf;
> +
> + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
> +
> + rk_clrsetreg(&grf->soc_con1,
> + RK3288_GMAC_PHY_INTF_SEL_MASK | RK3288_RMII_MODE_MASK,
> + RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_RMII_MODE);
> +}
> +
> static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_plat *pdata)
> {
> struct rk3288_grf *grf;
> @@ -703,6 +739,7 @@ const struct rk_gmac_ops rk3228_gmac_ops = {
> const struct rk_gmac_ops rk3288_gmac_ops = {
> .fix_mac_speed = rk3288_gmac_fix_mac_speed,
> .set_to_rgmii = rk3288_gmac_set_to_rgmii,
> + .set_to_rmii = rk3288_gmac_set_to_rmii,
> };
>
> const struct rk_gmac_ops rk3308_gmac_ops = {
More information about the U-Boot
mailing list