|
@@ -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;
|
|
|
}
|
|
|
|