net: fec_mxc: fix remove with DM_MDIO

If DM_MDIO is used and the FEC device is removed the mdio API
must not be used to remove the bus structure. Store pointer the
the udevice for MDIO bus created by dm_fec_bind_mdio and use DM
functions to cleanup the device in fecmxc_remove.

Fixes: 3b8f99a3e762 ("net: fec: add support for DM_MDIO")

Signed-off-by: Markus Niebel <Markus.Niebel@ew.tq-group.com>
Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Signed-off-by: Alexander Feilke <alexander.feilke@ew.tq-group.com>
This commit is contained in:
Markus Niebel 2025-11-21 18:34:44 +01:00 committed by Fabio Estevam
parent 206f38e8dd
commit aafdd85694
2 changed files with 16 additions and 1 deletions

View File

@ -9,6 +9,7 @@
#include <cpu_func.h>
#include <dm.h>
#include <dm/device-internal.h>
#include <env.h>
#include <log.h>
#include <malloc.h>
@ -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)

View File

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