]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/net/sunxi_emac.c
drivers: fsl-mc: Update flibs to mc-0.6.0.1
[karo-tx-uboot.git] / drivers / net / sunxi_emac.c
index e43b1e7d6438a3cdc68442ed8ca80885b3dd7a3b..e939bf2108a3fbde2c23cd01bdb09f815a4be53c 100644 (file)
@@ -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[EMAC_RX_BUFSIZE];
+#endif
 };
 
 struct emac_rxhdr {
@@ -509,67 +513,75 @@ static void sunxi_emac_board_setup(struct emac_eth_dev *priv)
        clrsetbits_le32(&regs->mac_mcfg, 0xf << 2, 0xd << 2);
 }
 
-static int sunxi_emac_eth_init(struct eth_device *dev, bd_t *bis)
+static int sunxi_emac_eth_start(struct udevice *dev)
 {
-       return _sunxi_emac_eth_init(dev->priv, dev->enetaddr);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+
+       return _sunxi_emac_eth_init(dev->priv, pdata->enetaddr);
 }
 
-static void sunxi_emac_eth_halt(struct eth_device *dev)
+static int sunxi_emac_eth_send(struct udevice *dev, void *packet, int length)
 {
-       /* Nothing to do here */
+       struct emac_eth_dev *priv = dev_get_priv(dev);
+
+       return _sunxi_emac_eth_send(priv, packet, length);
 }
 
-static int sunxi_emac_eth_recv(struct eth_device *dev)
+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(dev->priv, net_rx_packets[0]);
-       if (rx_len <= 0)
-               return 0;
-
-       /* Pass to upper layer */
-       net_process_received_packet(net_rx_packets[0], rx_len);
+       rx_len = _sunxi_emac_eth_recv(priv, priv->rx_buf);
+       *packetp = priv->rx_buf;
 
        return rx_len;
 }
 
-static int sunxi_emac_eth_send(struct eth_device *dev, void *packet, int length)
+static void sunxi_emac_eth_stop(struct udevice *dev)
 {
-       return _sunxi_emac_eth_send(dev->priv, packet, length);
+       /* Nothing to do here */
 }
 
-int sunxi_emac_initialize(void)
+static int sunxi_emac_eth_probe(struct udevice *dev)
 {
-       struct emac_regs *regs =
-               (struct emac_regs *)SUNXI_EMAC_BASE;
-       struct eth_device *dev;
-       struct emac_eth_dev *priv;
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct emac_eth_dev *priv = dev_get_priv(dev);
 
-       dev = malloc(sizeof(*dev));
-       if (dev == NULL)
-               return -ENOMEM;
-
-       priv = (struct emac_eth_dev *)malloc(sizeof(struct emac_eth_dev));
-       if (!priv) {
-               free(dev);
-               return -ENOMEM;
-       }
+       priv->regs = (struct emac_regs *)pdata->iobase;
+       sunxi_emac_board_setup(priv);
 
-       memset(dev, 0, sizeof(*dev));
-       memset(priv, 0, sizeof(struct emac_eth_dev));
+       return sunxi_emac_init_phy(priv, dev);
+}
 
-       priv->regs = regs;
-       dev->iobase = (int)regs;
-       dev->priv = priv;
-       dev->init = sunxi_emac_eth_init;
-       dev->halt = sunxi_emac_eth_halt;
-       dev->send = sunxi_emac_eth_send;
-       dev->recv = sunxi_emac_eth_recv;
-       strcpy(dev->name, "emac");
+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,
+};
 
-       sunxi_emac_board_setup(priv);
+static int sunxi_emac_eth_ofdata_to_platdata(struct udevice *dev)
+{
+       struct eth_pdata *pdata = dev_get_platdata(dev);
 
-       eth_register(dev);
+       pdata->iobase = dev_get_addr(dev);
 
-       return sunxi_emac_init_phy(priv, 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),
+};