[PATCH v2] net: designware: Add bitbang feature for designware driver

Add bb_miiphy_bus function for designware bitbang feature.
Signed-off-by: Jim Liu JJLIU0@nuvoton.com --- Changes for v2: - add bitbang delay dts read - modify printf to debug --- drivers/net/designware.c | 105 +++++++++++++++++++++++++++++++++++++++ drivers/net/designware.h | 5 ++ 2 files changed, 110 insertions(+)
diff --git a/drivers/net/designware.c b/drivers/net/designware.c index a174344b3e..e86f96fc1a 100644 --- a/drivers/net/designware.c +++ b/drivers/net/designware.c @@ -767,6 +767,31 @@ int designware_eth_probe(struct udevice *dev) priv->bus = miiphy_get_dev_by_name(dev->name); priv->dev = dev;
+#if defined(CONFIG_BITBANGMII) && CONFIG_IS_ENABLED(DM_GPIO) + if (dev_read_bool(dev, "snps,bitbang-mii")) { + debug("\n%s: use bitbang mii..\n", dev->name); + ret = gpio_request_by_name(dev, "snps,mdc-gpio", 0, + &priv->mdc_gpio, GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE); + if (ret) { + printf("no mdc-gpio\n"); + return ret; + } + ret = gpio_request_by_name(dev, "snps,mdio-gpio", 0, + &priv->mdio_gpio, GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE); + if (ret) { + printf("no mdio-gpio\n"); + return ret; + } + + priv->bb_delay = dev_read_u32_default(dev, "snps,bitbang-delay", 1); + + bb_miiphy_buses[0].priv = priv; + sprintf(bb_miiphy_buses[0].name, dev->name); + priv->bus->read = bb_miiphy_read; + priv->bus->write = bb_miiphy_write; + } +#endif + ret = dw_phy_init(priv, dev); debug("%s, ret=%d\n", __func__, ret); if (!ret) @@ -876,3 +901,83 @@ static struct pci_device_id supported[] = { };
U_BOOT_PCI_DEVICE(eth_designware, supported); + +#if CONFIG_IS_ENABLED(BITBANGMII) && CONFIG_IS_ENABLED(DM_GPIO) +static int dw_eth_bb_mdio_active(struct bb_miiphy_bus *bus) +{ + struct dw_eth_dev *priv = bus->priv; + struct gpio_desc *desc = &priv->mdio_gpio; + + desc->flags = 0; + dm_gpio_set_dir_flags(&priv->mdio_gpio, GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE); + + return 0; +} + +static int dw_eth_bb_mdio_tristate(struct bb_miiphy_bus *bus) +{ + struct dw_eth_dev *priv = bus->priv; + struct gpio_desc *desc = &priv->mdio_gpio; + + desc->flags = 0; + dm_gpio_set_dir_flags(&priv->mdio_gpio, GPIOD_IS_IN); + + return 0; +} + +static int dw_eth_bb_set_mdio(struct bb_miiphy_bus *bus, int v) +{ + struct dw_eth_dev *priv = bus->priv; + + if (v) + dm_gpio_set_value(&priv->mdio_gpio, 1); + else + dm_gpio_set_value(&priv->mdio_gpio, 0); + + return 0; +} + +static int dw_eth_bb_get_mdio(struct bb_miiphy_bus *bus, int *v) +{ + struct dw_eth_dev *priv = bus->priv; + + *v = dm_gpio_get_value(&priv->mdio_gpio); + + return 0; +} + +static int dw_eth_bb_set_mdc(struct bb_miiphy_bus *bus, int v) +{ + struct dw_eth_dev *priv = bus->priv; + + if (v) + dm_gpio_set_value(&priv->mdc_gpio, 1); + else + dm_gpio_set_value(&priv->mdc_gpio, 0); + + return 0; +} + +static int dw_eth_bb_delay(struct bb_miiphy_bus *bus) +{ + struct dw_eth_dev *priv = bus->priv; + printf("jim[%d]\n",priv->bb_delay); + udelay(priv->bb_delay); + + return 0; +} + +struct bb_miiphy_bus bb_miiphy_buses[] = { + { + .name = "bb_miiphy", + .mdio_active = dw_eth_bb_mdio_active, + .mdio_tristate = dw_eth_bb_mdio_tristate, + .set_mdio = dw_eth_bb_set_mdio, + .get_mdio = dw_eth_bb_get_mdio, + .set_mdc = dw_eth_bb_set_mdc, + .delay = dw_eth_bb_delay, + } +}; + +int bb_miiphy_buses_num = ARRAY_SIZE(bb_miiphy_buses); +#endif diff --git a/drivers/net/designware.h b/drivers/net/designware.h index 918a38615a..cf8de35cfe 100644 --- a/drivers/net/designware.h +++ b/drivers/net/designware.h @@ -230,11 +230,16 @@ struct dw_eth_dev { u32 max_speed; u32 tx_currdescnum; u32 rx_currdescnum; +#if defined(CONFIG_BITBANGMII) + u32 bb_delay; +#endif
struct eth_mac_regs *mac_regs_p; struct eth_dma_regs *dma_regs_p; #if CONFIG_IS_ENABLED(DM_GPIO) struct gpio_desc reset_gpio; + struct gpio_desc mdc_gpio; + struct gpio_desc mdio_gpio; #endif #ifdef CONFIG_CLK struct clk *clocks; /* clock list */

On Fri, Nov 17, 2023 at 10:04:53AM +0800, Jim Liu wrote:
Add bb_miiphy_bus function for designware bitbang feature.
Signed-off-by: Jim Liu JJLIU0@nuvoton.com
Changes for v2:
- add bitbang delay dts read
- modify printf to debug
drivers/net/designware.c | 105 +++++++++++++++++++++++++++++++++++++++ drivers/net/designware.h | 5 ++ 2 files changed, 110 insertions(+)
diff --git a/drivers/net/designware.c b/drivers/net/designware.c index a174344b3e..e86f96fc1a 100644 --- a/drivers/net/designware.c +++ b/drivers/net/designware.c @@ -767,6 +767,31 @@ int designware_eth_probe(struct udevice *dev) priv->bus = miiphy_get_dev_by_name(dev->name); priv->dev = dev;
+#if defined(CONFIG_BITBANGMII) && CONFIG_IS_ENABLED(DM_GPIO)
- if (dev_read_bool(dev, "snps,bitbang-mii")) {
debug("\n%s: use bitbang mii..\n", dev->name);
ret = gpio_request_by_name(dev, "snps,mdc-gpio", 0,
&priv->mdc_gpio, GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
if (ret) {
printf("no mdc-gpio\n");
return ret;
}
ret = gpio_request_by_name(dev, "snps,mdio-gpio", 0,
&priv->mdio_gpio, GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
if (ret) {
printf("no mdio-gpio\n");
return ret;
}
priv->bb_delay = dev_read_u32_default(dev, "snps,bitbang-delay", 1);
bb_miiphy_buses[0].priv = priv;
sprintf(bb_miiphy_buses[0].name, dev->name);
If designware_eth_probe() is called for multiple Ethernet interfaces then only the last interface to be probed will have a working MDIO bus.
We should either support multiple buses here or raise an error if there is an attempt to probe a second interface.
(I spotted the same issue in the ravb driver while extending it to support a board with two Ethernet interfaces)
Thanks, Paul
participants (2)
-
Jim Liu
-
Paul Barker