/* basic switch operations **************************************************/
 int dsa_cpu_dsa_setup(struct dsa_switch *ds, struct device *dev,
-                     struct device_node *port_dn, int port)
+                     struct dsa_port *dport, int port)
 {
+       struct device_node *port_dn = dport->dn;
        struct phy_device *phydev;
        int ret, mode;
 
 
 static int dsa_cpu_dsa_setups(struct dsa_switch *ds, struct device *dev)
 {
-       struct device_node *port_dn;
+       struct dsa_port *dport;
        int ret, port;
 
        for (port = 0; port < DSA_MAX_PORTS; port++) {
                if (!(dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)))
                        continue;
 
-               port_dn = ds->ports[port].dn;
-               ret = dsa_cpu_dsa_setup(ds, dev, port_dn, port);
+               dport = &ds->ports[port];
+               ret = dsa_cpu_dsa_setup(ds, dev, dport, port);
                if (ret)
                        return ret;
        }
        return ds;
 }
 
-void dsa_cpu_dsa_destroy(struct device_node *port_dn)
+void dsa_cpu_dsa_destroy(struct dsa_port *port)
 {
+       struct device_node *port_dn = port->dn;
+
        if (of_phy_is_fixed_link(port_dn))
                of_phy_deregister_fixed_link(port_dn);
 }
        for (port = 0; port < DSA_MAX_PORTS; port++) {
                if (!(dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)))
                        continue;
-               dsa_cpu_dsa_destroy(ds->ports[port].dn);
+               dsa_cpu_dsa_destroy(&ds->ports[port]);
 
                /* Clearing a bit which is not set does no harm */
                ds->cpu_port_mask |= ~(1 << port);
 
        kref_put(&dst->refcount, dsa_free_dst);
 }
 
-static bool dsa_port_is_dsa(struct device_node *port)
+static bool dsa_port_is_valid(struct dsa_port *port)
 {
-       return !!of_parse_phandle(port, "link", 0);
+       return !!port->dn;
 }
 
-static bool dsa_port_is_cpu(struct device_node *port)
+static bool dsa_port_is_dsa(struct dsa_port *port)
 {
-       return !!of_parse_phandle(port, "ethernet", 0);
+       return !!of_parse_phandle(port->dn, "link", 0);
+}
+
+static bool dsa_port_is_cpu(struct dsa_port *port)
+{
+       return !!of_parse_phandle(port->dn, "ethernet", 0);
 }
 
 static bool dsa_ds_find_port(struct dsa_switch *ds,
 
 static int dsa_port_complete(struct dsa_switch_tree *dst,
                             struct dsa_switch *src_ds,
-                            struct device_node *port,
+                            struct dsa_port *port,
                             u32 src_port)
 {
        struct device_node *link;
        struct dsa_switch *dst_ds;
 
        for (index = 0;; index++) {
-               link = of_parse_phandle(port, "link", index);
+               link = of_parse_phandle(port->dn, "link", index);
                if (!link)
                        break;
 
  */
 static int dsa_ds_complete(struct dsa_switch_tree *dst, struct dsa_switch *ds)
 {
-       struct device_node *port;
+       struct dsa_port *port;
        u32 index;
        int err;
 
        for (index = 0; index < DSA_MAX_PORTS; index++) {
-               port = ds->ports[index].dn;
-               if (!port)
+               port = &ds->ports[index];
+               if (!dsa_port_is_valid(port))
                        continue;
 
                if (!dsa_port_is_dsa(port))
        return 0;
 }
 
-static int dsa_dsa_port_apply(struct device_node *port, u32 index,
+static int dsa_dsa_port_apply(struct dsa_port *port, u32 index,
                              struct dsa_switch *ds)
 {
        int err;
        return 0;
 }
 
-static void dsa_dsa_port_unapply(struct device_node *port, u32 index,
+static void dsa_dsa_port_unapply(struct dsa_port *port, u32 index,
                                 struct dsa_switch *ds)
 {
        dsa_cpu_dsa_destroy(port);
 }
 
-static int dsa_cpu_port_apply(struct device_node *port, u32 index,
+static int dsa_cpu_port_apply(struct dsa_port *port, u32 index,
                              struct dsa_switch *ds)
 {
        int err;
        return 0;
 }
 
-static void dsa_cpu_port_unapply(struct device_node *port, u32 index,
+static void dsa_cpu_port_unapply(struct dsa_port *port, u32 index,
                                 struct dsa_switch *ds)
 {
        dsa_cpu_dsa_destroy(port);
 
 }
 
-static int dsa_user_port_apply(struct device_node *port, u32 index,
+static int dsa_user_port_apply(struct dsa_port *port, u32 index,
                               struct dsa_switch *ds)
 {
        const char *name;
        int err;
 
-       name = of_get_property(port, "label", NULL);
+       name = of_get_property(port->dn, "label", NULL);
        if (!name)
                name = "eth%d";
 
        return 0;
 }
 
-static void dsa_user_port_unapply(struct device_node *port, u32 index,
+static void dsa_user_port_unapply(struct dsa_port *port, u32 index,
                                  struct dsa_switch *ds)
 {
        if (ds->ports[index].netdev) {
 
 static int dsa_ds_apply(struct dsa_switch_tree *dst, struct dsa_switch *ds)
 {
-       struct device_node *port;
+       struct dsa_port *port;
        u32 index;
        int err;
 
        }
 
        for (index = 0; index < DSA_MAX_PORTS; index++) {
-               port = ds->ports[index].dn;
-               if (!port)
+               port = &ds->ports[index];
+               if (!dsa_port_is_valid(port))
                        continue;
 
                if (dsa_port_is_dsa(port)) {
 
 static void dsa_ds_unapply(struct dsa_switch_tree *dst, struct dsa_switch *ds)
 {
-       struct device_node *port;
+       struct dsa_port *port;
        u32 index;
 
        for (index = 0; index < DSA_MAX_PORTS; index++) {
-               port = ds->ports[index].dn;
-               if (!port)
+               port = &ds->ports[index];
+               if (!dsa_port_is_valid(port))
                        continue;
 
                if (dsa_port_is_dsa(port)) {
        dst->applied = false;
 }
 
-static int dsa_cpu_parse(struct device_node *port, u32 index,
+static int dsa_cpu_parse(struct dsa_port *port, u32 index,
                         struct dsa_switch_tree *dst,
                         struct dsa_switch *ds)
 {
        struct net_device *ethernet_dev;
        struct device_node *ethernet;
 
-       ethernet = of_parse_phandle(port, "ethernet", 0);
+       ethernet = of_parse_phandle(port->dn, "ethernet", 0);
        if (!ethernet)
                return -EINVAL;
 
 
 static int dsa_ds_parse(struct dsa_switch_tree *dst, struct dsa_switch *ds)
 {
-       struct device_node *port;
+       struct dsa_port *port;
        u32 index;
        int err;
 
        for (index = 0; index < DSA_MAX_PORTS; index++) {
-               port = ds->ports[index].dn;
-               if (!port)
+               port = &ds->ports[index];
+               if (!dsa_port_is_valid(port))
                        continue;
 
                if (dsa_port_is_cpu(port)) {
                 * to have access to a correct value, just like what
                 * net/dsa/dsa.c::dsa_switch_setup_one does.
                 */
-               if (!dsa_port_is_cpu(port))
+               if (!dsa_port_is_cpu(&ds->ports[reg]))
                        ds->enabled_port_mask |= 1 << reg;
        }