[U-Boot] [PATCH 15/21] sunxi: emac: Add device model support
Simon Glass
sjg at chromium.org
Sat Apr 25 01:24:28 CEST 2015
Hi Hans,
On 24 April 2015 at 07:48, Hans de Goede <hdegoede at redhat.com> wrote:
> Modify the sunxi-emac eth driver to support device model.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
> arch/arm/cpu/armv7/sunxi/board.c | 4 +-
> drivers/net/sunxi_emac.c | 81 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 84 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/cpu/armv7/sunxi/board.c b/arch/arm/cpu/armv7/sunxi/board.c
> index 7e9cf11..cde13ef 100644
> --- a/arch/arm/cpu/armv7/sunxi/board.c
> +++ b/arch/arm/cpu/armv7/sunxi/board.c
> @@ -12,7 +12,9 @@
>
> #include <common.h>
> #include <i2c.h>
> +#ifndef CONFIG_DM_ETH
> #include <netdev.h>
> +#endif
> #include <miiphy.h>
> #include <serial.h>
> #ifdef CONFIG_SPL_BUILD
> @@ -224,7 +226,7 @@ int cpu_eth_init(bd_t *bis)
> mdelay(200);
> #endif
>
> -#ifdef CONFIG_SUNXI_EMAC
> +#if defined CONFIG_SUNXI_EMAC && !defined CONFIG_DM_ETH
> rc = sunxi_emac_initialize(bis);
> if (rc < 0) {
> printf("sunxi: failed to initialize emac\n");
> diff --git a/drivers/net/sunxi_emac.c b/drivers/net/sunxi_emac.c
> index 038f474..a9efe11 100644
> --- a/drivers/net/sunxi_emac.c
> +++ b/drivers/net/sunxi_emac.c
> @@ -7,6 +7,7 @@
> */
>
> #include <common.h>
> +#include <dm.h>
> #include <linux/err.h>
> #include <malloc.h>
> #include <miiphy.h>
> @@ -160,6 +161,9 @@ struct emac_eth_dev {
> struct mii_dev *bus;
> struct phy_device *phydev;
> int link_printed;
> +#ifdef CONFIG_DM_ETH
> + uchar rx_buf[DMA_CPU_TRRESHOLD];
THRESHOLD
Also does this need to be DMA-aligned? - e.g. DM_FLAG_ALLOC_PRIV_DMA
> +#endif
> };
>
> struct emac_rxhdr {
> @@ -509,6 +513,7 @@ static void sunxi_emac_board_setup(struct emac_eth_dev *priv)
> clrsetbits_le32(®s->mac_mcfg, 0xf << 2, 0xd << 2);
> }
>
> +#ifndef CONFIG_DM_ETH
> static int sunxi_emac_eth_init(struct eth_device *dev, bd_t *bis)
> {
> return _sunxi_emac_eth_init(dev->priv, dev->enetaddr);
> @@ -573,3 +578,79 @@ int sunxi_emac_initialize(void)
>
> return sunxi_emac_init_phy(priv, dev);
> }
> +#endif
> +
> +#ifdef CONFIG_DM_ETH
> +static int sunxi_emac_eth_start(struct udevice *dev)
> +{
> + struct eth_pdata *pdata = dev_get_platdata(dev);
> +
> + return _sunxi_emac_eth_init(dev->priv, pdata->enetaddr);
> +}
> +
> +static int sunxi_emac_eth_send(struct udevice *dev, void *packet, int length)
> +{
> + struct emac_eth_dev *priv = dev_get_priv(dev);
> +
> + return _sunxi_emac_eth_send(priv, packet, length);
> +}
> +
> +static int sunxi_emac_eth_recv(struct udevice *dev, uchar **packetp)
> +{
> + struct emac_eth_dev *priv = dev_get_priv(dev);
> + int rx_len;
> +
> + rx_len = _sunxi_emac_eth_recv(priv, priv->rx_buf);
> + *packetp = priv->rx_buf;
> +
> + return rx_len;
> +}
> +
> +static void sunxi_emac_eth_stop(struct udevice *dev)
> +{
> + /* Nothing to do here */
> +}
> +
> +static int sunxi_emac_eth_probe(struct udevice *dev)
> +{
> + struct eth_pdata *pdata = dev_get_platdata(dev);
> + struct emac_eth_dev *priv = dev_get_priv(dev);
> +
> + priv->regs = (struct emac_regs *)pdata->iobase;
> + sunxi_emac_board_setup(priv);
> +
> + return sunxi_emac_init_phy(priv, dev);
> +}
> +
> +static const struct eth_ops sunxi_emac_eth_ops = {
> + .start = sunxi_emac_eth_start,
> + .send = sunxi_emac_eth_send,
> + .recv = sunxi_emac_eth_recv,
> + .stop = sunxi_emac_eth_stop,
> +};
> +
> +static int sunxi_emac_eth_ofdata_to_platdata(struct udevice *dev)
> +{
> + struct eth_pdata *pdata = dev_get_platdata(dev);
> +
> + pdata->iobase = dev_get_addr(dev);
> +
> + return 0;
> +}
> +
> +static const struct udevice_id sunxi_emac_eth_ids[] = {
> + { .compatible = "allwinner,sun4i-a10-emac" },
> + { }
> +};
> +
> +U_BOOT_DRIVER(eth_sunxi_emac) = {
> + .name = "eth_sunxi_emac",
> + .id = UCLASS_ETH,
> + .of_match = sunxi_emac_eth_ids,
> + .ofdata_to_platdata = sunxi_emac_eth_ofdata_to_platdata,
> + .probe = sunxi_emac_eth_probe,
> + .ops = &sunxi_emac_eth_ops,
> + .priv_auto_alloc_size = sizeof(struct emac_eth_dev),
> + .platdata_auto_alloc_size = sizeof(struct eth_pdata),
> +};
> +#endif
> --
> 2.3.5
>
Regards,
Simon
More information about the U-Boot
mailing list