static void dsa_tree_remove_switch(struct dsa_switch_tree *dst,
                                   unsigned int index)
 {
+       dsa_tree_teardown(dst);
+
        dst->ds[index] = NULL;
        dsa_tree_put(dst);
 }
                               struct dsa_switch *ds)
 {
        unsigned int index = ds->index;
+       int err;
 
        if (dst->ds[index])
                return -EBUSY;
        dsa_tree_get(dst);
        dst->ds[index] = ds;
 
-       return 0;
+       err = dsa_tree_setup(dst);
+       if (err)
+               dsa_tree_remove_switch(dst, index);
+
+       return err;
 }
 
 static int dsa_port_parse_user(struct dsa_port *dp, const char *name)
        return dsa_switch_parse_ports(ds, cd);
 }
 
+static int dsa_switch_add(struct dsa_switch *ds)
+{
+       struct dsa_switch_tree *dst = ds->dst;
+
+       return dsa_tree_add_switch(dst, ds);
+}
+
 static int _dsa_register_switch(struct dsa_switch *ds)
 {
        struct dsa_chip_data *pdata = ds->dev->platform_data;
        struct device_node *np = ds->dev->of_node;
-       struct dsa_switch_tree *dst;
-       unsigned int index;
        int err;
 
        if (np)
        if (err)
                return err;
 
-       index = ds->index;
-       dst = ds->dst;
-
-       err = dsa_tree_add_switch(dst, ds);
-       if (err)
-               return err;
-
-       err = dsa_tree_setup(dst);
-       if (err) {
-               dsa_tree_teardown(dst);
-               dsa_tree_remove_switch(dst, index);
-       }
-
-       return err;
+       return dsa_switch_add(ds);
 }
 
 struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n)
        struct dsa_switch_tree *dst = ds->dst;
        unsigned int index = ds->index;
 
-       dsa_tree_teardown(dst);
-
        dsa_tree_remove_switch(dst, index);
 }