From patchwork Tue Mar 17 06:55:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 243733 List-Id: U-Boot discussion From: yamada.masahiro at socionext.com (Masahiro Yamada) Date: Tue, 17 Mar 2020 15:55:18 +0900 Subject: [PATCH 12/12] net: smc911x: Add DM support In-Reply-To: <20200315165843.81753-13-marek.vasut+renesas@gmail.com> References: <20200315165843.81753-1-marek.vasut+renesas@gmail.com> <20200315165843.81753-13-marek.vasut+renesas@gmail.com> Message-ID: On Mon, Mar 16, 2020 at 2:01 AM Marek Vasut wrote: > > Add support for U-Boot DM and DT probing. Furthermore, build the > SMC911x standalone EEPROM example only for the non-DM case, as it > is not converted yet. > > Signed-off-by: Marek Vasut > Cc: Joe Hershberger > Cc: Masahiro Yamada > --- > board/renesas/blanche/blanche.c | 2 + Do you need to touch this board in the same commit? It is unclear to me why. One more thing, CONFIG_SMC911X_BASE is only used for non DM_ETH case. So, can you hide this config option? Lastly, mismatch between From: and Signed-off-by. Without "+renesas" in From, With "+renesas" in Signed-off-by. So that you are paid correctly for this work. Just in case. :) Anyway, this series worked for me with DM_ETH=y. Good work. Thanks. > drivers/net/smc911x.c | 114 ++++++++++++++++++++++++++++++++ > examples/standalone/Makefile | 5 +- > 3 files changed, 120 insertions(+), 1 deletion(-) > > diff --git a/board/renesas/blanche/blanche.c b/board/renesas/blanche/blanche.c > index 7232370d6f..eec1dde106 100644 > --- a/board/renesas/blanche/blanche.c > +++ b/board/renesas/blanche/blanche.c > @@ -313,6 +313,7 @@ int board_init(void) > } > > /* Added for BLANCHE(R-CarV2H board) */ > +#ifndef CONFIG_DM_ETH > int board_eth_init(bd_t *bis) > { > int rc = 0; > @@ -337,6 +338,7 @@ int board_eth_init(bd_t *bis) > > return rc; > } > +#endif > > int dram_init(void) > { > diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c > index 71c7a2e632..8abc5e97ac 100644 > --- a/drivers/net/smc911x.c > +++ b/drivers/net/smc911x.c > @@ -21,7 +21,9 @@ struct chip_id { > }; > > struct smc911x_priv { > +#ifndef CONFIG_DM_ETH > struct eth_device dev; > +#endif > phys_addr_t iobase; > const struct chip_id *chipid; > unsigned char enetaddr[6]; > @@ -371,6 +373,8 @@ static int smc911x_recv_common(struct smc911x_priv *priv, u32 *data) > return pktlen; > } > > +#ifndef CONFIG_DM_ETH > + > #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) > /* wrapper for smc911x_eth_phy_read */ > static int smc911x_miiphy_read(struct mii_dev *bus, int phy, int devad, > @@ -502,3 +506,113 @@ int smc911x_initialize(u8 dev_num, int base_addr) > > return 1; > } > + > +#else /* ifdef CONFIG_DM_ETH */ > + > +static int smc911x_start(struct udevice *dev) > +{ > + struct eth_pdata *plat = dev_get_platdata(dev); > + struct smc911x_priv *priv = dev_get_priv(dev); > + > + memcpy(priv->enetaddr, plat->enetaddr, sizeof(plat->enetaddr)); > + > + return smc911x_init_common(priv); > +} > + > +static void smc911x_stop(struct udevice *dev) > +{ > + struct smc911x_priv *priv = dev_get_priv(dev); > + > + smc911x_halt_common(priv); > +} > + > +static int smc911x_send(struct udevice *dev, void *packet, int length) > +{ > + struct smc911x_priv *priv = dev_get_priv(dev); > + int ret; > + > + ret = smc911x_send_common(priv, packet, length); > + > + return ret ? 0 : -ETIMEDOUT; > +} > + > +static int smc911x_recv(struct udevice *dev, int flags, uchar **packetp) > +{ > + struct smc911x_priv *priv = dev_get_priv(dev); > + u32 *data = (u32 *)net_rx_packets[0]; > + int ret; > + > + ret = smc911x_recv_common(priv, data); > + if (ret) > + *packetp = (void *)data; > + > + return ret ? ret : -EAGAIN; > +} > + > +static int smc911x_bind(struct udevice *dev) > +{ > + return device_set_name(dev, dev->name); > +} > + > +static int smc911x_probe(struct udevice *dev) > +{ > + struct smc911x_priv *priv = dev_get_priv(dev); > + unsigned long addrh, addrl; > + int ret; > + > + /* Try to detect chip. Will fail if not present. */ > + ret = smc911x_detect_chip(priv); > + if (ret) > + return ret; > + > + addrh = smc911x_get_mac_csr(priv, ADDRH); > + addrl = smc911x_get_mac_csr(priv, ADDRL); > + if (!(addrl == 0xffffffff && addrh == 0x0000ffff)) { > + /* address is obtained from optional eeprom */ > + priv->enetaddr[0] = addrl; > + priv->enetaddr[1] = addrl >> 8; > + priv->enetaddr[2] = addrl >> 16; > + priv->enetaddr[3] = addrl >> 24; > + priv->enetaddr[4] = addrh; > + priv->enetaddr[5] = addrh >> 8; > + } > + > + return 0; > +} > + > +static int smc911x_ofdata_to_platdata(struct udevice *dev) > +{ > + struct smc911x_priv *priv = dev_get_priv(dev); > + struct eth_pdata *pdata = dev_get_platdata(dev); > + > + pdata->iobase = devfdt_get_addr(dev); > + priv->iobase = pdata->iobase; > + > + return 0; > +} > + > +static const struct eth_ops smc911x_ops = { > + .start = smc911x_start, > + .send = smc911x_send, > + .recv = smc911x_recv, > + .stop = smc911x_stop, > +}; > + > +static const struct udevice_id smc911x_ids[] = { > + { .compatible = "smsc,lan9115" }, > + { } > +}; > + > +U_BOOT_DRIVER(smc911x) = { > + .name = "eth_smc911x", > + .id = UCLASS_ETH, > + .of_match = smc911x_ids, > + .bind = smc911x_bind, > + .ofdata_to_platdata = smc911x_ofdata_to_platdata, > + .probe = smc911x_probe, > + .ops = &smc911x_ops, > + .priv_auto_alloc_size = sizeof(struct smc911x_priv), > + .platdata_auto_alloc_size = sizeof(struct eth_pdata), > + .flags = DM_FLAG_ALLOC_PRIV_DMA, > +}; > +#endif > diff --git a/examples/standalone/Makefile b/examples/standalone/Makefile > index 0b17a91804..6b061bac69 100644 > --- a/examples/standalone/Makefile > +++ b/examples/standalone/Makefile > @@ -5,10 +5,13 @@ > > extra-y := hello_world > extra-$(CONFIG_SMC91111) += smc91111_eeprom > -extra-$(CONFIG_SMC911X) += smc911x_eeprom > extra-$(CONFIG_SPI_FLASH_ATMEL) += atmel_df_pow2 > extra-$(CONFIG_PPC) += sched > > +ifndef CONFIG_DM_ETH > +extra-$(CONFIG_SMC911X) += smc911x_eeprom > +endif > + > # > # Some versions of make do not handle trailing white spaces properly; > # leading to build failures. The problem was found with GNU Make 3.80. > -- > 2.25.0 > diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 4d1013c98466..dcda139156f0 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -390,6 +390,7 @@ if SMC911X config SMC911X_BASE hex "SMC911X Base Address" + depends on !DM_ETH help Define this to hold the physical address of the device (I/O space)