On Thu, Jan 19, 2023 at 11:45 PM Marek Vasut <[email protected]> wrote:
>
> With DM clock support in place, it is easy to add RMII support into the
> MAC driver. The RMII cannot operate at 1000 Mbps and at 100 and 10 Mbps
> the clock frequency is 50 MHz and 5 MHz instead of 25 MHz and 2.5 MHz.
>
> The board DT requires the following adjustments to EQoS node:
>   phy-mode = "rmii";
>   assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_266M>,
>                         <&clk IMX8MP_SYS_PLL2_100M>,
>                         <&clk IMX8MP_SYS_PLL2_50M>;
>   assigned-clock-rates = <0>, <100000000>, <50000000>;
>
> Signed-off-by: Marek Vasut <[email protected]>
> ---
> Cc: "Ariel D'Alessandro" <[email protected]>
> Cc: "NXP i.MX U-Boot Team" <[email protected]>
> Cc: Andrey Zhizhikin <[email protected]>
> Cc: Fabio Estevam <[email protected]>
> Cc: Joe Hershberger <[email protected]>
> Cc: Lukasz Majewski <[email protected]>
> Cc: Marcel Ziswiler <[email protected]>
> Cc: Marek Vasut <[email protected]>
> Cc: Michael Trimarchi <[email protected]>
> Cc: Peng Fan <[email protected]>
> Cc: Ramon Fried <[email protected]>
> Cc: Sean Anderson <[email protected]>
> Cc: Stefano Babic <[email protected]>
> Cc: Tim Harvey <[email protected]>
> Cc: Tommaso Merciai <[email protected]>
> Cc: [email protected]
> ---
>  drivers/net/dwc_eth_qos_imx.c | 26 +++++++++++++++-----------
>  1 file changed, 15 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/dwc_eth_qos_imx.c b/drivers/net/dwc_eth_qos_imx.c
> index d0b7ef75c26..55080257623 100644
> --- a/drivers/net/dwc_eth_qos_imx.c
> +++ b/drivers/net/dwc_eth_qos_imx.c
> @@ -178,21 +178,25 @@ static int eqos_set_tx_clk_speed_imx(struct udevice 
> *dev)
>
>         debug("%s(dev=%p):\n", __func__, dev);
>
> -       switch (eqos->phy->speed) {
> -       case SPEED_1000:
> -               rate = 125 * 1000 * 1000;
> -               break;
> -       case SPEED_100:
> -               rate = 25 * 1000 * 1000;
> -               break;
> -       case SPEED_10:
> -               rate = 2.5 * 1000 * 1000;
> -               break;
> -       default:
> +       if (eqos->phy->interface == PHY_INTERFACE_MODE_RMII)
> +               rate = 5000;    /* 5000 kHz = 5 MHz */
> +       else
> +               rate = 2500;    /* 2500 kHz = 2.5 MHz */
> +
> +       if (eqos->phy->speed == SPEED_1000 &&
> +           eqos->phy->interface == PHY_INTERFACE_MODE_RGMII) {
> +               rate *= 50;     /* Use 50x base rate i.e. 125 MHz */
> +       } else if (eqos->phy->speed == SPEED_100) {
> +               rate *= 10;     /* Use 10x base rate */
> +       } else if (eqos->phy->speed == SPEED_10) {
> +               rate *= 1;      /* Use base rate */
> +       } else {
>                 pr_err("invalid speed %d", eqos->phy->speed);
>                 return -EINVAL;
>         }
>
> +       rate *= 1000;   /* clk_set_rate() operates in Hz */
> +
>         ret = clk_set_rate(&eqos->clk_tx, rate);
>         if (ret < 0) {
>                 pr_err("imx (tx_clk, %lu) failed: %d", rate, ret);
> --
> 2.39.0
>
Reviewed-by: Ramon Fried <[email protected]>

Reply via email to