[PATCH RFC 1/2] net: eth-phy-uclass: allow flexible mii to eth bindings
Tim Harvey
tharvey at gateworks.com
Fri Nov 13 19:25:54 CET 2020
commit 5fe419ef2a61 ("net: Add eth phy generic driver for shared MDIO")
added a UCLASS_ETH_PHY for Ethernet PHY devices to aid in connecting eth
devices to mii bus drivers. However the binding was only allowed for a phy
that was a child of the ethernet device which is fairly restrictive.
For a device such as an Ethernet switch the phy can be from a different bus
and driver such as an I2C or SPI register controlled device.
Remove the restiction of the phy being a child of the eth device.
Additionally add some debugging, remove some unnecessary prints on
successes, and remove FEC from a failure print.
Cc: Ye Li <ye.li at nxp.com>
Cc: Peng Fan <peng.fan at nxp.com>
Signed-off-by: Tim Harvey <tharvey at gateworks.com>
---
drivers/net/eth-phy-uclass.c | 41 ++++++++++++++++++-----------------------
1 file changed, 18 insertions(+), 23 deletions(-)
diff --git a/drivers/net/eth-phy-uclass.c b/drivers/net/eth-phy-uclass.c
index b383f45..fb1b92b 100644
--- a/drivers/net/eth-phy-uclass.c
+++ b/drivers/net/eth-phy-uclass.c
@@ -6,6 +6,7 @@
#include <common.h>
#include <dm.h>
#include <net.h>
+#include <phy.h>
#include <dm/device-internal.h>
#include <dm/uclass-internal.h>
#include <dm/lists.h>
@@ -51,13 +52,12 @@ int eth_phy_set_mdio_bus(struct udevice *eth_dev, struct mii_dev *mdio_bus)
struct udevice *dev;
struct eth_phy_device_priv *uc_priv;
- for (uclass_first_device(UCLASS_ETH_PHY, &dev); dev;
- uclass_next_device(&dev)) {
- if (dev->parent == eth_dev) {
- uc_priv = (struct eth_phy_device_priv *)(dev->uclass_priv);
-
- if (!uc_priv->mdio_bus)
- uc_priv->mdio_bus = mdio_bus;
+ debug("%s eth_dev:%s mdio_bus:%s\n", __func__, eth_dev->name, mdio_bus->name);
+ for (uclass_first_device(UCLASS_ETH_PHY, &dev); dev; uclass_next_device(&dev)) {
+ uc_priv = (struct eth_phy_device_priv *)(dev->uclass_priv);
+ if (!uc_priv->mdio_bus) {
+ debug("%s setting to bus=%p:%s\n", __func__, mdio_bus, mdio_bus->name);
+ uc_priv->mdio_bus = mdio_bus;
}
}
@@ -70,25 +70,20 @@ struct mii_dev *eth_phy_get_mdio_bus(struct udevice *eth_dev)
struct udevice *phy_dev;
struct eth_phy_device_priv *uc_priv;
+ debug("%s eth_dev:%s\n", __func__, eth_dev->name);
/* Will probe the parent of phy device, then phy device */
- ret = uclass_get_device_by_phandle(UCLASS_ETH_PHY, eth_dev,
- "phy-handle", &phy_dev);
+ ret = uclass_get_device_by_phandle(UCLASS_ETH_PHY, eth_dev, "phy-handle", &phy_dev);
if (!ret) {
- if (eth_dev != phy_dev->parent) {
- /*
- * phy_dev is shared and controlled by
- * other eth controller
- */
- uc_priv = (struct eth_phy_device_priv *)(phy_dev->uclass_priv);
- if (uc_priv->mdio_bus)
- printf("Get shared mii bus on %s\n", eth_dev->name);
- else
- printf("Can't get shared mii bus on %s\n", eth_dev->name);
-
- return uc_priv->mdio_bus;
- }
+ debug("%s phy_dev:%s\n", __func__, phy_dev->name);
+ uc_priv = (struct eth_phy_device_priv *)(phy_dev->uclass_priv);
+ if (uc_priv->mdio_bus)
+ debug("%s got mii bus for %s: %s\n", __func__,
+ eth_dev->name, uc_priv->mdio_bus->name);
+ else
+ printf("no mii bus for %s\n", phy_dev->name);
+ return uc_priv->mdio_bus;
} else {
- printf("FEC: can't find phy-handle\n");
+ printf("can't find phy-handle\n");
}
return NULL;
--
2.7.4
More information about the U-Boot
mailing list