net: phy: xilinx: Be compatible with live OF tree

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>
This commit is contained in:
Bin Meng 2021-03-14 20:14:50 +08:00 committed by Priyanka Jain
parent 3407c30eeb
commit 6c993815bb
2 changed files with 39 additions and 43 deletions

View 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;
ofnode node = dev_ofnode(dev);
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,
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;

View 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;