net: dsa: Add helper function to obtain PHY device of a given port
authorFlorian Fainelli <f.fainelli@gmail.com>
Wed, 25 Apr 2018 19:12:51 +0000 (12:12 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 27 Apr 2018 15:53:03 +0000 (11:53 -0400)
In preparation for having more call sites attempting to obtain a
reference against a PHY device corresponding to a particular port,
introduce a helper function for that purpose.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/dsa/port.c

index 7acc116..5e2a887 100644 (file)
@@ -273,25 +273,38 @@ int dsa_port_vlan_del(struct dsa_port *dp,
        return 0;
 }
 
-static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable)
+static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp)
 {
-       struct device_node *port_dn = dp->dn;
        struct device_node *phy_dn;
-       struct dsa_switch *ds = dp->ds;
        struct phy_device *phydev;
-       int port = dp->index;
-       int err = 0;
 
-       phy_dn = of_parse_phandle(port_dn, "phy-handle", 0);
+       phy_dn = of_parse_phandle(dp->dn, "phy-handle", 0);
        if (!phy_dn)
-               return 0;
+               return NULL;
 
        phydev = of_phy_find_device(phy_dn);
        if (!phydev) {
-               err = -EPROBE_DEFER;
-               goto err_put_of;
+               of_node_put(phy_dn);
+               return ERR_PTR(-EPROBE_DEFER);
        }
 
+       return phydev;
+}
+
+static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable)
+{
+       struct dsa_switch *ds = dp->ds;
+       struct phy_device *phydev;
+       int port = dp->index;
+       int err = 0;
+
+       phydev = dsa_port_get_phy_device(dp);
+       if (!phydev)
+               return 0;
+
+       if (IS_ERR(phydev))
+               return PTR_ERR(phydev);
+
        if (enable) {
                err = genphy_config_init(phydev);
                if (err < 0)
@@ -317,8 +330,6 @@ static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable)
 
 err_put_dev:
        put_device(&phydev->mdio.dev);
-err_put_of:
-       of_node_put(phy_dn);
        return err;
 }