|
@@ -632,6 +632,9 @@ int phy_device_register(struct phy_device *phydev)
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
|
+ /* Deassert the reset signal */
|
|
|
+ phy_device_reset(phydev, 0);
|
|
|
+
|
|
|
/* Run all of the fixups for this PHY */
|
|
|
err = phy_scan_fixups(phydev);
|
|
|
if (err) {
|
|
@@ -650,6 +653,9 @@ int phy_device_register(struct phy_device *phydev)
|
|
|
return 0;
|
|
|
|
|
|
out:
|
|
|
+ /* Assert the reset signal */
|
|
|
+ phy_device_reset(phydev, 1);
|
|
|
+
|
|
|
mdiobus_unregister_device(&phydev->mdio);
|
|
|
return err;
|
|
|
}
|
|
@@ -666,6 +672,10 @@ EXPORT_SYMBOL(phy_device_register);
|
|
|
void phy_device_remove(struct phy_device *phydev)
|
|
|
{
|
|
|
device_del(&phydev->mdio.dev);
|
|
|
+
|
|
|
+ /* Assert the reset signal */
|
|
|
+ phy_device_reset(phydev, 1);
|
|
|
+
|
|
|
mdiobus_unregister_device(&phydev->mdio);
|
|
|
}
|
|
|
EXPORT_SYMBOL(phy_device_remove);
|
|
@@ -849,6 +859,9 @@ int phy_init_hw(struct phy_device *phydev)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
|
|
|
+ /* Deassert the reset signal */
|
|
|
+ phy_device_reset(phydev, 0);
|
|
|
+
|
|
|
if (!phydev->drv || !phydev->drv->config_init)
|
|
|
return 0;
|
|
|
|
|
@@ -1126,6 +1139,9 @@ void phy_detach(struct phy_device *phydev)
|
|
|
put_device(&phydev->mdio.dev);
|
|
|
if (ndev_owner != bus->owner)
|
|
|
module_put(bus->owner);
|
|
|
+
|
|
|
+ /* Assert the reset signal */
|
|
|
+ phy_device_reset(phydev, 1);
|
|
|
}
|
|
|
EXPORT_SYMBOL(phy_detach);
|
|
|
|
|
@@ -1811,8 +1827,16 @@ static int phy_probe(struct device *dev)
|
|
|
/* Set the state to READY by default */
|
|
|
phydev->state = PHY_READY;
|
|
|
|
|
|
- if (phydev->drv->probe)
|
|
|
+ if (phydev->drv->probe) {
|
|
|
+ /* Deassert the reset signal */
|
|
|
+ phy_device_reset(phydev, 0);
|
|
|
+
|
|
|
err = phydev->drv->probe(phydev);
|
|
|
+ if (err) {
|
|
|
+ /* Assert the reset signal */
|
|
|
+ phy_device_reset(phydev, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
mutex_unlock(&phydev->lock);
|
|
|
|
|
@@ -1829,8 +1853,12 @@ static int phy_remove(struct device *dev)
|
|
|
phydev->state = PHY_DOWN;
|
|
|
mutex_unlock(&phydev->lock);
|
|
|
|
|
|
- if (phydev->drv && phydev->drv->remove)
|
|
|
+ if (phydev->drv && phydev->drv->remove) {
|
|
|
phydev->drv->remove(phydev);
|
|
|
+
|
|
|
+ /* Assert the reset signal */
|
|
|
+ phy_device_reset(phydev, 1);
|
|
|
+ }
|
|
|
phydev->drv = NULL;
|
|
|
|
|
|
return 0;
|