[U-Boot] [PATCH 6/6] net: sun8i-emac: add support for new DT binding

Simon Glass sjg at chromium.org
Fri Jul 7 03:58:56 UTC 2017


Hi Andre,

On 2 July 2017 at 18:59, Andre Przywara <andre.przywara at arm.com> wrote:
> The Ethernet MAC used in newer Allwinner SoCs (H3, A64, H5) is about to
> get an upstream Linux driver very soon (it's already lurking in -next).
> This one uses a slightly different binding from the original one used
> by the U-Boot driver.
> The differences to the old binding are:
> - The "syscon" address is held in a separate node, referenced via a
>   phandle in the "syscon" property.
> - The reference to the PHY is held in a property called "phy-handle",
>   not "phy".
> - The PHY register is at offset 0x30 in the syscon device, not at 0.
> - The internal PHY is activated when a capable SoC selects MII mode.
>
> Teach the U-Boot driver how to find its resources in a "new-style" DT,
> so that we can use a Linux kernel compatible DT for U-Boot as well.
> This keeps support for the old binding (for now?), to allow a smooth
> transition.
>
> Signed-off-by: Andre Przywara <andre.przywara at arm.com>
> ---
>  drivers/net/sun8i_emac.c | 51 +++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 44 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/sun8i_emac.c b/drivers/net/sun8i_emac.c
> index af77134..8320518 100644
> --- a/drivers/net/sun8i_emac.c
> +++ b/drivers/net/sun8i_emac.c
> @@ -278,7 +278,7 @@ static int sun8i_emac_set_syscon(struct emac_eth_dev *priv)
>         int ret;
>         u32 reg;
>
> -       reg = readl(priv->sysctl_reg);
> +       reg = readl(priv->sysctl_reg + 0x30);
>
>         if (priv->variant == H3_EMAC) {
>                 ret = sun8i_emac_set_syscon_ephy(priv, &reg);
> @@ -309,7 +309,7 @@ static int sun8i_emac_set_syscon(struct emac_eth_dev *priv)
>                 return -EINVAL;
>         }
>
> -       writel(reg, priv->sysctl_reg);
> +       writel(reg, priv->sysctl_reg + 0x30);
>
>         return 0;
>  }
> @@ -733,17 +733,50 @@ static int sun8i_emac_eth_ofdata_to_platdata(struct udevice *dev)
>  #endif
>
>         pdata->iobase = devfdt_get_addr_name(dev, "emac");
> +       if (pdata->iobase == FDT_ADDR_T_NONE)
> +               pdata->iobase = devfdt_get_addr(dev);
> +       if (pdata->iobase == FDT_ADDR_T_NONE) {
> +               debug("%s: Cannot find MAC base address\n", __func__);
> +               return -EINVAL;
> +       }
> +
>         priv->sysctl_reg = devfdt_get_addr_name(dev, "syscon");

Can we use a syscon driver for this instead?

Then there is syscon_get_first_range().

[...]

Regards,
Simon


More information about the U-Boot mailing list