Commit 6bc6d0a8 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller

dsa: Support multiple MDIO busses

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: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 966bce38
...@@ -58,6 +58,10 @@ Optionnal property: ...@@ -58,6 +58,10 @@ Optionnal property:
Documentation/devicetree/bindings/net/ethernet.txt Documentation/devicetree/bindings/net/ethernet.txt
for details. 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: Optional subnodes:
- fixed-link : Fixed-link subnode describing a link to a non-MDIO - fixed-link : Fixed-link subnode describing a link to a non-MDIO
managed entity. See managed entity. See
...@@ -107,6 +111,7 @@ Example: ...@@ -107,6 +111,7 @@ Example:
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
reg = <17 1>; /* MDIO address 17, switch 1 in tree */ reg = <17 1>; /* MDIO address 17, switch 1 in tree */
mii-bus = <&mii_bus1>;
switch1uplink: port@0 { switch1uplink: port@0 {
reg = <0>; reg = <0>;
......
...@@ -574,7 +574,7 @@ static int dsa_of_probe(struct device *dev) ...@@ -574,7 +574,7 @@ static int dsa_of_probe(struct device *dev)
{ {
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
struct device_node *child, *mdio, *ethernet, *port, *link; 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 net_device *ethernet_dev;
struct dsa_platform_data *pd; struct dsa_platform_data *pd;
struct dsa_chip_data *cd; struct dsa_chip_data *cd;
...@@ -636,6 +636,16 @@ static int dsa_of_probe(struct device *dev) ...@@ -636,6 +636,16 @@ static int dsa_of_probe(struct device *dev)
if (!of_property_read_u32(child, "eeprom-length", &eeprom_len)) if (!of_property_read_u32(child, "eeprom-length", &eeprom_len))
cd->eeprom_len = 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) { for_each_available_child_of_node(child, port) {
port_reg = of_get_property(port, "reg", NULL); port_reg = of_get_property(port, "reg", NULL);
if (!port_reg) if (!port_reg)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment