diff options
Diffstat (limited to 'drivers/net/phy/phy_device.c')
-rw-r--r-- | drivers/net/phy/phy_device.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index aeaf1bcb12d0..32fa7c76f29c 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
@@ -235,6 +235,53 @@ int phy_register_fixup_for_id(const char *bus_id, | |||
235 | } | 235 | } |
236 | EXPORT_SYMBOL(phy_register_fixup_for_id); | 236 | EXPORT_SYMBOL(phy_register_fixup_for_id); |
237 | 237 | ||
238 | /** | ||
239 | * phy_unregister_fixup - remove a phy_fixup from the list | ||
240 | * @bus_id: A string matches fixup->bus_id (or PHY_ANY_ID) in phy_fixup_list | ||
241 | * @phy_uid: A phy id matches fixup->phy_id (or PHY_ANY_UID) in phy_fixup_list | ||
242 | * @phy_uid_mask: Applied to phy_uid and fixup->phy_uid before comparison | ||
243 | */ | ||
244 | int phy_unregister_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask) | ||
245 | { | ||
246 | struct list_head *pos, *n; | ||
247 | struct phy_fixup *fixup; | ||
248 | int ret; | ||
249 | |||
250 | ret = -ENODEV; | ||
251 | |||
252 | mutex_lock(&phy_fixup_lock); | ||
253 | list_for_each_safe(pos, n, &phy_fixup_list) { | ||
254 | fixup = list_entry(pos, struct phy_fixup, list); | ||
255 | |||
256 | if ((!strcmp(fixup->bus_id, bus_id)) && | ||
257 | ((fixup->phy_uid & phy_uid_mask) == | ||
258 | (phy_uid & phy_uid_mask))) { | ||
259 | list_del(&fixup->list); | ||
260 | kfree(fixup); | ||
261 | ret = 0; | ||
262 | break; | ||
263 | } | ||
264 | } | ||
265 | mutex_unlock(&phy_fixup_lock); | ||
266 | |||
267 | return ret; | ||
268 | } | ||
269 | EXPORT_SYMBOL(phy_unregister_fixup); | ||
270 | |||
271 | /* Unregisters a fixup of any PHY with the UID in phy_uid */ | ||
272 | int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask) | ||
273 | { | ||
274 | return phy_unregister_fixup(PHY_ANY_ID, phy_uid, phy_uid_mask); | ||
275 | } | ||
276 | EXPORT_SYMBOL(phy_unregister_fixup_for_uid); | ||
277 | |||
278 | /* Unregisters a fixup of the PHY with id string bus_id */ | ||
279 | int phy_unregister_fixup_for_id(const char *bus_id) | ||
280 | { | ||
281 | return phy_unregister_fixup(bus_id, PHY_ANY_UID, 0xffffffff); | ||
282 | } | ||
283 | EXPORT_SYMBOL(phy_unregister_fixup_for_id); | ||
284 | |||
238 | /* Returns 1 if fixup matches phydev in bus_id and phy_uid. | 285 | /* Returns 1 if fixup matches phydev in bus_id and phy_uid. |
239 | * Fixups can be set to match any in one or more fields. | 286 | * Fixups can be set to match any in one or more fields. |
240 | */ | 287 | */ |