Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −14
Original line number Diff line number Diff line
@@ -2459,20 +2459,8 @@ static void cpsw_remove_dt(struct platform_device *pdev)
		if (strcmp(slave_node->name, "slave"))
			continue;

		if (of_phy_is_fixed_link(slave_node)) {
			struct phy_device *phydev;

			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);
			}
		}
		if (of_phy_is_fixed_link(slave_node))
			of_phy_deregister_fixed_link(slave_node);

		of_node_put(slave_data->phy_node);

+15 −0
Original line number Diff line number Diff line
@@ -490,3 +490,18 @@ int of_phy_register_fixed_link(struct device_node *np)
	return -ENODEV;
}
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);
+4 −0
Original line number Diff line number Diff line
@@ -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 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 void of_phy_deregister_fixed_link(struct device_node *np);
extern bool of_phy_is_fixed_link(struct device_node *np);

#else /* CONFIG_OF */
@@ -83,6 +84,9 @@ static inline int of_phy_register_fixed_link(struct device_node *np)
{
	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)
{
	return false;
+2 −10
Original line number Diff line number Diff line
@@ -506,16 +506,8 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,

void dsa_cpu_dsa_destroy(struct device_node *port_dn)
{
	struct phy_device *phydev;

	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);
		}
	}
	if (of_phy_is_fixed_link(port_dn))
		of_phy_deregister_fixed_link(port_dn);
}

static void dsa_switch_destroy(struct dsa_switch *ds)