> 2026年5月4日 21:45,Alexey Charkov <[email protected]> 写道:
> 
> Rockchip RK3576 SoC has two built-in GMACs which connect to external PHYs
> via RGMII interface. The RGMII link can be clocked by either the PHY or
> the SoC. When the SoC is the master, as is the case on the RK3576 EVB1,
> the output clock needs to be configured in the CRU.
> 
> Add the respective logic for getting and setting the RGMII reference clock
> output for both GMAC0 and GMAC1.
> 
> Signed-off-by: Alexey Charkov <[email protected]>

Reviewed-by: Kever Yang <[email protected] 
<mailto:[email protected]>>

Thanks,
- Kever
> ---
> arch/arm/include/asm/arch-rockchip/cru_rk3576.h | 14 +++++++
> drivers/clk/rockchip/clk_rk3576.c               | 50 +++++++++++++++++++++++++
> 2 files changed, 64 insertions(+)
> 
> diff --git a/arch/arm/include/asm/arch-rockchip/cru_rk3576.h 
> b/arch/arm/include/asm/arch-rockchip/cru_rk3576.h
> index c51750beff28..fb77fbd7307a 100644
> --- a/arch/arm/include/asm/arch-rockchip/cru_rk3576.h
> +++ b/arch/arm/include/asm/arch-rockchip/cru_rk3576.h
> @@ -222,6 +222,20 @@ enum {
>       REF_CLK0_OUT_PLL_DIV_SHIFT      = 0,
>       REF_CLK0_OUT_PLL_DIV_MASK       = 0xff << REF_CLK0_OUT_PLL_DIV_SHIFT,
> 
> +     /* CRU_CLK_SEL36_CON */
> +     CLK_REFCLKO25M_GMAC0_DIV_SHIFT  = 0,
> +     CLK_REFCLKO25M_GMAC0_DIV_MASK   = 0x7f << 
> CLK_REFCLKO25M_GMAC0_DIV_SHIFT,
> +     CLK_REFCLKO25M_GMAC0_SEL_SHIFT  = 7,
> +     CLK_REFCLKO25M_GMAC0_SEL_MASK   = 1 << CLK_REFCLKO25M_GMAC0_SEL_SHIFT,
> +     CLK_REFCLKO25M_GMAC0_SEL_GPLL   = 0,
> +     CLK_REFCLKO25M_GMAC0_SEL_CPLL   = 1,
> +     CLK_REFCLKO25M_GMAC1_DIV_SHIFT  = 8,
> +     CLK_REFCLKO25M_GMAC1_DIV_MASK   = 0x7f << 
> CLK_REFCLKO25M_GMAC1_DIV_SHIFT,
> +     CLK_REFCLKO25M_GMAC1_SEL_SHIFT  = 15,
> +     CLK_REFCLKO25M_GMAC1_SEL_MASK   = 1 << CLK_REFCLKO25M_GMAC1_SEL_SHIFT,
> +     CLK_REFCLKO25M_GMAC1_SEL_GPLL   = 0,
> +     CLK_REFCLKO25M_GMAC1_SEL_CPLL   = 1,
> +
>       /* CRU_CLK_SEL55_CON */
>       ACLK_BUS_ROOT_SEL_SHIFT         = 9,
>       ACLK_BUS_ROOT_SEL_MASK          = 1 << ACLK_BUS_ROOT_SEL_SHIFT,
> diff --git a/drivers/clk/rockchip/clk_rk3576.c 
> b/drivers/clk/rockchip/clk_rk3576.c
> index 1026af27ca13..5168196b14e8 100644
> --- a/drivers/clk/rockchip/clk_rk3576.c
> +++ b/drivers/clk/rockchip/clk_rk3576.c
> @@ -1549,6 +1549,24 @@ static ulong rk3576_gmac_get_clk(struct 
> rk3576_clk_priv *priv, ulong clk_id)
>               con = readl(&cru->clksel_con[31]);
>               div = (con & CLK_GMAC1_125M_DIV_MASK) >> 
> CLK_GMAC1_125M_DIV_SHIFT;
>               return DIV_TO_RATE(priv->cpll_hz, div);
> +     case REFCLKO25M_GMAC0_OUT:
> +             con = readl(&cru->clksel_con[36]);
> +             div = (con & CLK_REFCLKO25M_GMAC0_DIV_MASK) >> 
> CLK_REFCLKO25M_GMAC0_DIV_SHIFT;
> +             src = (con & CLK_REFCLKO25M_GMAC0_SEL_MASK) >> 
> CLK_REFCLKO25M_GMAC0_SEL_SHIFT;
> +             if (src == CLK_REFCLKO25M_GMAC0_SEL_CPLL)
> +                     p_rate = priv->cpll_hz;
> +             else
> +                     p_rate = priv->gpll_hz;
> +             return DIV_TO_RATE(p_rate, div);
> +     case REFCLKO25M_GMAC1_OUT:
> +             con = readl(&cru->clksel_con[36]);
> +             div = (con & CLK_REFCLKO25M_GMAC1_DIV_MASK) >> 
> CLK_REFCLKO25M_GMAC1_DIV_SHIFT;
> +             src = (con & CLK_REFCLKO25M_GMAC1_SEL_MASK) >> 
> CLK_REFCLKO25M_GMAC1_SEL_SHIFT;
> +             if (src == CLK_REFCLKO25M_GMAC1_SEL_CPLL)
> +                     p_rate = priv->cpll_hz;
> +             else
> +                     p_rate = priv->gpll_hz;
> +             return DIV_TO_RATE(p_rate, div);
>       default:
>               return -ENOENT;
>       }
> @@ -1608,6 +1626,34 @@ static ulong rk3576_gmac_set_clk(struct 
> rk3576_clk_priv *priv,
>                            CLK_GMAC1_125M_DIV_MASK,
>                            (div - 1) << CLK_GMAC1_125M_DIV_SHIFT);
>               break;
> +     case REFCLKO25M_GMAC0_OUT:
> +             if (!(priv->gpll_hz % rate)) {
> +                     src = CLK_REFCLKO25M_GMAC0_SEL_GPLL;
> +                     div = priv->gpll_hz / rate;
> +             } else {
> +                     src = CLK_REFCLKO25M_GMAC0_SEL_CPLL;
> +                     div = priv->cpll_hz / rate;
> +             }
> +             rk_clrsetreg(&cru->clksel_con[36],
> +                          CLK_REFCLKO25M_GMAC0_SEL_MASK |
> +                          CLK_REFCLKO25M_GMAC0_DIV_MASK,
> +                          src << CLK_REFCLKO25M_GMAC0_SEL_SHIFT |
> +                          (div - 1) << CLK_REFCLKO25M_GMAC0_DIV_SHIFT);
> +             break;
> +     case REFCLKO25M_GMAC1_OUT:
> +             if (!(priv->gpll_hz % rate)) {
> +                     src = CLK_REFCLKO25M_GMAC1_SEL_GPLL;
> +                     div = priv->gpll_hz / rate;
> +             } else {
> +                     src = CLK_REFCLKO25M_GMAC1_SEL_CPLL;
> +                     div = priv->cpll_hz / rate;
> +             }
> +             rk_clrsetreg(&cru->clksel_con[36],
> +                          CLK_REFCLKO25M_GMAC1_SEL_MASK |
> +                          CLK_REFCLKO25M_GMAC1_DIV_MASK,
> +                          src << CLK_REFCLKO25M_GMAC1_SEL_SHIFT |
> +                          (div - 1) << CLK_REFCLKO25M_GMAC1_DIV_SHIFT);
> +             break;
>       default:
>               return -ENOENT;
>       }
> @@ -2014,6 +2060,8 @@ static ulong rk3576_clk_get_rate(struct clk *clk)
>       case CLK_GMAC1_PTP_REF:
>       case CLK_GMAC0_125M_SRC:
>       case CLK_GMAC1_125M_SRC:
> +     case REFCLKO25M_GMAC0_OUT:
> +     case REFCLKO25M_GMAC1_OUT:
>               rate = rk3576_gmac_get_clk(priv, clk->id);
>               break;
>       case CLK_UART_FRAC_0:
> @@ -2193,6 +2241,8 @@ static ulong rk3576_clk_set_rate(struct clk *clk, ulong 
> rate)
>       case CLK_GMAC1_PTP_REF:
>       case CLK_GMAC0_125M_SRC:
>       case CLK_GMAC1_125M_SRC:
> +     case REFCLKO25M_GMAC0_OUT:
> +     case REFCLKO25M_GMAC1_OUT:
>               ret = rk3576_gmac_set_clk(priv, clk->id, rate);
>               break;
>       case CLK_UART_FRAC_0:
> 
> ---
> base-commit: bb0f3eebb3c196d9b6efbbd1e5aa9b16abbb9ad6
> change-id: 20260504-rk3576-rgmii-refclk-45d18a47be33
> 
> Best regards,
> -- 
> Alexey Charkov <[email protected]>
> 
> 
> 

Reply via email to