net: netcp: ethss: use of_get_phy_mode() to support different RGMII modes
authorMurali Karicheri <m-karicheri2@ti.com>
Tue, 17 Apr 2018 21:30:38 +0000 (17:30 -0400)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Apr 2018 01:00:57 +0000 (21:00 -0400)
The phy used for K2G allows for internal delays to be added optionally
to the clock circuitry based on board desing. To add this support,
enhance the driver to use of_get_phy_mode() to read the phy-mode from
the phy device and pass the same to phy through of_phy_connect().

Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/netcp_ethss.c

index d982dcbe17b5bf49933b7836190999a54d36be8b..5bc792175e4e7f4240444e256f5338178d7d4071 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of_mdio.h>
+#include <linux/of_net.h>
 #include <linux/of_address.h>
 #include <linux/if_vlan.h>
 #include <linux/ptp_classify.h>
@@ -707,6 +708,7 @@ struct gbe_slave {
        u32                             link_interface;
        u32                             mac_control;
        u8                              phy_port_t;
+       struct device_node              *node;
        struct device_node              *phy_node;
        struct ts_ctl                   ts_ctl;
        struct list_head                slave_list;
@@ -2322,6 +2324,21 @@ static int gbe_slave_open(struct gbe_intf *gbe_intf)
                has_phy = true;
                phy_mode = PHY_INTERFACE_MODE_SGMII;
                slave->phy_port_t = PORT_MII;
+       } else if (slave->link_interface == RGMII_LINK_MAC_PHY) {
+               has_phy = true;
+               phy_mode = of_get_phy_mode(slave->node);
+               /* if phy-mode is not present, default to
+                * PHY_INTERFACE_MODE_RGMII
+                */
+               if (phy_mode < 0)
+                       phy_mode = PHY_INTERFACE_MODE_RGMII;
+
+               if (!phy_interface_mode_is_rgmii(phy_mode)) {
+                       dev_err(priv->dev,
+                               "Unsupported phy mode %d\n", phy_mode);
+                       return -EINVAL;
+               }
+               slave->phy_port_t = PORT_MII;
        } else if (slave->link_interface == XGMII_LINK_MAC_PHY) {
                has_phy = true;
                phy_mode = PHY_INTERFACE_MODE_NA;
@@ -2947,6 +2964,7 @@ static int init_slave(struct gbe_priv *gbe_dev, struct gbe_slave *slave,
                slave->link_interface = SGMII_LINK_MAC_PHY;
        }
 
+       slave->node = node;
        slave->open = false;
        if ((slave->link_interface == SGMII_LINK_MAC_PHY) ||
            (slave->link_interface == RGMII_LINK_MAC_PHY) ||