
Hi,
On 25-04-15 01:24, Simon Glass wrote:
Hi Hans,
On 24 April 2015 at 07:48, Hans de Goede hdegoede@redhat.com wrote:
Modify the sunxi-emac eth driver to support device model.
Signed-off-by: Hans de Goede hdegoede@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(®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