[PATCH 1/2] net: designware: eqos: reset phy
From: Sascha Hauer <s.hauer@pengutronix.de>
Date: 2021-06-07 14:13:03
Subsystem:
networking drivers, open firmware and flattened device tree, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Saravana Kannan, Linus Torvalds
The designware eqos DT binding has support for specifying reset GPIOs. Add support for them. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- drivers/net/designware_eqos.c | 33 +++++++++++++++++++++++++++++++++ drivers/of/of_gpio.c | 7 +++++++ 2 files changed, 40 insertions(+)
diff --git a/drivers/net/designware_eqos.c b/drivers/net/designware_eqos.c
index d2baaeaf63..0321024169 100644
--- a/drivers/net/designware_eqos.c
+++ b/drivers/net/designware_eqos.c@@ -8,9 +8,11 @@ #include <common.h> #include <init.h> +#include <gpio.h> #include <dma.h> #include <net.h> #include <of_net.h> +#include <of_gpio.h> #include <linux/iopoll.h> #include <linux/time.h> #include <linux/sizes.h>
@@ -189,6 +191,33 @@ struct eqos_desc { #define MII_BUSY (1 << 0) +static int eqos_phy_reset(struct device_d *dev, struct eqos *eqos) +{ + int phy_reset; + int ret; + u32 delays[3] = { 0, 0, 0 }; + + phy_reset = of_get_named_gpio(dev->device_node, "snps,reset-gpio", 0); + + if (!gpio_is_valid(phy_reset)) + return 0; + + ret = gpio_request(phy_reset, "phy-reset"); + if (ret) + return ret; + + of_property_read_u32_array(dev->device_node, + "snps,reset-delays-us", + delays, ARRAY_SIZE(delays)); + + gpio_direction_active(phy_reset, 0); + udelay(delays[1]); + gpio_set_active(phy_reset, 1); + udelay(delays[2]); + + return 0; +} + static int eqos_mdio_wait_idle(struct eqos *eqos) { u32 idle;
@@ -843,6 +872,10 @@ int eqos_probe(struct device_d *dev, const struct eqos_ops *ops, void *priv) if (ret) return ret; + ret = eqos_phy_reset(dev, eqos); + if (ret) + return ret; + ret = mdiobus_register(miibus); if (ret) return ret;
diff --git a/drivers/of/of_gpio.c b/drivers/of/of_gpio.c
index 7cbeeaf69e..e1cafdc848 100644
--- a/drivers/of/of_gpio.c
+++ b/drivers/of/of_gpio.c@@ -35,6 +35,13 @@ static void of_gpio_flags_quirks(struct device_node *np, if (active_low) *flags |= OF_GPIO_ACTIVE_LOW; } + + /* Legacy handling of stmmac's active-low PHY reset line */ + if (IS_ENABLED(CONFIG_DRIVER_NET_DESIGNWARE_EQOS) && + !strcmp(propname, "snps,reset-gpio") && + of_property_read_bool(np, "snps,reset-active-low")) + *flags |= OF_GPIO_ACTIVE_LOW; + } /**
--
2.29.2
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox