diff options
Diffstat (limited to 'drivers/net/phy/mdio_bus.c')
-rw-r--r-- | drivers/net/phy/mdio_bus.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 02a4615b65f8..12f44c53cc8e 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c | |||
@@ -167,7 +167,9 @@ static int of_mdio_bus_match(struct device *dev, const void *mdio_bus_np) | |||
167 | * of_mdio_find_bus - Given an mii_bus node, find the mii_bus. | 167 | * of_mdio_find_bus - Given an mii_bus node, find the mii_bus. |
168 | * @mdio_bus_np: Pointer to the mii_bus. | 168 | * @mdio_bus_np: Pointer to the mii_bus. |
169 | * | 169 | * |
170 | * Returns a pointer to the mii_bus, or NULL if none found. | 170 | * Returns a reference to the mii_bus, or NULL if none found. The |
171 | * embedded struct device will have its reference count incremented, | ||
172 | * and this must be put once the bus is finished with. | ||
171 | * | 173 | * |
172 | * Because the association of a device_node and mii_bus is made via | 174 | * Because the association of a device_node and mii_bus is made via |
173 | * of_mdiobus_register(), the mii_bus cannot be found before it is | 175 | * of_mdiobus_register(), the mii_bus cannot be found before it is |
@@ -234,15 +236,18 @@ static inline void of_mdiobus_link_phydev(struct mii_bus *mdio, | |||
234 | #endif | 236 | #endif |
235 | 237 | ||
236 | /** | 238 | /** |
237 | * mdiobus_register - bring up all the PHYs on a given bus and attach them to bus | 239 | * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus |
238 | * @bus: target mii_bus | 240 | * @bus: target mii_bus |
241 | * @owner: module containing bus accessor functions | ||
239 | * | 242 | * |
240 | * Description: Called by a bus driver to bring up all the PHYs | 243 | * Description: Called by a bus driver to bring up all the PHYs |
241 | * on a given bus, and attach them to the bus. | 244 | * on a given bus, and attach them to the bus. Drivers should use |
245 | * mdiobus_register() rather than __mdiobus_register() unless they | ||
246 | * need to pass a specific owner module. | ||
242 | * | 247 | * |
243 | * Returns 0 on success or < 0 on error. | 248 | * Returns 0 on success or < 0 on error. |
244 | */ | 249 | */ |
245 | int mdiobus_register(struct mii_bus *bus) | 250 | int __mdiobus_register(struct mii_bus *bus, struct module *owner) |
246 | { | 251 | { |
247 | int i, err; | 252 | int i, err; |
248 | 253 | ||
@@ -253,6 +258,7 @@ int mdiobus_register(struct mii_bus *bus) | |||
253 | BUG_ON(bus->state != MDIOBUS_ALLOCATED && | 258 | BUG_ON(bus->state != MDIOBUS_ALLOCATED && |
254 | bus->state != MDIOBUS_UNREGISTERED); | 259 | bus->state != MDIOBUS_UNREGISTERED); |
255 | 260 | ||
261 | bus->owner = owner; | ||
256 | bus->dev.parent = bus->parent; | 262 | bus->dev.parent = bus->parent; |
257 | bus->dev.class = &mdio_bus_class; | 263 | bus->dev.class = &mdio_bus_class; |
258 | bus->dev.groups = NULL; | 264 | bus->dev.groups = NULL; |
@@ -288,13 +294,16 @@ int mdiobus_register(struct mii_bus *bus) | |||
288 | 294 | ||
289 | error: | 295 | error: |
290 | while (--i >= 0) { | 296 | while (--i >= 0) { |
291 | if (bus->phy_map[i]) | 297 | struct phy_device *phydev = bus->phy_map[i]; |
292 | device_unregister(&bus->phy_map[i]->dev); | 298 | if (phydev) { |
299 | phy_device_remove(phydev); | ||
300 | phy_device_free(phydev); | ||
301 | } | ||
293 | } | 302 | } |
294 | device_del(&bus->dev); | 303 | device_del(&bus->dev); |
295 | return err; | 304 | return err; |
296 | } | 305 | } |
297 | EXPORT_SYMBOL(mdiobus_register); | 306 | EXPORT_SYMBOL(__mdiobus_register); |
298 | 307 | ||
299 | void mdiobus_unregister(struct mii_bus *bus) | 308 | void mdiobus_unregister(struct mii_bus *bus) |
300 | { | 309 | { |
@@ -304,9 +313,11 @@ void mdiobus_unregister(struct mii_bus *bus) | |||
304 | bus->state = MDIOBUS_UNREGISTERED; | 313 | bus->state = MDIOBUS_UNREGISTERED; |
305 | 314 | ||
306 | for (i = 0; i < PHY_MAX_ADDR; i++) { | 315 | for (i = 0; i < PHY_MAX_ADDR; i++) { |
307 | if (bus->phy_map[i]) | 316 | struct phy_device *phydev = bus->phy_map[i]; |
308 | device_unregister(&bus->phy_map[i]->dev); | 317 | if (phydev) { |
309 | bus->phy_map[i] = NULL; | 318 | phy_device_remove(phydev); |
319 | phy_device_free(phydev); | ||
320 | } | ||
310 | } | 321 | } |
311 | device_del(&bus->dev); | 322 | device_del(&bus->dev); |
312 | } | 323 | } |