All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ramon Fried <rfried.dev@gmail.com>
To: "Marek Behún" <kabel@kernel.org>
Cc: "Joe Hershberger" <joe.hershberger@ni.com>,
	"U-Boot Mailing List" <u-boot@lists.denx.de>,
	"Marek Behún" <marek.behun@nic.cz>,
	"Bin Meng" <bmeng.cn@gmail.com>,
	"Chunfeng Yun" <chunfeng.yun@mediatek.com>,
	GSS_MTK_Uboot_upstream <GSS_MTK_Uboot_upstream@mediatek.com>,
	"Hou Zhiqiang" <Zhiqiang.Hou@nxp.com>,
	"Jassi Brar" <jaswinder.singh@linaro.org>,
	"Masami Hiramatsu" <masami.hiramatsu@linaro.org>,
	"Michal Simek" <michal.simek@xilinx.com>,
	"Patrice Chotard" <patrice.chotard@foss.st.com>,
	"Patrick Delaunay" <patrick.delaunay@foss.st.com>,
	"Priyanka Jain" <priyanka.jain@nxp.com>,
	"Radu Pirea (NXP OSS)" <radu-nicolae.pirea@oss.nxp.com>,
	"Ryder Lee" <ryder.lee@mediatek.com>,
	"Simon Glass" <sjg@chromium.org>,
	"U-Boot STM32" <uboot-stm32@st-md-mailman.stormreply.com>,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	"Vikas Manocha" <vikas.manocha@st.com>,
	"Vladimir Oltean" <vladimir.oltean@nxp.com>,
	"Weijie Gao" <weijie.gao@mediatek.com>,
	"Wolfgang Denk" <wd@denx.de>
Subject: Re: [PATCH u-boot-net 07/14] net: introduce helpers to get PHY interface mode from a device/ofnode
Date: Fri, 18 Mar 2022 10:07:08 +0200	[thread overview]
Message-ID: <CAGi-RUKT+QNTaoiGwLbRRQwzdPuNWWtgKaYNV4pKLdxXU48ivQ@mail.gmail.com> (raw)
In-Reply-To: <20220317124958.27921-8-kabel@kernel.org>

On Thu, Mar 17, 2022 at 2:50 PM Marek Behún <kabel@kernel.org> wrote:
>
> From: Marek Behún <marek.behun@nic.cz>
>
> Add helpers ofnode_read_phy_mode() and dev_read_phy_mode() to parse the
> "phy-mode" / "phy-connection-type" property.
>
> Use them treewide.
>
> This allows us to inline the phy_get_interface_by_name() into
> ofnode_read_phy_mode(), since the former is not used anymore.
>
> Signed-off-by: Marek Behún <marek.behun@nic.cz>
> ---
>  board/st/stm32f746-disco/stm32f746-disco.c | 13 +++-----
>  drivers/core/ofnode.c                      | 23 ++++++++++++++
>  drivers/core/read.c                        |  5 +++
>  drivers/net/ag7xxx.c                       |  9 ++----
>  drivers/net/altera_tse.c                   | 13 ++------
>  drivers/net/bcm6348-eth.c                  |  6 +---
>  drivers/net/bcmgenet.c                     | 10 ++----
>  drivers/net/designware.c                   | 10 ++----
>  drivers/net/dwc_eth_qos.c                  | 36 +++-------------------
>  drivers/net/fec_mxc.c                      | 11 ++-----
>  drivers/net/fm/eth.c                       | 13 +-------
>  drivers/net/fsl_enetc.c                    | 13 +++-----
>  drivers/net/ftgmac100.c                    | 11 ++-----
>  drivers/net/higmacv300.c                   |  9 ++----
>  drivers/net/ldpaa_eth/ldpaa_eth.c          | 28 +++--------------
>  drivers/net/macb.c                         | 10 ++----
>  drivers/net/mt7620-eth.c                   | 35 +++++++--------------
>  drivers/net/mtk_eth.c                      |  8 ++---
>  drivers/net/mvgbe.c                        |  7 ++---
>  drivers/net/mvneta.c                       | 11 ++-----
>  drivers/net/mvpp2.c                        |  9 ++----
>  drivers/net/phy/phy.c                      | 25 ++-------------
>  drivers/net/pic32_eth.c                    | 11 ++-----
>  drivers/net/qe/dm_qe_uec.c                 | 11 ++-----
>  drivers/net/ravb.c                         | 15 +++------
>  drivers/net/sh_eth.c                       | 15 +++------
>  drivers/net/sni_ave.c                      | 12 ++------
>  drivers/net/sni_netsec.c                   | 10 ++----
>  drivers/net/sun8i_emac.c                   | 11 ++-----
>  drivers/net/ti/am65-cpsw-nuss.c            | 15 +++------
>  drivers/net/ti/cpsw.c                      | 10 ++----
>  drivers/net/ti/keystone_net.c              | 24 +++++++--------
>  drivers/net/tsec.c                         |  9 ++----
>  drivers/net/xilinx_axi_emac.c              | 10 ++----
>  drivers/net/zynq_gem.c                     |  9 ++----
>  include/dm/ofnode.h                        | 13 ++++++++
>  include/dm/read.h                          | 17 ++++++++++
>  include/phy.h                              |  8 -----
>  net/mdio-uclass.c                          | 18 +----------
>  39 files changed, 161 insertions(+), 372 deletions(-)
>
> diff --git a/board/st/stm32f746-disco/stm32f746-disco.c b/board/st/stm32f746-disco/stm32f746-disco.c
> index 95d83e73ee..69f657c54b 100644
> --- a/board/st/stm32f746-disco/stm32f746-disco.c
> +++ b/board/st/stm32f746-disco/stm32f746-disco.c
> @@ -117,16 +117,13 @@ int board_late_init(void)
>  int board_init(void)
>  {
>  #ifdef CONFIG_ETH_DESIGNWARE
> -       const char *phy_mode;
> -       int node;
> +       ofnode node;
>
> -       node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, "st,stm32-dwmac");
> -       if (node < 0)
> +       node = ofnode_by_compatible(ofnode_null(), "st,stm32-dwmac");
> +       if (!ofnode_valid(node))
>                 return -1;
>
> -       phy_mode = fdt_getprop(gd->fdt_blob, node, "phy-mode", NULL);
> -
> -       switch (phy_get_interface_by_name(phy_mode)) {
> +       switch (ofnode_read_phy_mode(node)) {
>         case PHY_INTERFACE_MODE_RMII:
>                 STM32_SYSCFG->pmc |= SYSCFG_PMC_MII_RMII_SEL;
>                 break;
> @@ -134,7 +131,7 @@ int board_init(void)
>                 STM32_SYSCFG->pmc &= ~SYSCFG_PMC_MII_RMII_SEL;
>                 break;
>         default:
> -               printf("PHY interface %s not supported !\n", phy_mode);
> +               printf("Unsupported PHY interface!\n");
>         }
>  #endif
>
> diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c
> index eaad2c989b..191ab63a5d 100644
> --- a/drivers/core/ofnode.c
> +++ b/drivers/core/ofnode.c
> @@ -1183,3 +1183,26 @@ ofnode ofnode_get_phy_node(ofnode node)
>
>         return args.node;
>  }
> +
> +phy_interface_t ofnode_read_phy_mode(ofnode node)
> +{
> +       const char *mode;
> +       int i;
> +
> +       assert(ofnode_valid(node));
> +
> +       mode = ofnode_read_string(node, "phy-mode");
> +       if (!mode)
> +               mode = ofnode_read_string(node, "phy-connection-type");
> +
> +       if (!mode)
> +               return PHY_INTERFACE_MODE_NONE;
> +
> +       for (i = 0; i < PHY_INTERFACE_MODE_COUNT; i++)
> +               if (!strcmp(mode, phy_interface_strings[i]))
> +                       return i;
> +
> +       debug("%s: Invalid PHY interface '%s'\n", __func__, mode);
> +
> +       return PHY_INTERFACE_MODE_NONE;
> +}
> diff --git a/drivers/core/read.c b/drivers/core/read.c
> index 7ff100218d..c73508d276 100644
> --- a/drivers/core/read.c
> +++ b/drivers/core/read.c
> @@ -403,3 +403,8 @@ ofnode dev_get_phy_node(const struct udevice *dev)
>  {
>         return ofnode_get_phy_node(dev_ofnode(dev));
>  }
> +
> +phy_interface_t dev_read_phy_mode(const struct udevice *dev)
> +{
> +       return ofnode_read_phy_mode(dev_ofnode(dev));
> +}
> diff --git a/drivers/net/ag7xxx.c b/drivers/net/ag7xxx.c
> index 632ab3c1e5..f24a917bd4 100644
> --- a/drivers/net/ag7xxx.c
> +++ b/drivers/net/ag7xxx.c
> @@ -1254,7 +1254,6 @@ static const struct eth_ops ag7xxx_eth_ops = {
>  static int ag7xxx_eth_of_to_plat(struct udevice *dev)
>  {
>         struct eth_pdata *pdata = dev_get_plat(dev);
> -       const char *phy_mode;
>         int ret;
>
>         pdata->iobase = dev_read_addr(dev);
> @@ -1265,13 +1264,9 @@ static int ag7xxx_eth_of_to_plat(struct udevice *dev)
>         if (ret <= 0)
>                 return ret;
>
> -       phy_mode = fdt_getprop(gd->fdt_blob, ret, "phy-mode", NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         return 0;
>  }
> diff --git a/drivers/net/altera_tse.c b/drivers/net/altera_tse.c
> index eb4cd96763..25247472b0 100644
> --- a/drivers/net/altera_tse.c
> +++ b/drivers/net/altera_tse.c
> @@ -676,17 +676,10 @@ static int altera_tse_probe(struct udevice *dev)
>  static int altera_tse_of_to_plat(struct udevice *dev)
>  {
>         struct eth_pdata *pdata = dev_get_plat(dev);
> -       const char *phy_mode;
> -
> -       pdata->phy_interface = -1;
> -       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
> -                              NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         return 0;
>  }
> diff --git a/drivers/net/bcm6348-eth.c b/drivers/net/bcm6348-eth.c
> index aad7b61213..75b24136fd 100644
> --- a/drivers/net/bcm6348-eth.c
> +++ b/drivers/net/bcm6348-eth.c
> @@ -415,7 +415,6 @@ static int bcm6348_eth_probe(struct udevice *dev)
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct bcm6348_eth_priv *priv = dev_get_priv(dev);
>         struct ofnode_phandle_args phy;
> -       const char *phy_mode;
>         int ret, i;
>
>         /* get base address */
> @@ -425,10 +424,7 @@ static int bcm6348_eth_probe(struct udevice *dev)
>         pdata->iobase = (phys_addr_t) priv->base;
>
>         /* get phy mode */
> -       pdata->phy_interface = PHY_INTERFACE_MODE_NONE;
> -       phy_mode = dev_read_string(dev, "phy-mode");
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
>         if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -ENODEV;
>
> diff --git a/drivers/net/bcmgenet.c b/drivers/net/bcmgenet.c
> index 67839563db..c6acb4932b 100644
> --- a/drivers/net/bcmgenet.c
> +++ b/drivers/net/bcmgenet.c
> @@ -690,20 +690,14 @@ static int bcmgenet_eth_of_to_plat(struct udevice *dev)
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct bcmgenet_eth_priv *priv = dev_get_priv(dev);
>         struct ofnode_phandle_args phy_node;
> -       const char *phy_mode;
>         int ret;
>
>         pdata->iobase = dev_read_addr(dev);
>
>         /* Get phy mode from DT */
> -       pdata->phy_interface = -1;
> -       phy_mode = dev_read_string(dev, "phy-mode");
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
>                                          &phy_node);
> diff --git a/drivers/net/designware.c b/drivers/net/designware.c
> index 5aaac603a0..7b7b0f6578 100644
> --- a/drivers/net/designware.c
> +++ b/drivers/net/designware.c
> @@ -914,21 +914,15 @@ int designware_eth_of_to_plat(struct udevice *dev)
>         struct dw_eth_dev *priv = dev_get_priv(dev);
>  #endif
>         struct eth_pdata *pdata = &dw_pdata->eth_pdata;
> -       const char *phy_mode;
>  #if CONFIG_IS_ENABLED(DM_GPIO)
>         int reset_flags = GPIOD_IS_OUT;
>  #endif
>         int ret = 0;
>
>         pdata->iobase = dev_read_addr(dev);
> -       pdata->phy_interface = -1;
> -       phy_mode = dev_read_string(dev, "phy-mode");
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         pdata->max_speed = dev_read_u32_default(dev, "max-speed", 0);
>
> diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c
> index 22dad5b203..9777f6cb9c 100644
> --- a/drivers/net/dwc_eth_qos.c
> +++ b/drivers/net/dwc_eth_qos.c
> @@ -270,7 +270,7 @@ struct eqos_config {
>         int config_mac;
>         int config_mac_mdio;
>         unsigned int axi_bus_width;
> -       phy_interface_t (*interface)(struct udevice *dev);
> +       phy_interface_t (*interface)(const struct udevice *dev);
>         struct eqos_ops *ops;
>  };
>
> @@ -1729,21 +1729,7 @@ err_probe:
>         return ret;
>  }
>
> -static phy_interface_t eqos_get_interface_stm32(struct udevice *dev)
> -{
> -       const char *phy_mode;
> -       phy_interface_t interface = PHY_INTERFACE_MODE_NONE;
> -
> -       debug("%s(dev=%p):\n", __func__, dev);
> -
> -       phy_mode = dev_read_prop(dev, "phy-mode", NULL);
> -       if (phy_mode)
> -               interface = phy_get_interface_by_name(phy_mode);
> -
> -       return interface;
> -}
> -
> -static phy_interface_t eqos_get_interface_tegra186(struct udevice *dev)
> +static phy_interface_t eqos_get_interface_tegra186(const struct udevice *dev)
>  {
>         return PHY_INTERFACE_MODE_MII;
>  }
> @@ -1766,20 +1752,6 @@ static int eqos_probe_resources_imx(struct udevice *dev)
>         return 0;
>  }
>
> -static phy_interface_t eqos_get_interface_imx(struct udevice *dev)
> -{
> -       const char *phy_mode;
> -       phy_interface_t interface = PHY_INTERFACE_MODE_NONE;
> -
> -       debug("%s(dev=%p):\n", __func__, dev);
> -
> -       phy_mode = dev_read_prop(dev, "phy-mode", NULL);
> -       if (phy_mode)
> -               interface = phy_get_interface_by_name(phy_mode);
> -
> -       return interface;
> -}
> -
>  static int eqos_remove_resources_tegra186(struct udevice *dev)
>  {
>         struct eqos_priv *eqos = dev_get_priv(dev);
> @@ -1985,7 +1957,7 @@ static const struct eqos_config __maybe_unused eqos_stm32_config = {
>         .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_AV,
>         .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300,
>         .axi_bus_width = EQOS_AXI_WIDTH_64,
> -       .interface = eqos_get_interface_stm32,
> +       .interface = dev_read_phy_mode,
>         .ops = &eqos_stm32_ops
>  };
>
> @@ -2013,7 +1985,7 @@ struct eqos_config __maybe_unused eqos_imx_config = {
>         .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB,
>         .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300,
>         .axi_bus_width = EQOS_AXI_WIDTH_64,
> -       .interface = eqos_get_interface_imx,
> +       .interface = dev_read_phy_mode,
>         .ops = &eqos_imx_ops
>  };
>
> diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
> index 985b038447..de1d06f0f1 100644
> --- a/drivers/net/fec_mxc.c
> +++ b/drivers/net/fec_mxc.c
> @@ -1558,20 +1558,13 @@ static int fecmxc_of_to_plat(struct udevice *dev)
>         int ret = 0;
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct fec_priv *priv = dev_get_priv(dev);
> -       const char *phy_mode;
>
>         pdata->iobase = dev_read_addr(dev);
>         priv->eth = (struct ethernet_regs *)pdata->iobase;
>
> -       pdata->phy_interface = -1;
> -       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
> -                              NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>  #ifdef CONFIG_DM_REGULATOR
>         device_get_supply_regulator(dev, "phy-supply", &priv->phy_supply);
> diff --git a/drivers/net/fm/eth.c b/drivers/net/fm/eth.c
> index 5e0d0bca9b..1ffe9e2b7a 100644
> --- a/drivers/net/fm/eth.c
> +++ b/drivers/net/fm/eth.c
> @@ -954,17 +954,6 @@ int fm_eth_initialize(struct ccsr_fman *reg, struct fm_eth_info *info)
>         return 0;
>  }
>  #else /* CONFIG_DM_ETH */
> -#ifdef CONFIG_PHYLIB
> -phy_interface_t fman_read_sys_if(struct udevice *dev)
> -{
> -       const char *if_str;
> -
> -       if_str = ofnode_read_string(dev_ofnode(dev), "phy-connection-type");
> -       debug("MAC system interface mode %s\n", if_str);
> -
> -       return phy_get_interface_by_name(if_str);
> -}
> -#endif
>
>  static int fm_eth_bind(struct udevice *dev)
>  {
> @@ -1038,7 +1027,7 @@ static int fm_eth_probe(struct udevice *dev)
>         reg = (void *)(uintptr_t)dev_read_addr(dev);
>         fm_eth->mac_type = dev_get_driver_data(dev);
>  #ifdef CONFIG_PHYLIB
> -       fm_eth->enet_if = fman_read_sys_if(dev);
> +       fm_eth->enet_if = dev_read_phy_mode(dev);
>  #else
>         fm_eth->enet_if = PHY_INTERFACE_MODE_SGMII;
>         printf("%s: warning - unable to determine interface type\n", __func__);
> diff --git a/drivers/net/fsl_enetc.c b/drivers/net/fsl_enetc.c
> index 915c7c8025..8f5af1dbc0 100644
> --- a/drivers/net/fsl_enetc.c
> +++ b/drivers/net/fsl_enetc.c
> @@ -260,9 +260,6 @@ static int enetc_init_sxgmii(struct udevice *dev)
>  static void enetc_start_pcs(struct udevice *dev)
>  {
>         struct enetc_priv *priv = dev_get_priv(dev);
> -       const char *if_str;
> -
> -       priv->if_type = PHY_INTERFACE_MODE_NONE;
>
>         /* register internal MDIO for debug purposes */
>         if (enetc_read_port(priv, ENETC_PCAPR0) & ENETC_PCAPRO_MDIO) {
> @@ -279,14 +276,12 @@ static void enetc_start_pcs(struct udevice *dev)
>                 return;
>         }
>
> -       if_str = ofnode_read_string(dev_ofnode(dev), "phy-mode");
> -       if (if_str)
> -               priv->if_type = phy_get_interface_by_name(if_str);
> -       else
> +       priv->if_type = dev_read_phy_mode(dev);
> +       if (priv->if_type == PHY_INTERFACE_MODE_NONE) {
>                 enetc_dbg(dev,
>                           "phy-mode property not found, defaulting to SGMII\n");
> -       if (priv->if_type < 0)
> -               priv->if_type = PHY_INTERFACE_MODE_NONE;
> +               priv->if_type = PHY_INTERFACE_MODE_SGMII;
> +       }
>
>         switch (priv->if_type) {
>         case PHY_INTERFACE_MODE_SGMII:
> diff --git a/drivers/net/ftgmac100.c b/drivers/net/ftgmac100.c
> index aa719d295f..626c27d7bf 100644
> --- a/drivers/net/ftgmac100.c
> +++ b/drivers/net/ftgmac100.c
> @@ -549,17 +549,12 @@ static int ftgmac100_of_to_plat(struct udevice *dev)
>  {
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct ftgmac100_data *priv = dev_get_priv(dev);
> -       const char *phy_mode;
>
>         pdata->iobase = dev_read_addr(dev);
> -       pdata->phy_interface = -1;
> -       phy_mode = dev_read_string(dev, "phy-mode");
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               dev_err(dev, "Invalid PHY interface '%s'\n", phy_mode);
> +
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         pdata->max_speed = dev_read_u32_default(dev, "max-speed", 0);
>
> diff --git a/drivers/net/higmacv300.c b/drivers/net/higmacv300.c
> index aa79d6eda8..ce8f2dfd09 100644
> --- a/drivers/net/higmacv300.c
> +++ b/drivers/net/higmacv300.c
> @@ -561,19 +561,14 @@ static int higmac_remove(struct udevice *dev)
>  static int higmac_of_to_plat(struct udevice *dev)
>  {
>         struct higmac_priv *priv = dev_get_priv(dev);
> -       int phyintf = PHY_INTERFACE_MODE_NONE;
> -       const char *phy_mode;
>         ofnode phy_node;
>
>         priv->base = dev_remap_addr_index(dev, 0);
>         priv->macif_ctrl = dev_remap_addr_index(dev, 1);
>
> -       phy_mode = dev_read_string(dev, "phy-mode");
> -       if (phy_mode)
> -               phyintf = phy_get_interface_by_name(phy_mode);
> -       if (phyintf == PHY_INTERFACE_MODE_NONE)
> +       priv->phyintf = dev_read_phy_mode(dev);
> +       if (priv->phyintf == PHY_INTERFACE_MODE_NONE)
>                 return -ENODEV;
> -       priv->phyintf = phyintf;
>
>         phy_node = dev_read_subnode(dev, "phy");
>         if (!ofnode_valid(phy_node)) {
> diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c b/drivers/net/ldpaa_eth/ldpaa_eth.c
> index 725173f627..c775598b91 100644
> --- a/drivers/net/ldpaa_eth/ldpaa_eth.c
> +++ b/drivers/net/ldpaa_eth/ldpaa_eth.c
> @@ -1120,31 +1120,14 @@ static uint32_t ldpaa_eth_get_dpmac_id(struct udevice *dev)
>         return fdtdec_get_uint(gd->fdt_blob, port_node, "reg", -1);
>  }
>
> -static const char *ldpaa_eth_get_phy_mode_str(struct udevice *dev)
> -{
> -       int port_node = dev_of_offset(dev);
> -       const char *phy_mode_str;
> -
> -       phy_mode_str = fdt_getprop(gd->fdt_blob, port_node,
> -                                  "phy-connection-type", NULL);
> -       if (phy_mode_str)
> -               return phy_mode_str;
> -
> -       phy_mode_str = fdt_getprop(gd->fdt_blob, port_node, "phy-mode", NULL);
> -       return phy_mode_str;
> -}
> -
>  static int ldpaa_eth_bind(struct udevice *dev)
>  {
> -       const char *phy_mode_str = NULL;
>         uint32_t dpmac_id;
>         char eth_name[16];
>         int phy_mode = -1;
>
> -       phy_mode_str = ldpaa_eth_get_phy_mode_str(dev);
> -       if (phy_mode_str)
> -               phy_mode = phy_get_interface_by_name(phy_mode_str);
> -       if (phy_mode == -1) {
> +       phy_mode = dev_read_phy_mode(dev);
> +       if (phy_mode == PHY_INTERFACE_MODE_NONE) {
>                 dev_err(dev, "incorrect phy mode\n");
>                 return -EINVAL;
>         }
> @@ -1155,7 +1138,8 @@ static int ldpaa_eth_bind(struct udevice *dev)
>                 return -EINVAL;
>         }
>
> -       sprintf(eth_name, "DPMAC%d@%s", dpmac_id, phy_mode_str);
> +       sprintf(eth_name, "DPMAC%d@%s", dpmac_id,
> +               phy_string_for_interface(phy_mode));
>         device_set_name(dev, eth_name);
>
>         return 0;
> @@ -1164,11 +1148,9 @@ static int ldpaa_eth_bind(struct udevice *dev)
>  static int ldpaa_eth_of_to_plat(struct udevice *dev)
>  {
>         struct ldpaa_eth_priv *priv = dev_get_priv(dev);
> -       const char *phy_mode_str;
>
>         priv->dpmac_id = ldpaa_eth_get_dpmac_id(dev);
> -       phy_mode_str = ldpaa_eth_get_phy_mode_str(dev);
> -       priv->phy_mode = phy_get_interface_by_name(phy_mode_str);
> +       priv->phy_mode = dev_read_phy_mode(dev);
>
>         return 0;
>  }
> diff --git a/drivers/net/macb.c b/drivers/net/macb.c
> index 37eed59a69..317b380e8f 100644
> --- a/drivers/net/macb.c
> +++ b/drivers/net/macb.c
> @@ -1360,17 +1360,11 @@ static int macb_eth_probe(struct udevice *dev)
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct macb_device *macb = dev_get_priv(dev);
>         struct ofnode_phandle_args phandle_args;
> -       const char *phy_mode;
>         int ret;
>
> -       phy_mode = dev_read_prop(dev, "phy-mode", NULL);
> -
> -       if (phy_mode)
> -               macb->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (macb->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       macb->phy_interface = dev_read_phy_mode(dev);
> +       if (macb->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         /* Read phyaddr from DT */
>         if (!dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
> diff --git a/drivers/net/mt7620-eth.c b/drivers/net/mt7620-eth.c
> index 222250d52a..24fcb9373f 100644
> --- a/drivers/net/mt7620-eth.c
> +++ b/drivers/net/mt7620-eth.c
> @@ -1048,33 +1048,20 @@ static int mt7620_eth_parse_gsw_port(struct mt7620_eth_priv *priv, u32 idx,
>                                      ofnode node)
>  {
>         ofnode subnode;
> -       const char *str;
> -       int mode, speed, ret;
> +       int speed, ret;
>         u32 phy_addr;
>
> -       str = ofnode_read_string(node, "phy-mode");
> -       if (str) {
> -               mode = phy_get_interface_by_name(str);
> -               if (mode < 0) {
> -                       dev_err(priv->dev, "mt7620_eth: invalid phy-mode\n");
> -                       return -EINVAL;
> -               }
> -
> -               switch (mode) {
> -               case PHY_INTERFACE_MODE_MII:
> -               case PHY_INTERFACE_MODE_RMII:
> -               case PHY_INTERFACE_MODE_RGMII:
> -               case PHY_INTERFACE_MODE_NONE:
> -                       break;
> -               default:
> -                       dev_err(priv->dev,
> -                               "mt7620_eth: unsupported phy-mode\n");
> -                       return -ENOTSUPP;
> -               }
> +       priv->port_cfg[idx].mode = ofnode_read_phy_mode(node);
>
> -               priv->port_cfg[idx].mode = mode;
> -       } else {
> -               priv->port_cfg[idx].mode = PHY_INTERFACE_MODE_NONE;
> +       switch (priv->port_cfg[idx].mode) {
> +       case PHY_INTERFACE_MODE_MII:
> +       case PHY_INTERFACE_MODE_RMII:
> +       case PHY_INTERFACE_MODE_RGMII:
> +       case PHY_INTERFACE_MODE_NONE:
> +               break;
> +       default:
> +               dev_err(priv->dev, "mt7620_eth: unsupported phy-mode\n");
> +               return -ENOTSUPP;
>         }
>
>         subnode = ofnode_find_subnode(node, "fixed-link");
> diff --git a/drivers/net/mtk_eth.c b/drivers/net/mtk_eth.c
> index 26f02847a2..d6065db5fb 100644
> --- a/drivers/net/mtk_eth.c
> +++ b/drivers/net/mtk_eth.c
> @@ -1447,11 +1447,9 @@ static int mtk_eth_of_to_plat(struct udevice *dev)
>         priv->gmac_id = dev_read_u32_default(dev, "mediatek,gmac-id", 0);
>
>         /* Interface mode is required */
> -       str = dev_read_string(dev, "phy-mode");
> -       if (str) {
> -               pdata->phy_interface = phy_get_interface_by_name(str);
> -               priv->phy_interface = pdata->phy_interface;
> -       } else {
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       priv->phy_interface = pdata->phy_interface;
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE) {
>                 printf("error: phy-mode is not set\n");
>                 return -EINVAL;
>         }
> diff --git a/drivers/net/mvgbe.c b/drivers/net/mvgbe.c
> index 954bf86121..32ec0b437d 100644
> --- a/drivers/net/mvgbe.c
> +++ b/drivers/net/mvgbe.c
> @@ -993,7 +993,6 @@ static int mvgbe_of_to_plat(struct udevice *dev)
>         struct mvgbe_device *dmvgbe = dev_get_priv(dev);
>         void *blob = (void *)gd->fdt_blob;
>         int node = dev_of_offset(dev);
> -       const char *phy_mode;
>         int fl_node;
>         int pnode;
>         unsigned long addr;
> @@ -1005,10 +1004,8 @@ static int mvgbe_of_to_plat(struct udevice *dev)
>                                               "marvell,kirkwood-eth-port");
>
>         /* Get phy-mode / phy_interface from DT */
> -       phy_mode = fdt_getprop(gd->fdt_blob, pnode, "phy-mode", NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       else
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 pdata->phy_interface = PHY_INTERFACE_MODE_GMII;
>
>         dmvgbe->phy_interface = pdata->phy_interface;
> diff --git a/drivers/net/mvneta.c b/drivers/net/mvneta.c
> index 4a4268c2b2..d31b96a9d8 100644
> --- a/drivers/net/mvneta.c
> +++ b/drivers/net/mvneta.c
> @@ -1799,20 +1799,13 @@ static const struct eth_ops mvneta_ops = {
>  static int mvneta_of_to_plat(struct udevice *dev)
>  {
>         struct eth_pdata *pdata = dev_get_plat(dev);
> -       const char *phy_mode;
>
>         pdata->iobase = dev_read_addr(dev);
>
>         /* Get phy-mode / phy_interface from DT */
> -       pdata->phy_interface = -1;
> -       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
> -                              NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         return 0;
>  }
> diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
> index 4c0a7b0a9f..dfddac180f 100644
> --- a/drivers/net/mvpp2.c
> +++ b/drivers/net/mvpp2.c
> @@ -4786,11 +4786,9 @@ static int mvpp2_port_init(struct udevice *dev, struct mvpp2_port *port)
>  static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
>  {
>         int port_node = dev_of_offset(dev);
> -       const char *phy_mode_str;
>         int phy_node;
>         u32 id;
>         u32 phyaddr = 0;
> -       int phy_mode = -1;
>         int fixed_link = 0;
>         int ret;
>
> @@ -4821,10 +4819,8 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
>                 phyaddr = PHY_MAX_ADDR;
>         }
>
> -       phy_mode_str = fdt_getprop(gd->fdt_blob, port_node, "phy-mode", NULL);
> -       if (phy_mode_str)
> -               phy_mode = phy_get_interface_by_name(phy_mode_str);
> -       if (phy_mode == -1) {
> +       port->phy_interface = dev_read_phy_mode(dev);
> +       if (port->phy_interface == PHY_INTERFACE_MODE_NONE) {
>                 dev_err(dev, "incorrect phy mode\n");
>                 return -EINVAL;
>         }
> @@ -4847,7 +4843,6 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
>                 port->first_rxq = port->id * rxq_number;
>         else
>                 port->first_rxq = port->id * port->priv->max_port_rxqs;
> -       port->phy_interface = phy_mode;
>         port->phyaddr = phyaddr;
>
>         return 0;
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index fe6dbdaee4..4109676a51 100644
> --- a/drivers/net/phy/phy.c
> +++ b/drivers/net/phy/phy.c
> @@ -982,25 +982,16 @@ static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus,
>   */
>  struct phy_device *fixed_phy_create(ofnode node)
>  {
> -       phy_interface_t interface = PHY_INTERFACE_MODE_NONE;
>         struct phy_device *phydev;
> -       const char *if_str;
>         ofnode subnode;
>
> -       if_str = ofnode_read_string(node, "phy-mode");
> -       if (!if_str) {
> -               if_str = ofnode_read_string(node, "phy-connection-type");
> -       }
> -       if (if_str) {
> -               interface = phy_get_interface_by_name(if_str);
> -       }
> -
>         subnode = ofnode_find_subnode(node, "fixed-link");
>         if (!ofnode_valid(subnode)) {
>                 return NULL;
>         }
>
> -       phydev = phy_device_create(NULL, 0, PHY_FIXED_ID, false, interface);
> +       phydev = phy_device_create(NULL, 0, PHY_FIXED_ID, false,
> +                                  ofnode_read_phy_mode(node));
>         if (phydev)
>                 phydev->node = subnode;
>
> @@ -1093,15 +1084,3 @@ int phy_shutdown(struct phy_device *phydev)
>
>         return 0;
>  }
> -
> -int phy_get_interface_by_name(const char *str)
> -{
> -       int i;
> -
> -       for (i = 0; i < PHY_INTERFACE_MODE_COUNT; i++) {
> -               if (!strcmp(str, phy_interface_strings[i]))
> -                       return i;
> -       }
> -
> -       return -1;
> -}
> diff --git a/drivers/net/pic32_eth.c b/drivers/net/pic32_eth.c
> index 5a678d1cf9..03eb51e51d 100644
> --- a/drivers/net/pic32_eth.c
> +++ b/drivers/net/pic32_eth.c
> @@ -534,7 +534,6 @@ static int pic32_eth_probe(struct udevice *dev)
>  {
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct pic32eth_dev *priv = dev_get_priv(dev);
> -       const char *phy_mode;
>         void __iomem *iobase;
>         fdt_addr_t addr;
>         fdt_size_t size;
> @@ -550,15 +549,9 @@ static int pic32_eth_probe(struct udevice *dev)
>         pdata->iobase = (phys_addr_t)addr;
>
>         /* get phy mode */
> -       pdata->phy_interface = -1;
> -       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
> -                              NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         /* get phy addr */
>         offset = fdtdec_lookup_phandle(gd->fdt_blob, dev_of_offset(dev),
> diff --git a/drivers/net/qe/dm_qe_uec.c b/drivers/net/qe/dm_qe_uec.c
> index a12c8cd2ac..5a66d726cd 100644
> --- a/drivers/net/qe/dm_qe_uec.c
> +++ b/drivers/net/qe/dm_qe_uec.c
> @@ -1133,19 +1133,12 @@ static int qe_uec_remove(struct udevice *dev)
>  static int qe_uec_of_to_plat(struct udevice *dev)
>  {
>         struct eth_pdata *pdata = dev_get_plat(dev);
> -       const char *phy_mode;
>
>         pdata->iobase = (phys_addr_t)devfdt_get_addr(dev);
>
> -       pdata->phy_interface = -1;
> -       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev),
> -                              "phy-connection-type", NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         return 0;
>  }
> diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c
> index 4078d33bb5..f6d386bd6b 100644
> --- a/drivers/net/ravb.c
> +++ b/drivers/net/ravb.c
> @@ -674,20 +674,13 @@ static const struct eth_ops ravb_ops = {
>  int ravb_of_to_plat(struct udevice *dev)
>  {
>         struct eth_pdata *pdata = dev_get_plat(dev);
> -       const char *phy_mode;
>         const fdt32_t *cell;
> -       int ret = 0;
>
>         pdata->iobase = dev_read_addr(dev);
> -       pdata->phy_interface = -1;
> -       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
> -                              NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         pdata->max_speed = 1000;
>         cell = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "max-speed", NULL);
> @@ -696,7 +689,7 @@ int ravb_of_to_plat(struct udevice *dev)
>
>         sprintf(bb_miiphy_buses[0].name, dev->name);
>
> -       return ret;
> +       return 0;
>  }
>
>  static const struct udevice_id ravb_ids[] = {
> diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c
> index 4055f07b2f..04c9c2d968 100644
> --- a/drivers/net/sh_eth.c
> +++ b/drivers/net/sh_eth.c
> @@ -915,20 +915,13 @@ static const struct eth_ops sh_ether_ops = {
>  int sh_ether_of_to_plat(struct udevice *dev)
>  {
>         struct eth_pdata *pdata = dev_get_plat(dev);
> -       const char *phy_mode;
>         const fdt32_t *cell;
> -       int ret = 0;
>
>         pdata->iobase = dev_read_addr(dev);
> -       pdata->phy_interface = -1;
> -       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
> -                              NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         pdata->max_speed = 1000;
>         cell = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "max-speed", NULL);
> @@ -937,7 +930,7 @@ int sh_ether_of_to_plat(struct udevice *dev)
>
>         sprintf(bb_miiphy_buses[0].name, dev->name);
>
> -       return ret;
> +       return 0;
>  }
>
>  static const struct udevice_id sh_ether_ids[] = {
> diff --git a/drivers/net/sni_ave.c b/drivers/net/sni_ave.c
> index ab51552ed8..0a368c6d03 100644
> --- a/drivers/net/sni_ave.c
> +++ b/drivers/net/sni_ave.c
> @@ -738,7 +738,6 @@ static int ave_of_to_plat(struct udevice *dev)
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct ave_private *priv = dev_get_priv(dev);
>         struct ofnode_phandle_args args;
> -       const char *phy_mode;
>         const u32 *valp;
>         int ret, nc, nr;
>         const char *name;
> @@ -748,15 +747,10 @@ static int ave_of_to_plat(struct udevice *dev)
>                 return -EINVAL;
>
>         pdata->iobase = dev_read_addr(dev);
> -       pdata->phy_interface = -1;
> -       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
> -                              NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               dev_err(dev, "Invalid PHY interface '%s'\n", phy_mode);
> +
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         pdata->max_speed = 0;
>         valp = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "max-speed",
> diff --git a/drivers/net/sni_netsec.c b/drivers/net/sni_netsec.c
> index 4901321d0c..693fd3a35d 100644
> --- a/drivers/net/sni_netsec.c
> +++ b/drivers/net/sni_netsec.c
> @@ -1029,19 +1029,13 @@ static int netsec_of_to_plat(struct udevice *dev)
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct netsec_priv *priv = dev_get_priv(dev);
>         struct ofnode_phandle_args phandle_args;
> -       const char *phy_mode;
>
>         pdata->iobase = dev_read_addr_index(dev, 0);
>         priv->eeprom_base = dev_read_addr_index(dev, 1) - EERPROM_MAP_OFFSET;
>
> -       pdata->phy_interface = -1;
> -       phy_mode = dev_read_prop(dev, "phy-mode", NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               pr_err("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         if (!dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
>                                         &phandle_args))
> diff --git a/drivers/net/sun8i_emac.c b/drivers/net/sun8i_emac.c
> index 2e24d12214..5654a3430e 100644
> --- a/drivers/net/sun8i_emac.c
> +++ b/drivers/net/sun8i_emac.c
> @@ -882,7 +882,6 @@ static int sun8i_emac_eth_of_to_plat(struct udevice *dev)
>         struct sun8i_eth_pdata *sun8i_pdata = dev_get_plat(dev);
>         struct eth_pdata *pdata = &sun8i_pdata->eth_pdata;
>         struct emac_eth_dev *priv = dev_get_priv(dev);
> -       const char *phy_mode;
>         const fdt32_t *reg;
>         int node = dev_of_offset(dev);
>         int offset = 0;
> @@ -946,16 +945,10 @@ static int sun8i_emac_eth_of_to_plat(struct udevice *dev)
>         }
>         priv->phyaddr = fdtdec_get_int(gd->fdt_blob, offset, "reg", -1);
>
> -       phy_mode = fdt_getprop(gd->fdt_blob, node, "phy-mode", NULL);
> -
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
>         printf("phy interface%d\n", pdata->phy_interface);
> -
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         if (priv->variant == H3_EMAC) {
>                 ret = sun8i_handle_internal_phy(dev, priv);
> diff --git a/drivers/net/ti/am65-cpsw-nuss.c b/drivers/net/ti/am65-cpsw-nuss.c
> index 87f51b3b99..c1da334739 100644
> --- a/drivers/net/ti/am65-cpsw-nuss.c
> +++ b/drivers/net/ti/am65-cpsw-nuss.c
> @@ -602,21 +602,14 @@ static int am65_cpsw_ofdata_parse_phy(struct udevice *dev)
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct am65_cpsw_priv *priv = dev_get_priv(dev);
>         struct ofnode_phandle_args out_args;
> -       const char *phy_mode;
>         int ret = 0;
>
>         dev_read_u32(dev, "reg", &priv->port_id);
>
> -       phy_mode = dev_read_string(dev, "phy-mode");
> -       if (phy_mode) {
> -               pdata->phy_interface =
> -                               phy_get_interface_by_name(phy_mode);
> -               if (pdata->phy_interface == -1) {
> -                       dev_err(dev, "Invalid PHY mode '%s', port %u\n",
> -                               phy_mode, priv->port_id);
> -                       ret = -EINVAL;
> -                       goto out;
> -               }
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE) {
> +               dev_err(dev, "Invalid PHY mode, port %u\n", priv->port_id);
> +               return -EINVAL;
>         }
>
>         dev_read_u32(dev, "max-speed", (u32 *)&pdata->max_speed);
> diff --git a/drivers/net/ti/cpsw.c b/drivers/net/ti/cpsw.c
> index 68f4191fe9..5b7bab734e 100644
> --- a/drivers/net/ti/cpsw.c
> +++ b/drivers/net/ti/cpsw.c
> @@ -1194,15 +1194,12 @@ static void cpsw_eth_of_parse_slave(struct cpsw_platform_data *data,
>  {
>         struct ofnode_phandle_args out_args;
>         struct cpsw_slave_data *slave_data;
> -       const char *phy_mode;
>         u32 phy_id[2];
>         int ret;
>
>         slave_data = &data->slave_data[slave_index];
>
> -       phy_mode = ofnode_read_string(subnode, "phy-mode");
> -       if (phy_mode)
> -               slave_data->phy_if = phy_get_interface_by_name(phy_mode);
> +       slave_data->phy_if = ofnode_read_phy_mode(subnode);
>
>         ret = ofnode_parse_phandle_with_args(subnode, "phy-handle",
>                                              NULL, 0, 0, &out_args);
> @@ -1348,11 +1345,8 @@ static int cpsw_eth_of_to_plat(struct udevice *dev)
>         }
>
>         pdata->phy_interface = data->slave_data[data->active_slave].phy_if;
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__,
> -                     phy_string_for_interface(pdata->phy_interface));
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>
>         return 0;
>  }
> diff --git a/drivers/net/ti/keystone_net.c b/drivers/net/ti/keystone_net.c
> index 5e8f683c29..b55e7da4c1 100644
> --- a/drivers/net/ti/keystone_net.c
> +++ b/drivers/net/ti/keystone_net.c
> @@ -687,7 +687,6 @@ static int ks2_eth_parse_slave_interface(int netcp, int slave,
>         int phy;
>         int dma_count;
>         u32 dma_channel[8];
> -       const char *phy_mode;
>
>         priv->slave_port = fdtdec_get_int(fdt, slave, "slave-port", -1);
>         priv->net_rx_buffs.rx_flow = priv->slave_port * 8;
> @@ -728,20 +727,19 @@ static int ks2_eth_parse_slave_interface(int netcp, int slave,
>                 priv->sgmii_link_type = SGMII_LINK_MAC_PHY;
>                 priv->has_mdio = true;
>         } else if (priv->link_type == LINK_TYPE_RGMII_LINK_MAC_PHY) {
> -               phy_mode = fdt_getprop(fdt, slave, "phy-mode", NULL);
> -               if (phy_mode) {
> -                       priv->phy_if = phy_get_interface_by_name(phy_mode);
> -                       if (priv->phy_if != PHY_INTERFACE_MODE_RGMII &&
> -                           priv->phy_if != PHY_INTERFACE_MODE_RGMII_ID &&
> -                           priv->phy_if != PHY_INTERFACE_MODE_RGMII_RXID &&
> -                           priv->phy_if != PHY_INTERFACE_MODE_RGMII_TXID) {
> -                               pr_err("invalid phy-mode\n");
> -                               return -EINVAL;
> -                       }
> -               } else {
> +               priv->phy_if = ofnode_read_phy_mode(offset_to_ofnode(slave));
> +               if (priv->phy_if == PHY_INTERFACE_MODE_NONE)
>                         priv->phy_if = PHY_INTERFACE_MODE_RGMII;
> -               }
>                 pdata->phy_interface = priv->phy_if;
> +
> +               if (priv->phy_if != PHY_INTERFACE_MODE_RGMII &&
> +                   priv->phy_if != PHY_INTERFACE_MODE_RGMII_ID &&
> +                   priv->phy_if != PHY_INTERFACE_MODE_RGMII_RXID &&
> +                   priv->phy_if != PHY_INTERFACE_MODE_RGMII_TXID) {
> +                       pr_err("invalid phy-mode\n");
> +                       return -EINVAL;
> +               }
> +
>                 priv->has_mdio = true;
>         }
>
> diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c
> index beca886b25..fec051ebb7 100644
> --- a/drivers/net/tsec.c
> +++ b/drivers/net/tsec.c
> @@ -834,7 +834,6 @@ int tsec_probe(struct udevice *dev)
>         struct ofnode_phandle_args phandle_args;
>         u32 tbiaddr = CONFIG_SYS_TBIPA_VALUE;
>         struct tsec_data *data;
> -       const char *phy_mode;
>         ofnode parent, child;
>         fdt_addr_t reg;
>         u32 max_speed;
> @@ -894,12 +893,8 @@ int tsec_probe(struct udevice *dev)
>
>         priv->tbiaddr = tbiaddr;
>
> -       phy_mode = dev_read_prop(dev, "phy-connection-type", NULL);
> -       if (!phy_mode)
> -               phy_mode = dev_read_prop(dev, "phy-mode", NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1)
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 pdata->phy_interface = tsec_get_interface(priv);
>
>         priv->interface = pdata->phy_interface;
> diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
> index f21addb4d0..02d13c3e0a 100644
> --- a/drivers/net/xilinx_axi_emac.c
> +++ b/drivers/net/xilinx_axi_emac.c
> @@ -821,7 +821,6 @@ static int axi_emac_of_to_plat(struct udevice *dev)
>         struct eth_pdata *pdata = &plat->eth_pdata;
>         int node = dev_of_offset(dev);
>         int offset = 0;
> -       const char *phy_mode;
>
>         pdata->iobase = dev_read_addr(dev);
>         plat->mactype = dev_get_driver_data(dev);
> @@ -850,14 +849,9 @@ static int axi_emac_of_to_plat(struct udevice *dev)
>                         plat->phy_of_handle = offset;
>                 }
>
> -               phy_mode = fdt_getprop(gd->fdt_blob, node, "phy-mode", NULL);
> -               if (phy_mode)
> -                       pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -               if (pdata->phy_interface == -1) {
> -                       printf("%s: Invalid PHY interface '%s'\n", __func__,
> -                              phy_mode);
> +               pdata->phy_interface = dev_read_phy_mode(dev);
> +               if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                         return -EINVAL;
> -               }
>
>                 plat->eth_hasnobuf = fdtdec_get_bool(gd->fdt_blob, node,
>                                                      "xlnx,eth-hasnobuf");
> diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c
> index 3118d14726..0062851134 100644
> --- a/drivers/net/zynq_gem.c
> +++ b/drivers/net/zynq_gem.c
> @@ -827,7 +827,6 @@ static int zynq_gem_of_to_plat(struct udevice *dev)
>         struct eth_pdata *pdata = dev_get_plat(dev);
>         struct zynq_gem_priv *priv = dev_get_priv(dev);
>         struct ofnode_phandle_args phandle_args;
> -       const char *phy_mode;
>
>         pdata->iobase = (phys_addr_t)dev_read_addr(dev);
>         priv->iobase = (struct zynq_gem_regs *)pdata->iobase;
> @@ -859,13 +858,9 @@ static int zynq_gem_of_to_plat(struct udevice *dev)
>                 }
>         }
>
> -       phy_mode = dev_read_prop(dev, "phy-mode", NULL);
> -       if (phy_mode)
> -               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> -       if (pdata->phy_interface == -1) {
> -               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
> +       pdata->phy_interface = dev_read_phy_mode(dev);
> +       if (pdata->phy_interface == PHY_INTERFACE_MODE_NONE)
>                 return -EINVAL;
> -       }
>         priv->interface = pdata->phy_interface;
>
>         priv->int_pcs = dev_read_bool(dev, "is-internal-pcspma");
> diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h
> index 8164386043..8a38c143f9 100644
> --- a/include/dm/ofnode.h
> +++ b/include/dm/ofnode.h
> @@ -12,6 +12,7 @@
>  #include <dm/of.h>
>  #include <dm/of_access.h>
>  #include <log.h>
> +#include <phy_interface.h>
>
>  /* Enable checks to protect against invalid calls */
>  #undef OF_CHECKS
> @@ -1218,4 +1219,16 @@ const char *ofnode_conf_read_str(const char *prop_name);
>   */
>  ofnode ofnode_get_phy_node(ofnode eth_node);
>
> +/**
> + * ofnode_read_phy_mode() - Read PHY connection type from a MAC node
> + *
> + * This function parses the "phy-mode" / "phy-connection-type" property and
> + * returns the corresponding PHY interface type.
> + *
> + * @mac_node:  ofnode containing the property
> + * Return: one of PHY_INTERFACE_MODE_* constants, PHY_INTERFACE_MODE_NONE on
> + *        error
> + */
> +phy_interface_t ofnode_read_phy_mode(ofnode mac_node);
> +
>  #endif
> diff --git a/include/dm/read.h b/include/dm/read.h
> index 899eb813fd..bfa2645967 100644
> --- a/include/dm/read.h
> +++ b/include/dm/read.h
> @@ -757,6 +757,18 @@ int dev_decode_display_timing(const struct udevice *dev, int index,
>   */
>  ofnode dev_get_phy_node(const struct udevice *dev);
>
> +/**
> + * dev_read_phy_mode() - Read PHY connection type from a MAC
> + *
> + * This function parses the "phy-mode" / "phy-connection-type" property and
> + * returns the corresponding PHY interface type.
> + *
> + * @dev: device representing the MAC
> + * Return: one of PHY_INTERFACE_MODE_* constants, PHY_INTERFACE_MODE_NONE on
> + *        error
> + */
> +phy_interface_t dev_read_phy_mode(const struct udevice *dev);
> +
>  #else /* CONFIG_DM_DEV_READ_INLINE is enabled */
>  #include <asm/global_data.h>
>
> @@ -1111,6 +1123,11 @@ static inline ofnode dev_get_phy_node(const struct udevice *dev)
>         return ofnode_get_phy_node(dev_ofnode(dev));
>  }
>
> +static inline phy_interface_t dev_read_phy_mode(const struct udevice *dev)
> +{
> +       return ofnode_read_phy_mode(dev_ofnode(dev));
> +}
> +
>  #endif /* CONFIG_DM_DEV_READ_INLINE */
>
>  /**
> diff --git a/include/phy.h b/include/phy.h
> index c66fd43ea8..dee8fb5f2e 100644
> --- a/include/phy.h
> +++ b/include/phy.h
> @@ -542,14 +542,6 @@ int phy_xilinx_gmii2rgmii_init(void);
>  int board_phy_config(struct phy_device *phydev);
>  int get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id);
>
> -/**
> - * phy_get_interface_by_name() - Look up a PHY interface name
> - *
> - * @str:       PHY interface name, e.g. "mii"
> - * @return: PHY_INTERFACE_MODE_... value, or -1 if not found
> - */
> -int phy_get_interface_by_name(const char *str);
> -
>  /**
>   * phy_interface_is_rgmii - Convenience function for testing if a PHY interface
>   * is RGMII (all variants)
> diff --git a/net/mdio-uclass.c b/net/mdio-uclass.c
> index bef8280e21..874f59413a 100644
> --- a/net/mdio-uclass.c
> +++ b/net/mdio-uclass.c
> @@ -15,11 +15,6 @@
>  #include <dm/uclass-internal.h>
>  #include <linux/compat.h>
>
> -/* DT node properties for MAC-PHY interface */
> -static const char * const phy_mode_str[] = {
> -       "phy-mode", "phy-connection-type"
> -};
> -
>  void dm_mdio_probe_devices(void)
>  {
>         struct udevice *it;
> @@ -195,26 +190,15 @@ out:
>  /* Connect to a PHY linked in eth DT node */
>  struct phy_device *dm_eth_phy_connect(struct udevice *ethdev)
>  {
> -       const char *if_str;
>         phy_interface_t interface;
>         struct phy_device *phy;
> -       int i;
>
>         if (!dev_has_ofnode(ethdev)) {
>                 debug("%s: supplied eth dev has no DT node!\n", ethdev->name);
>                 return NULL;
>         }
>
> -       interface = PHY_INTERFACE_MODE_NONE;
> -       for (i = 0; i < ARRAY_SIZE(phy_mode_str); i++) {
> -               if_str = dev_read_string(ethdev, phy_mode_str[i]);
> -               if (if_str) {
> -                       interface = phy_get_interface_by_name(if_str);
> -                       break;
> -               }
> -       }
> -       if (interface < 0)
> -               interface = PHY_INTERFACE_MODE_NONE;
> +       interface = dev_read_phy_mode(ethdev);
>         if (interface == PHY_INTERFACE_MODE_NONE)
>                 dev_dbg(ethdev, "can't find interface mode, default to NONE\n");
>
> --
> 2.34.1
>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>

  reply	other threads:[~2022-03-18  8:07 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-17 12:49 [PATCH u-boot-net 00/14] u-boot-net refactors, fixes, cleanups Marek Behún
2022-03-17 12:49 ` [PATCH u-boot-net 01/14] net: mdio-uclass: fix type for phy_mode_str and phy_handle_str Marek Behún
2022-03-18  7:54   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 02/14] net: mdio-uclass: use ARRAY_SIZE() Marek Behún
2022-03-18  7:55   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 03/14] net: introduce helpers to get PHY ofnode from MAC Marek Behún
2022-03-18  8:02   ` Ramon Fried
2022-03-28  6:35   ` Simon Glass
2022-03-28 21:51     ` Marek Behún
2022-03-17 12:49 ` [PATCH u-boot-net 04/14] net: mdio-uclass: add wrappers for read/write/reset operations Marek Behún
2022-03-18  8:00   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 05/14] treewide: use dm_mdio_read/write/reset() wrappers Marek Behún
2022-03-18  8:04   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 06/14] net: phy: fix parsing wrong property Marek Behún
2022-03-18  8:05   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 07/14] net: introduce helpers to get PHY interface mode from a device/ofnode Marek Behún
2022-03-18  8:07   ` Ramon Fried [this message]
2022-03-17 12:49 ` [PATCH u-boot-net 08/14] treewide: Rename PHY_INTERFACE_MODE_COUNT to PHY_INTERFACE_MODE_MAX Marek Behún
2022-03-18  7:34   ` Stefan Roese
2022-03-17 12:49 ` [PATCH u-boot-net 09/14] treewide: Rename PHY_INTERFACE_MODE_NONE to PHY_INTERFACE_MODE_NA Marek Behún
2022-03-18  7:34   ` Stefan Roese
2022-03-18  8:07   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 10/14] phy: Move PHY_INTERFACE_MODE_NA to the beginning of the enum definition Marek Behún
2022-03-18  7:34   ` Stefan Roese
2022-03-18  8:08   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 11/14] net: phy: xilinx: Check interface type in ->config(), not ->probe() Marek Behún
2022-03-18  8:09   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 12/14] net: phy: use ->is_c45 instead of is_10g_interface() Marek Behún
2022-03-18  8:10   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 13/14] bcmgenet, sun8i_emac: Don't connect PHY two times Marek Behún
2022-03-18  8:10   ` Ramon Fried
2022-03-17 12:49 ` [PATCH u-boot-net 14/14] net: phy: don't require PHY interface mode during PHY creation Marek Behún
2022-03-18  8:12   ` Ramon Fried
2022-03-18  8:13 ` [PATCH u-boot-net 00/14] u-boot-net refactors, fixes, cleanups Ramon Fried

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAGi-RUKT+QNTaoiGwLbRRQwzdPuNWWtgKaYNV4pKLdxXU48ivQ@mail.gmail.com \
    --to=rfried.dev@gmail.com \
    --cc=GSS_MTK_Uboot_upstream@mediatek.com \
    --cc=Zhiqiang.Hou@nxp.com \
    --cc=bmeng.cn@gmail.com \
    --cc=chunfeng.yun@mediatek.com \
    --cc=jaswinder.singh@linaro.org \
    --cc=joe.hershberger@ni.com \
    --cc=kabel@kernel.org \
    --cc=marek.behun@nic.cz \
    --cc=masami.hiramatsu@linaro.org \
    --cc=michal.simek@xilinx.com \
    --cc=patrice.chotard@foss.st.com \
    --cc=patrick.delaunay@foss.st.com \
    --cc=priyanka.jain@nxp.com \
    --cc=radu-nicolae.pirea@oss.nxp.com \
    --cc=ryder.lee@mediatek.com \
    --cc=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    --cc=uboot-stm32@st-md-mailman.stormreply.com \
    --cc=vigneshr@ti.com \
    --cc=vikas.manocha@st.com \
    --cc=vladimir.oltean@nxp.com \
    --cc=wd@denx.de \
    --cc=weijie.gao@mediatek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.