Commit f38e7a32 authored by Woojung.Huh@microchip.com's avatar Woojung.Huh@microchip.com Committed by David S. Miller

phy: add phy fixup unregister functions

>From : Woojung Huh <woojung.huh@microchip.com>

Add functions to unregister phy fixup for modules.

int phy_unregister_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask)
	Unregister phy fixup from phy_fixup_list per bus_id, phy_uid &
	phy_uid_mask

int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask)
	Unregister phy fixup from phy_fixup_list.
	Use it for fixup registered by phy_register_fixup_for_uid()

int phy_unregister_fixup_for_id(const char *bus_id)
	Unregister phy fixup from phy_fixup_list.
	Use it for fixup registered by phy_register_fixup_for_id()
Signed-off-by: default avatarWoojung Huh <woojung.huh@microchip.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d2a4dd37
...@@ -407,6 +407,15 @@ Board Fixups ...@@ -407,6 +407,15 @@ Board Fixups
The stubs set one of the two matching criteria, and set the other one to The stubs set one of the two matching criteria, and set the other one to
match anything. match anything.
When phy_register_fixup() or *_for_uid()/*_for_id() is called at module,
unregister fixup and free allocate memory are required.
Call one of following function before unloading module.
int phy_unregister_fixup(const char *phy_id, u32 phy_uid, u32 phy_uid_mask);
int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask);
int phy_register_fixup_for_id(const char *phy_id);
Standards Standards
IEEE Standard 802.3: CSMA/CD Access Method and Physical Layer Specifications, Section Two: IEEE Standard 802.3: CSMA/CD Access Method and Physical Layer Specifications, Section Two:
......
...@@ -235,6 +235,53 @@ int phy_register_fixup_for_id(const char *bus_id, ...@@ -235,6 +235,53 @@ int phy_register_fixup_for_id(const char *bus_id,
} }
EXPORT_SYMBOL(phy_register_fixup_for_id); EXPORT_SYMBOL(phy_register_fixup_for_id);
/**
* phy_unregister_fixup - remove a phy_fixup from the list
* @bus_id: A string matches fixup->bus_id (or PHY_ANY_ID) in phy_fixup_list
* @phy_uid: A phy id matches fixup->phy_id (or PHY_ANY_UID) in phy_fixup_list
* @phy_uid_mask: Applied to phy_uid and fixup->phy_uid before comparison
*/
int phy_unregister_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask)
{
struct list_head *pos, *n;
struct phy_fixup *fixup;
int ret;
ret = -ENODEV;
mutex_lock(&phy_fixup_lock);
list_for_each_safe(pos, n, &phy_fixup_list) {
fixup = list_entry(pos, struct phy_fixup, list);
if ((!strcmp(fixup->bus_id, bus_id)) &&
((fixup->phy_uid & phy_uid_mask) ==
(phy_uid & phy_uid_mask))) {
list_del(&fixup->list);
kfree(fixup);
ret = 0;
break;
}
}
mutex_unlock(&phy_fixup_lock);
return ret;
}
EXPORT_SYMBOL(phy_unregister_fixup);
/* Unregisters a fixup of any PHY with the UID in phy_uid */
int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask)
{
return phy_unregister_fixup(PHY_ANY_ID, phy_uid, phy_uid_mask);
}
EXPORT_SYMBOL(phy_unregister_fixup_for_uid);
/* Unregisters a fixup of the PHY with id string bus_id */
int phy_unregister_fixup_for_id(const char *bus_id)
{
return phy_unregister_fixup(bus_id, PHY_ANY_UID, 0xffffffff);
}
EXPORT_SYMBOL(phy_unregister_fixup_for_id);
/* Returns 1 if fixup matches phydev in bus_id and phy_uid. /* Returns 1 if fixup matches phydev in bus_id and phy_uid.
* Fixups can be set to match any in one or more fields. * Fixups can be set to match any in one or more fields.
*/ */
......
...@@ -860,6 +860,10 @@ int phy_register_fixup_for_id(const char *bus_id, ...@@ -860,6 +860,10 @@ int phy_register_fixup_for_id(const char *bus_id,
int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask, int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
int (*run)(struct phy_device *)); int (*run)(struct phy_device *));
int phy_unregister_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask);
int phy_unregister_fixup_for_id(const char *bus_id);
int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask);
int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable); int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable);
int phy_get_eee_err(struct phy_device *phydev); int phy_get_eee_err(struct phy_device *phydev);
int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data); int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment