[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, ®);
> @@ -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