diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index 18c717855b4..69a76e879b1 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -1089,8 +1090,12 @@ static int dm_fec_bind_mdio(struct udevice *dev) /* need to probe it as there is no compatible to do so */ ret = uclass_get_device_by_ofnode(UCLASS_MDIO, mdio, &mdiodev); - if (!ret) + if (!ret) { + struct fec_priv *priv = dev_get_priv(dev); + + priv->mdio_bus = mdiodev; return 0; + } printf("%s probe %s failed: %d\n", __func__, name, ret); } @@ -1431,8 +1436,15 @@ static int fecmxc_remove(struct udevice *dev) free(priv->phydev); fec_free_descs(priv); +#ifdef CONFIG_DM_MDIO + if (priv->mdio_bus) { + device_remove(priv->mdio_bus, DM_REMOVE_NORMAL); + device_unbind(priv->mdio_bus); + } +#else mdio_unregister(priv->bus); mdio_free(priv->bus); +#endif #ifdef CONFIG_DM_REGULATOR if (priv->phy_supply) diff --git a/drivers/net/fec_mxc.h b/drivers/net/fec_mxc.h index 77bfc1cbf45..12cc00423fa 100644 --- a/drivers/net/fec_mxc.h +++ b/drivers/net/fec_mxc.h @@ -255,6 +255,9 @@ struct fec_priv { int phy_id; int (*mii_postcall)(int); #endif +#ifdef CONFIG_DM_MDIO + struct udevice *mdio_bus; +#endif #ifdef CONFIG_DM_REGULATOR struct udevice *phy_supply; #endif