Message ID | 1429883310-22441-16-git-send-email-hdegoede@redhat.com |
---|---|
State | Superseded |
Delegated to: | Hans de Goede |
Headers | show |
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(®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
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 >
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(®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
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(-)