Start using the component framework. The DSA device will be the
master, and the switch drivers will be slaves. Add basic component
master support to the DSA framework.

Signed-off-by: Andrew Lunn <and...@lunn.ch>
---
 net/dsa/dsa.c | 54 ++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 40 insertions(+), 14 deletions(-)

diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index 5062ca91852d..a139c35061a1 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -9,6 +9,7 @@
  * (at your option) any later version.
  */
 
+#include <linux/component.h>
 #include <linux/ctype.h>
 #include <linux/device.h>
 #include <linux/hwmon.h>
@@ -28,7 +29,7 @@
 #include "dsa_priv.h"
 
 char dsa_driver_version[] = "0.1";
-
+static const struct component_master_ops dsa_ops;
 
 /* switch driver registration ***********************************************/
 static DEFINE_MUTEX(dsa_switch_drivers_mutex);
@@ -820,13 +821,12 @@ static inline void dsa_of_remove(struct device *dev,
 #endif
 
 static int dsa_setup_dst(struct dsa_switch_tree *dst, struct net_device *dev,
-                        struct device *parent, struct dsa_platform_data *pd)
+                        struct device *parent)
 {
        int i;
        unsigned configured = 0;
+       struct dsa_platform_data *pd = dst->pd;
 
-       dst->pd = pd;
-       dst->master_netdev = dev;
        dst->cpu_switch = -1;
        dst->cpu_port = -1;
 
@@ -885,6 +885,7 @@ static void dsa_finish_dst(struct dsa_switch_tree *dst, 
struct device *parent,
 static int dsa_probe(struct platform_device *pdev)
 {
        struct dsa_platform_data *pd = pdev->dev.platform_data;
+       struct component_match *match = NULL;
        struct net_device *dev;
        struct dsa_switch_tree *dst;
        int ret;
@@ -931,15 +932,13 @@ static int dsa_probe(struct platform_device *pdev)
                goto out;
        }
 
+       dst->pd = pd;
+       dst->master_netdev = dev;
+
        platform_set_drvdata(pdev, dst);
 
-       ret = dsa_setup_dst(dst, dev, &pdev->dev, pd);
-       if (ret) {
-               dev_put(dev);
-               goto out;
-       }
 
-       return 0;
+       return component_master_add_with_match(&pdev->dev, &dsa_ops, match);
 
 out:
        dsa_of_remove(&pdev->dev, pd);
@@ -947,22 +946,49 @@ out:
        return ret;
 }
 
-static int dsa_remove(struct platform_device *pdev)
+static int dsa_bind(struct device *dev)
 {
+       struct dsa_switch_tree *dst = dev_get_drvdata(dev);
+       int ret;
+
+       ret = component_bind_all(dev, dst);
+       if (ret)
+               return ret;
+
+       return dsa_setup_dst(dst, dst->master_netdev, dev);
+}
+
+static void dsa_unbind(struct device *dev)
+{
+       struct platform_device *pdev = to_platform_device(dev);
        struct dsa_switch_tree *dst = platform_get_drvdata(pdev);
        struct dsa_platform_data *pd = pdev->dev.platform_data;
 
        dsa_finish_dst(dst, &pdev->dev, pd);
-       dsa_of_remove(&pdev->dev, pd);
-       dev_put(dst->master_netdev);
 
-       return 0;
+       dev_put(dst->master_netdev);
 }
 
+static const struct component_master_ops dsa_ops = {
+       .bind = dsa_bind,
+       .unbind = dsa_unbind,
+};
+
 static void dsa_shutdown(struct platform_device *pdev)
 {
 }
 
+static int dsa_remove(struct platform_device *pdev)
+{
+       struct dsa_platform_data *pd = pdev->dev.platform_data;
+
+       component_master_del(&pdev->dev, &dsa_ops);
+
+       dsa_of_remove(&pdev->dev, pd);
+
+       return 0;
+}
+
 static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
                          struct packet_type *pt, struct net_device *orig_dev)
 {
-- 
2.7.0

Reply via email to