|
@@ -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,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
|