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:
parent
3407c30eeb
commit
6c993815bb
@ -953,23 +953,20 @@ static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus,
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
struct phy_device *phydev = NULL;
|
struct phy_device *phydev = NULL;
|
||||||
int sn = dev_of_offset(dev);
|
ofnode node = dev_ofnode(dev);
|
||||||
int off;
|
|
||||||
|
|
||||||
while (sn > 0) {
|
while (ofnode_valid(node)) {
|
||||||
off = fdt_node_offset_by_compatible(gd->fdt_blob, sn,
|
node = ofnode_by_compatible(node, "xlnx,gmii-to-rgmii-1.0");
|
||||||
"xlnx,gmii-to-rgmii-1.0");
|
if (ofnode_valid(node)) {
|
||||||
if (off > 0) {
|
phydev = phy_device_create(bus, 0,
|
||||||
phydev = phy_device_create(bus, off,
|
|
||||||
PHY_GMII2RGMII_ID, false,
|
PHY_GMII2RGMII_ID, false,
|
||||||
interface);
|
interface);
|
||||||
|
if (phydev)
|
||||||
|
phydev->node = node;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (off == -FDT_ERR_NOTFOUND)
|
|
||||||
sn = fdt_first_subnode(gd->fdt_blob, sn);
|
node = ofnode_first_subnode(node);
|
||||||
else
|
|
||||||
printf("%s: Error finding compat string:%d\n",
|
|
||||||
__func__, off);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return phydev;
|
return phydev;
|
||||||
|
@ -18,9 +18,38 @@ DECLARE_GLOBAL_DATA_PTR;
|
|||||||
|
|
||||||
static int xilinxgmiitorgmii_config(struct phy_device *phydev)
|
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__);
|
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)
|
if (ext_phydev->drv->config)
|
||||||
ext_phydev->drv->config(ext_phydev);
|
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)
|
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__);
|
debug("%s\n", __func__);
|
||||||
|
|
||||||
if (phydev->interface != PHY_INTERFACE_MODE_GMII) {
|
if (phydev->interface != PHY_INTERFACE_MODE_GMII) {
|
||||||
@ -95,31 +119,6 @@ static int xilinxgmiitorgmii_probe(struct phy_device *phydev)
|
|||||||
return -EINVAL;
|
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;
|
phydev->flags |= PHY_FLAG_BROKEN_RESET;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user