net: phy: xilinx: Be compatible with live OF tree
authorBin Meng <bmeng.cn@gmail.com>
Sun, 14 Mar 2021 12:14:50 +0000 (20:14 +0800)
committerPriyanka Jain <priyanka.jain@nxp.com>
Thu, 15 Apr 2021 08:52:17 +0000 (14:22 +0530)
Following the same updates that were done to the fixed phy driver,
use ofnode_ APIs instead of fdt_ APIs so that the Xilinx PHY driver
can support live DT.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Priyanka Jain <priyanka.jain@nxp.com>
drivers/net/phy/phy.c
drivers/net/phy/xilinx_gmii2rgmii.c

index eae40cc..d464379 100644 (file)
@@ -953,23 +953,20 @@ static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus,
 #endif
 {
        struct phy_device *phydev = NULL;
-       int sn = dev_of_offset(dev);
-       int off;
-
-       while (sn > 0) {
-               off = fdt_node_offset_by_compatible(gd->fdt_blob, sn,
-                                                   "xlnx,gmii-to-rgmii-1.0");
-               if (off > 0) {
-                       phydev = phy_device_create(bus, off,
+       ofnode node = dev_ofnode(dev);
+
+       while (ofnode_valid(node)) {
+               node = ofnode_by_compatible(node, "xlnx,gmii-to-rgmii-1.0");
+               if (ofnode_valid(node)) {
+                       phydev = phy_device_create(bus, 0,
                                                   PHY_GMII2RGMII_ID, false,
                                                   interface);
+                       if (phydev)
+                               phydev->node = node;
                        break;
                }
-               if (off == -FDT_ERR_NOTFOUND)
-                       sn = fdt_first_subnode(gd->fdt_blob, sn);
-               else
-                       printf("%s: Error finding compat string:%d\n",
-                              __func__, off);
+
+               node = ofnode_first_subnode(node);
        }
 
        return phydev;
index 74105c0..635c057 100644 (file)
@@ -18,9 +18,38 @@ DECLARE_GLOBAL_DATA_PTR;
 
 static int xilinxgmiitorgmii_config(struct phy_device *phydev)
 {
-       struct phy_device *ext_phydev = phydev->priv;
+       ofnode node = phy_get_ofnode(phydev);
+       struct phy_device *ext_phydev;
+       struct ofnode_phandle_args phandle;
+       int ext_phyaddr = -1;
+       int ret;
 
        debug("%s\n", __func__);
+
+       if (!ofnode_valid(node))
+               return -EINVAL;
+
+       phydev->addr = ofnode_read_u32_default(node, "reg", -1);
+       ret = ofnode_parse_phandle_with_args(node, "phy-handle",
+                                            NULL, 0, 0, &phandle);
+       if (ret)
+               return ret;
+
+       ext_phyaddr = ofnode_read_u32_default(phandle.node, "reg", -1);
+       ext_phydev = phy_find_by_mask(phydev->bus,
+                                     1 << ext_phyaddr,
+                                     PHY_INTERFACE_MODE_RGMII);
+       if (!ext_phydev) {
+               printf("%s, No external phy device found\n", __func__);
+               return -EINVAL;
+       }
+
+       ext_phydev->node = phandle.node;
+       phydev->priv = ext_phydev;
+
+       debug("%s, gmii2rgmmi:0x%x, extphy:0x%x\n", __func__, phydev->addr,
+             ext_phyaddr);
+
        if (ext_phydev->drv->config)
                ext_phydev->drv->config(ext_phydev);
 
@@ -83,11 +112,6 @@ static int xilinxgmiitorgmii_startup(struct phy_device *phydev)
 
 static int xilinxgmiitorgmii_probe(struct phy_device *phydev)
 {
-       int ofnode = phydev->addr;
-       u32 phy_of_handle;
-       int ext_phyaddr = -1;
-       struct phy_device *ext_phydev;
-
        debug("%s\n", __func__);
 
        if (phydev->interface != PHY_INTERFACE_MODE_GMII) {
@@ -95,31 +119,6 @@ static int xilinxgmiitorgmii_probe(struct phy_device *phydev)
                return -EINVAL;
        }
 
-       /*
-        * Read the phy address again as the one we read in ethernet driver
-        * was overwritten for the purpose of storing the ofnode
-        */
-       phydev->addr = fdtdec_get_int(gd->fdt_blob, ofnode, "reg", -1);
-       phy_of_handle = fdtdec_lookup_phandle(gd->fdt_blob, ofnode,
-                                             "phy-handle");
-       if (phy_of_handle > 0)
-               ext_phyaddr = fdtdec_get_int(gd->fdt_blob,
-                                            phy_of_handle,
-                                            "reg", -1);
-       ext_phydev = phy_find_by_mask(phydev->bus,
-                                     1 << ext_phyaddr,
-                                     PHY_INTERFACE_MODE_RGMII);
-       if (!ext_phydev) {
-               printf("%s, No external phy device found\n", __func__);
-               return -EINVAL;
-       }
-
-       ext_phydev->node = offset_to_ofnode(phy_of_handle);
-       phydev->priv = ext_phydev;
-
-       debug("%s, gmii2rgmmi:0x%x, extphy:0x%x\n", __func__, phydev->addr,
-             ext_phyaddr);
-
        phydev->flags |= PHY_FLAG_BROKEN_RESET;
 
        return 0;