drivers: net: cpsw: Add reading of DT phy-handle node
authorDan Murphy <dmurphy@ti.com>
Mon, 2 May 2016 20:45:56 +0000 (15:45 -0500)
committerJoe Hershberger <joe.hershberger@ni.com>
Tue, 24 May 2016 16:42:04 +0000 (11:42 -0500)
Add the ability to read the phy-handle node of the
cpsw slave.  Upon reading this handle the phy-id
can be stored based on the reg node in the DT.

The phy-handle also needs to be stored and passed
to the phy to access any phy data that is available.

Signed-off-by: Dan Murphy <dmurphy@ti.com>
Tested-by: Mugunthan V N <mugunthanvnm@ti.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/cpsw.c
include/cpsw.h

index b8111197b3fad09a0e6eb1624cd89ac3af2a3d4e..2ce4ec69f1dfbe7a709fe3210e1d7ae477dee3ba 100644 (file)
@@ -966,6 +966,11 @@ static int cpsw_phy_init(struct cpsw_priv *priv, struct cpsw_slave *slave)
        phydev->supported &= supported;
        phydev->advertising = phydev->supported;
 
+#ifdef CONFIG_DM_ETH
+       if (slave->data->phy_of_handle)
+               phydev->dev->of_offset = slave->data->phy_of_handle;
+#endif
+
        priv->phydev = phydev;
        phy_config(phydev);
 
@@ -1226,8 +1231,22 @@ static int cpsw_eth_ofdata_to_platdata(struct udevice *dev)
                        if (phy_mode)
                                priv->data.slave_data[slave_index].phy_if =
                                        phy_get_interface_by_name(phy_mode);
-                       fdtdec_get_int_array(fdt, subnode, "phy_id", phy_id, 2);
-                       priv->data.slave_data[slave_index].phy_addr = phy_id[1];
+
+                       priv->data.slave_data[slave_index].phy_of_handle =
+                               fdtdec_lookup_phandle(fdt, subnode,
+                                                     "phy-handle");
+
+                       if (priv->data.slave_data[slave_index].phy_of_handle >= 0) {
+                               priv->data.slave_data[slave_index].phy_addr =
+                                               fdtdec_get_int(gd->fdt_blob,
+                                                              priv->data.slave_data[slave_index].phy_of_handle,
+                                                              "reg", -1);
+                       } else {
+                               fdtdec_get_int_array(fdt, subnode, "phy_id",
+                                                    phy_id, 2);
+                               priv->data.slave_data[slave_index].phy_addr =
+                                               phy_id[1];
+                       }
                        slave_index++;
                }
 
index 6255cd80ef27ee76cdcb6b909606ed0c3a98fc0f..257d12a08d721eef149a31b466306cc2465774d6 100644 (file)
@@ -21,6 +21,7 @@ struct cpsw_slave_data {
        u32             sliver_reg_ofs;
        int             phy_addr;
        int             phy_if;
+       int             phy_of_handle;
 };
 
 enum {