Hi,

On 25-04-15 01:24, Simon Glass wrote:
Hi Hans,

On 24 April 2015 at 07:48, Hans de Goede <hdego...@redhat.com> wrote:
Modify the sunxi-emac eth driver to support device model.

Signed-off-by: Hans de Goede <hdego...@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

This define already exists and actually has the typo in it, I can
do another preparation patch fixing this I guess.

Also does this need to be DMA-aligned? - e.g. DM_FLAG_ALLOC_PRIV_DMA

Nope, this driver only uses mmio, not dma, the name of the
variable not only has a typo it is also misleading. Guess I
better do a preparation patch to slot in before this one
to fixup the define's name.

Regards,

Hans



+#endif
  };

  struct emac_rxhdr {
@@ -509,6 +513,7 @@ static void sunxi_emac_board_setup(struct emac_eth_dev 
*priv)
         clrsetbits_le32(&regs->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

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to