summaryrefslogtreecommitdiff
path: root/net/dsa/dsa.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-03-09 23:50:26 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-09 23:50:26 -0400
commitbf0b211256be342e92d3ee5c5a1fb8d42f3928bb (patch)
tree3e57589f3c8b06b02e895e2428a82433f5cb8bda /net/dsa/dsa.c
parent3cef5c5b0b56f3f90b0e9ff8d3f8dc57f464cc14 (diff)
parent769a020289bc8f68b7e48faf8fee970346d71a3b (diff)
Merge branch 'dsa-next'
Florian Fainelli says: ==================== net: dsa: remove restriction on platform_device This patch series removes the restriction in DSA to operate exclusively with platform_device Ethernet MAC drivers when using Device Tree. This basically allows arbitrary Ethernet MAC drivers to be used now in conjunction with Device Tree. The reason was that DSA was using a of_find_device_by_node() which limits the device_node to device pointer search exclusively to platform_device, in our case, we are interested in doing a "class" research and lookup the net_device. Thanks to Chris Packham for testing this on his platform. Changes in v2: - fix build for !CONFIG_OF_NET ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dsa/dsa.c')
-rw-r--r--net/dsa/dsa.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index b40f11bb419c..899772108ee3 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -20,6 +20,7 @@
#include <linux/of.h>
#include <linux/of_mdio.h>
#include <linux/of_platform.h>
+#include <linux/of_net.h>
#include <linux/sysfs.h>
#include "dsa_priv.h"
@@ -583,7 +584,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 platform_device *ethernet_dev;
+ struct net_device *ethernet_dev;
struct dsa_platform_data *pd;
struct dsa_chip_data *cd;
const char *port_name;
@@ -604,7 +605,7 @@ static int dsa_of_probe(struct device *dev)
if (!ethernet)
return -EINVAL;
- ethernet_dev = of_find_device_by_node(ethernet);
+ ethernet_dev = of_find_net_device_by_node(ethernet);
if (!ethernet_dev)
return -EPROBE_DEFER;
@@ -613,7 +614,7 @@ static int dsa_of_probe(struct device *dev)
return -ENOMEM;
dev->platform_data = pd;
- pd->netdev = &ethernet_dev->dev;
+ pd->of_netdev = ethernet_dev;
pd->nr_chips = of_get_available_child_count(np);
if (pd->nr_chips > DSA_MAX_SWITCHES)
pd->nr_chips = DSA_MAX_SWITCHES;
@@ -771,10 +772,15 @@ static int dsa_probe(struct platform_device *pdev)
pd = pdev->dev.platform_data;
}
- if (pd == NULL || pd->netdev == NULL)
+ if (pd == NULL || (pd->netdev == NULL && pd->of_netdev == NULL))
return -EINVAL;
- dev = dev_to_net_device(pd->netdev);
+ if (pd->of_netdev) {
+ dev = pd->of_netdev;
+ dev_hold(dev);
+ } else {
+ dev = dev_to_net_device(pd->netdev);
+ }
if (dev == NULL) {
ret = -EPROBE_DEFER;
goto out;