diff mbox series

[09/14] net: phy: Bind ETH_PHY uclass driver to each new PHY

Message ID 20230530225131.949721-9-marek.vasut+renesas@mailbox.org
State Accepted
Commit 68a4d15061097ef4938b8e4f93af15286aac81ec
Delegated to: Ramon Fried
Headers show
Series [01/14] net: eth-phy: staticize eth_phy_reset() | expand

Commit Message

Marek Vasut May 30, 2023, 10:51 p.m. UTC
In case a new PHY is created and DM_ETH_PHY is enabled, bind a
generic PHY driver from ETH_PHY uclass to the PHY to have a
matching DM representation of that PHY.

Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
---
Cc: Geert Uytterhoeven <geert+renesas@glider.be>
Cc: Joe Hershberger <joe.hershberger@ni.com>
Cc: Michal Simek <michal.simek@amd.com>
Cc: Nishanth Menon <nm@ti.com>
Cc: Ramon Fried <rfried.dev@gmail.com>
---
 drivers/net/phy/ethernet_id.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

Comments

Ramon Fried June 10, 2023, 11 a.m. UTC | #1
On Wed, May 31, 2023 at 1:51 AM Marek Vasut
<marek.vasut+renesas@mailbox.org> wrote:
>
> In case a new PHY is created and DM_ETH_PHY is enabled, bind a
> generic PHY driver from ETH_PHY uclass to the PHY to have a
> matching DM representation of that PHY.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
> ---
> Cc: Geert Uytterhoeven <geert+renesas@glider.be>
> Cc: Joe Hershberger <joe.hershberger@ni.com>
> Cc: Michal Simek <michal.simek@amd.com>
> Cc: Nishanth Menon <nm@ti.com>
> Cc: Ramon Fried <rfried.dev@gmail.com>
> ---
>  drivers/net/phy/ethernet_id.c | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>
> diff --git a/drivers/net/phy/ethernet_id.c b/drivers/net/phy/ethernet_id.c
> index a715e83db98..877a51c3d00 100644
> --- a/drivers/net/phy/ethernet_id.c
> +++ b/drivers/net/phy/ethernet_id.c
> @@ -7,6 +7,8 @@
>
>  #include <common.h>
>  #include <dm/device_compat.h>
> +#include <dm/device-internal.h>
> +#include <dm/lists.h>
>  #include <phy.h>
>  #include <linux/delay.h>
>  #include <asm/gpio.h>
> @@ -17,6 +19,8 @@ struct phy_device *phy_connect_phy_id(struct mii_dev *bus, struct udevice *dev,
>         struct phy_device *phydev;
>         struct ofnode_phandle_args phandle_args;
>         struct gpio_desc gpio;
> +       const char *node_name;
> +       struct udevice *pdev;
>         ofnode node;
>         u32 id, assert, deassert;
>         u16 vendor, device;
> @@ -72,5 +76,18 @@ struct phy_device *phy_connect_phy_id(struct mii_dev *bus, struct udevice *dev,
>         if (phydev)
>                 phydev->node = node;
>
> +       if (IS_ENABLED(CONFIG_DM_ETH_PHY) && ofnode_valid(node)) {
> +               node_name = ofnode_get_name(node);
> +               ret = device_bind_driver_to_node(dev, "eth_phy_generic_drv",
> +                                                node_name, node,
> +                                                &pdev);
> +               if (ret)
> +                       return NULL;
> +
> +               ret = device_probe(pdev);
> +               if (ret)
> +                       return NULL;
> +       }
> +
>         return phydev;
>  }
> --
> 2.39.2
>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
diff mbox series

Patch

diff --git a/drivers/net/phy/ethernet_id.c b/drivers/net/phy/ethernet_id.c
index a715e83db98..877a51c3d00 100644
--- a/drivers/net/phy/ethernet_id.c
+++ b/drivers/net/phy/ethernet_id.c
@@ -7,6 +7,8 @@ 
 
 #include <common.h>
 #include <dm/device_compat.h>
+#include <dm/device-internal.h>
+#include <dm/lists.h>
 #include <phy.h>
 #include <linux/delay.h>
 #include <asm/gpio.h>
@@ -17,6 +19,8 @@  struct phy_device *phy_connect_phy_id(struct mii_dev *bus, struct udevice *dev,
 	struct phy_device *phydev;
 	struct ofnode_phandle_args phandle_args;
 	struct gpio_desc gpio;
+	const char *node_name;
+	struct udevice *pdev;
 	ofnode node;
 	u32 id, assert, deassert;
 	u16 vendor, device;
@@ -72,5 +76,18 @@  struct phy_device *phy_connect_phy_id(struct mii_dev *bus, struct udevice *dev,
 	if (phydev)
 		phydev->node = node;
 
+	if (IS_ENABLED(CONFIG_DM_ETH_PHY) && ofnode_valid(node)) {
+		node_name = ofnode_get_name(node);
+		ret = device_bind_driver_to_node(dev, "eth_phy_generic_drv",
+						 node_name, node,
+						 &pdev);
+		if (ret)
+			return NULL;
+
+		ret = device_probe(pdev);
+		if (ret)
+			return NULL;
+	}
+
 	return phydev;
 }