Message ID | 20220317124958.27921-8-kabel@kernel.org |
---|---|
State | Superseded |
Delegated to: | Ramon Fried |
Headers | show |
Series | u-boot-net refactors, fixes, cleanups | expand |
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>
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");