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

Hans de Goede
2015-04-25T08:39:28Z

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
>