These changes are a raw update to a vanilla kernel 4.1.10, with the
[kvmfornfv.git] / kernel / drivers / of / of_mdio.c
index 0c06448..bec8ec2 100644 (file)
@@ -263,7 +263,8 @@ EXPORT_SYMBOL(of_phy_attach);
 bool of_phy_is_fixed_link(struct device_node *np)
 {
        struct device_node *dn;
-       int len;
+       int len, err;
+       const char *managed;
 
        /* New binding */
        dn = of_get_child_by_name(np, "fixed-link");
@@ -272,6 +273,10 @@ bool of_phy_is_fixed_link(struct device_node *np)
                return true;
        }
 
+       err = of_property_read_string(np, "managed", &managed);
+       if (err == 0 && strcmp(managed, "auto") != 0)
+               return true;
+
        /* Old binding */
        if (of_get_property(np, "fixed-link", &len) &&
            len == (5 * sizeof(__be32)))
@@ -286,8 +291,18 @@ int of_phy_register_fixed_link(struct device_node *np)
        struct fixed_phy_status status = {};
        struct device_node *fixed_link_node;
        const __be32 *fixed_link_prop;
-       int len;
+       int len, err;
        struct phy_device *phy;
+       const char *managed;
+
+       err = of_property_read_string(np, "managed", &managed);
+       if (err == 0) {
+               if (strcmp(managed, "in-band-status") == 0) {
+                       /* status is zeroed, namely its .link member */
+                       phy = fixed_phy_register(PHY_POLL, &status, np);
+                       return IS_ERR(phy) ? PTR_ERR(phy) : 0;
+               }
+       }
 
        /* New binding */
        fixed_link_node = of_get_child_by_name(np, "fixed-link");