diff mbox

[U-Boot,15/21] sunxi: emac: Add device model support

Message ID 1429883310-22441-16-git-send-email-hdegoede@redhat.com
State Superseded
Delegated to: Hans de Goede
Headers show

Commit Message

Hans de Goede April 24, 2015, 1:48 p.m. UTC
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(-)

Comments

Simon Glass April 24, 2015, 11:24 p.m. UTC | #1
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

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(&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
Hans de Goede April 25, 2015, 8:39 a.m. UTC | #2
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(&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
>
diff mbox

Patch

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];
+#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