[PATCH u-boot-net 03/14] net: introduce helpers to get PHY ofnode from MAC
Ramon Fried
rfried.dev at gmail.com
Fri Mar 18 09:02:53 CET 2022
On Thu, Mar 17, 2022 at 2:50 PM Marek Behún <kabel at kernel.org> wrote:
>
> From: Marek Behún <marek.behun at nic.cz>
>
> Add helpers ofnode_get_phy_node() and dev_get_phy_node() and use it in
> net/mdio-uclass.c function dm_eth_connect_phy_handle().
>
> This is useful because other part's of U-Boot may want to get PHY ofnode
> without connecting a PHY.
>
> Signed-off-by: Marek Behún <marek.behun at nic.cz>
> ---
> drivers/core/ofnode.c | 21 +++++++++++++++++++++
> drivers/core/read.c | 5 +++++
> include/dm/ofnode.h | 14 ++++++++++++++
> include/dm/read.h | 19 +++++++++++++++++++
> net/mdio-uclass.c | 24 ++++++------------------
> 5 files changed, 65 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c
> index 709bea272a..eaad2c989b 100644
> --- a/drivers/core/ofnode.c
> +++ b/drivers/core/ofnode.c
> @@ -1162,3 +1162,24 @@ const char *ofnode_conf_read_str(const char *prop_name)
>
> return ofnode_read_string(node, prop_name);
> }
> +
> +ofnode ofnode_get_phy_node(ofnode node)
> +{
> + /* DT node properties that reference a PHY node */
> + static const char * const phy_handle_str[] = {
> + "phy-handle", "phy", "phy-device",
> + };
> + struct ofnode_phandle_args args = {
> + .node = ofnode_null()
> + };
> + int i;
> +
> + assert(ofnode_valid(node));
> +
> + for (i = 0; i < ARRAY_SIZE(phy_handle_str); i++)
> + if (!ofnode_parse_phandle_with_args(node, phy_handle_str[i],
> + NULL, 0, 0, &args))
> + break;
> +
> + return args.node;
> +}
> diff --git a/drivers/core/read.c b/drivers/core/read.c
> index 31f9e78a06..7ff100218d 100644
> --- a/drivers/core/read.c
> +++ b/drivers/core/read.c
> @@ -398,3 +398,8 @@ int dev_decode_display_timing(const struct udevice *dev, int index,
> {
> return ofnode_decode_display_timing(dev_ofnode(dev), index, config);
> }
> +
> +ofnode dev_get_phy_node(const struct udevice *dev)
> +{
> + return ofnode_get_phy_node(dev_ofnode(dev));
> +}
> diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h
> index 0cb324c8b0..8164386043 100644
> --- a/include/dm/ofnode.h
> +++ b/include/dm/ofnode.h
> @@ -1204,4 +1204,18 @@ int ofnode_conf_read_int(const char *prop_name, int default_val);
> */
> const char *ofnode_conf_read_str(const char *prop_name);
>
> +/**
> + * ofnode_get_phy_node() - Get PHY node for a MAC (if not fixed-link)
> + *
> + * This function parses PHY handle from the Ethernet controller's ofnode
> + * (trying all possible PHY handle property names), and returns the PHY ofnode.
> + *
> + * Before this is used, ofnode_phy_is_fixed_link() should be checked first, and
> + * if the result to that is true, this function should not be called.
> + *
> + * @eth_node: ofnode belonging to the Ethernet controller
> + * Return: ofnode of the PHY, if it exists, otherwise an invalid ofnode
> + */
> +ofnode ofnode_get_phy_node(ofnode eth_node);
> +
> #endif
> diff --git a/include/dm/read.h b/include/dm/read.h
> index 233af3c063..899eb813fd 100644
> --- a/include/dm/read.h
> +++ b/include/dm/read.h
> @@ -743,6 +743,20 @@ int dev_read_pci_bus_range(const struct udevice *dev, struct resource *res);
> int dev_decode_display_timing(const struct udevice *dev, int index,
> struct display_timing *config);
>
> +/**
> + * dev_get_phy_node() - Get PHY node for a MAC (if not fixed-link)
> + *
> + * This function parses PHY handle from the Ethernet controller's ofnode
> + * (trying all possible PHY handle property names), and returns the PHY ofnode.
> + *
> + * Before this is used, ofnode_phy_is_fixed_link() should be checked first, and
> + * if the result to that is true, this function should not be called.
> + *
> + * @dev: device representing the MAC
> + * Return: ofnode of the PHY, if it exists, otherwise an invalid ofnode
> + */
> +ofnode dev_get_phy_node(const struct udevice *dev);
> +
> #else /* CONFIG_DM_DEV_READ_INLINE is enabled */
> #include <asm/global_data.h>
>
> @@ -1092,6 +1106,11 @@ static inline int dev_decode_display_timing(const struct udevice *dev,
> return ofnode_decode_display_timing(dev_ofnode(dev), index, config);
> }
>
> +static inline ofnode dev_get_phy_node(const struct udevice *dev)
> +{
> + return ofnode_get_phy_node(dev_ofnode(dev));
> +}
> +
> #endif /* CONFIG_DM_DEV_READ_INLINE */
>
> /**
> diff --git a/net/mdio-uclass.c b/net/mdio-uclass.c
> index 649dc60f73..233b70171b 100644
> --- a/net/mdio-uclass.c
> +++ b/net/mdio-uclass.c
> @@ -20,11 +20,6 @@ static const char * const phy_mode_str[] = {
> "phy-mode", "phy-connection-type"
> };
>
> -/* DT node properties that reference a PHY node */
> -static const char * const phy_handle_str[] = {
> - "phy-handle", "phy", "phy-device"
> -};
> -
> void dm_mdio_probe_devices(void)
> {
> struct udevice *it;
> @@ -137,23 +132,16 @@ static struct phy_device *dm_eth_connect_phy_handle(struct udevice *ethdev,
> u32 phy_addr;
> struct udevice *mdiodev;
> struct phy_device *phy;
> - struct ofnode_phandle_args phandle = {.node = ofnode_null()};
> ofnode phynode;
> - int i;
>
> if (CONFIG_IS_ENABLED(PHY_FIXED) &&
> ofnode_phy_is_fixed_link(dev_ofnode(ethdev), &phynode)) {
> phy = phy_connect(NULL, 0, ethdev, interface);
> - phandle.node = phynode;
> goto out;
> }
>
> - for (i = 0; i < ARRAY_SIZE(phy_handle_str); i++)
> - if (!dev_read_phandle_with_args(ethdev, phy_handle_str[i], NULL,
> - 0, 0, &phandle))
> - break;
> -
> - if (!ofnode_valid(phandle.node)) {
> + phynode = dev_get_phy_node(ethdev);
> + if (!ofnode_valid(phynode)) {
> dev_dbg(ethdev, "can't find PHY node\n");
> return NULL;
> }
> @@ -162,16 +150,16 @@ static struct phy_device *dm_eth_connect_phy_handle(struct udevice *ethdev,
> * reading 'reg' directly should be fine. This is a PHY node, the
> * address is always size 1 and requires no translation
> */
> - if (ofnode_read_u32(phandle.node, "reg", &phy_addr)) {
> + if (ofnode_read_u32(phynode, "reg", &phy_addr)) {
> dev_dbg(ethdev, "missing reg property in phy node\n");
> return NULL;
> }
>
> if (uclass_get_device_by_ofnode(UCLASS_MDIO,
> - ofnode_get_parent(phandle.node),
> + ofnode_get_parent(phynode),
> &mdiodev)) {
> dev_dbg(ethdev, "can't find MDIO bus for node %s\n",
> - ofnode_get_name(ofnode_get_parent(phandle.node)));
> + ofnode_get_name(ofnode_get_parent(phynode)));
> return NULL;
> }
>
> @@ -179,7 +167,7 @@ static struct phy_device *dm_eth_connect_phy_handle(struct udevice *ethdev,
>
> out:
> if (phy)
> - phy->node = phandle.node;
> + phy->node = phynode;
>
> return phy;
> }
> --
> 2.34.1
>
Reviewed-by: Ramon Fried <rfried.dev at gmail.com>
More information about the U-Boot
mailing list