Commit 3f65047c authored by Johan Hovold's avatar Johan Hovold Committed by David S. Miller

of_mdio: add helper to deregister fixed-link PHYs

Add helper to deregister fixed-link PHYs registered using
of_phy_register_fixed_link().

Convert the two drivers that care to deregister their fixed-link PHYs to
use the new helper, but note that most drivers currently fail to do so.
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0d8f3c67
...@@ -2459,20 +2459,8 @@ static void cpsw_remove_dt(struct platform_device *pdev) ...@@ -2459,20 +2459,8 @@ static void cpsw_remove_dt(struct platform_device *pdev)
if (strcmp(slave_node->name, "slave")) if (strcmp(slave_node->name, "slave"))
continue; continue;
if (of_phy_is_fixed_link(slave_node)) { if (of_phy_is_fixed_link(slave_node))
struct phy_device *phydev; of_phy_deregister_fixed_link(slave_node);
phydev = of_phy_find_device(slave_node);
if (phydev) {
fixed_phy_unregister(phydev);
/* Put references taken by
* of_phy_find_device() and
* of_phy_register_fixed_link().
*/
phy_device_free(phydev);
phy_device_free(phydev);
}
}
of_node_put(slave_data->phy_node); of_node_put(slave_data->phy_node);
......
...@@ -490,3 +490,18 @@ int of_phy_register_fixed_link(struct device_node *np) ...@@ -490,3 +490,18 @@ int of_phy_register_fixed_link(struct device_node *np)
return -ENODEV; return -ENODEV;
} }
EXPORT_SYMBOL(of_phy_register_fixed_link); EXPORT_SYMBOL(of_phy_register_fixed_link);
void of_phy_deregister_fixed_link(struct device_node *np)
{
struct phy_device *phydev;
phydev = of_phy_find_device(np);
if (!phydev)
return;
fixed_phy_unregister(phydev);
put_device(&phydev->mdio.dev); /* of_phy_find_device() */
phy_device_free(phydev); /* fixed_phy_register() */
}
EXPORT_SYMBOL(of_phy_deregister_fixed_link);
...@@ -29,6 +29,7 @@ struct phy_device *of_phy_attach(struct net_device *dev, ...@@ -29,6 +29,7 @@ struct phy_device *of_phy_attach(struct net_device *dev,
extern struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np); extern struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np);
extern int of_mdio_parse_addr(struct device *dev, const struct device_node *np); extern int of_mdio_parse_addr(struct device *dev, const struct device_node *np);
extern int of_phy_register_fixed_link(struct device_node *np); extern int of_phy_register_fixed_link(struct device_node *np);
extern void of_phy_deregister_fixed_link(struct device_node *np);
extern bool of_phy_is_fixed_link(struct device_node *np); extern bool of_phy_is_fixed_link(struct device_node *np);
#else /* CONFIG_OF */ #else /* CONFIG_OF */
...@@ -83,6 +84,9 @@ static inline int of_phy_register_fixed_link(struct device_node *np) ...@@ -83,6 +84,9 @@ static inline int of_phy_register_fixed_link(struct device_node *np)
{ {
return -ENOSYS; return -ENOSYS;
} }
static inline void of_phy_deregister_fixed_link(struct device_node *np)
{
}
static inline bool of_phy_is_fixed_link(struct device_node *np) static inline bool of_phy_is_fixed_link(struct device_node *np)
{ {
return false; return false;
......
...@@ -506,16 +506,8 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index, ...@@ -506,16 +506,8 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
void dsa_cpu_dsa_destroy(struct device_node *port_dn) void dsa_cpu_dsa_destroy(struct device_node *port_dn)
{ {
struct phy_device *phydev; if (of_phy_is_fixed_link(port_dn))
of_phy_deregister_fixed_link(port_dn);
if (of_phy_is_fixed_link(port_dn)) {
phydev = of_phy_find_device(port_dn);
if (phydev) {
fixed_phy_unregister(phydev);
put_device(&phydev->mdio.dev);
phy_device_free(phydev);
}
}
} }
static void dsa_switch_destroy(struct dsa_switch *ds) static void dsa_switch_destroy(struct dsa_switch *ds)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment