dsa: Support multiple MDIO busses
authorAndrew Lunn <andrew@lunn.ch>
Sat, 8 Aug 2015 15:09:14 +0000 (17:09 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 10 Aug 2015 21:25:02 +0000 (14:25 -0700)
When using a cluster of switches, some topologies will have an MDIO
bus per switch, not one for the whole cluster. Allow this to be
represented in the device tree, by adding an optional mii-bus property
at the switch level. The old platform_device method of instantiation
supports this already, so only the device tree binding needs extending
with an additional optional phandle.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/devicetree/bindings/net/dsa/dsa.txt
net/dsa/dsa.c

index f0b4cd72411d66bf12aeec3d64335d6641b26674..9cf9a0ec333c053932a81b971358bb8d75dbdf6a 100644 (file)
@@ -58,6 +58,10 @@ Optionnal property:
                          Documentation/devicetree/bindings/net/ethernet.txt
                          for details.
 
+- mii-bus              : Should be a phandle to a valid MDIO bus device node.
+                         This mii-bus will be used in preference to the
+                         global dsa,mii-bus defined above, for this switch.
+
 Optional subnodes:
 - fixed-link           : Fixed-link subnode describing a link to a non-MDIO
                          managed entity. See
@@ -107,6 +111,7 @@ Example:
                        #address-cells = <1>;
                        #size-cells = <0>;
                        reg = <17 1>;   /* MDIO address 17, switch 1 in tree */
+                       mii-bus = <&mii_bus1>;
 
                        switch1uplink: port@0 {
                                reg = <0>;
index b445d492c115382b9ecd25cbceb3e47053263387..78d4ac97aae36af0eff4698bb8cf8c124be2fc69 100644 (file)
@@ -574,7 +574,7 @@ static int dsa_of_probe(struct device *dev)
 {
        struct device_node *np = dev->of_node;
        struct device_node *child, *mdio, *ethernet, *port, *link;
-       struct mii_bus *mdio_bus;
+       struct mii_bus *mdio_bus, *mdio_bus_switch;
        struct net_device *ethernet_dev;
        struct dsa_platform_data *pd;
        struct dsa_chip_data *cd;
@@ -636,6 +636,16 @@ static int dsa_of_probe(struct device *dev)
                if (!of_property_read_u32(child, "eeprom-length", &eeprom_len))
                        cd->eeprom_len = eeprom_len;
 
+               mdio = of_parse_phandle(child, "mii-bus", 0);
+               if (mdio) {
+                       mdio_bus_switch = of_mdio_find_bus(mdio);
+                       if (!mdio_bus_switch) {
+                               ret = -EPROBE_DEFER;
+                               goto out_free_chip;
+                       }
+                       cd->host_dev = &mdio_bus_switch->dev;
+               }
+
                for_each_available_child_of_node(child, port) {
                        port_reg = of_get_property(port, "reg", NULL);
                        if (!port_reg)