forked from torvalds/linux
Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
net: mdiobus: Introduce fwnode_mdiobus_register_phy()
Introduce fwnode_mdiobus_register_phy() to register PHYs on the mdiobus. From the compatible string, identify whether the PHY is c45 and based on this create a PHY device instance which is registered on the mdiobus. uninitialized symbol 'mii_ts' Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Calvin Johnson <calvin.johnson@oss.nxp.com>
- Loading branch information
1 parent
9aa1b8b
commit d6150b3cf85a42cb75a1d93b64ce7cdf8e58d4d9
Showing
7 changed files
with
120 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| // SPDX-License-Identifier: GPL-2.0-only | ||
| /* | ||
| * fwnode helpers for the MDIO (Ethernet PHY) API | ||
| * | ||
| * This file provides helper functions for extracting PHY device information | ||
| * out of the fwnode and using it to populate an mii_bus. | ||
| */ | ||
|
|
||
| #include <linux/acpi.h> | ||
| #include <linux/of.h> | ||
| #include <linux/of_mdio.h> | ||
| #include <linux/phy.h> | ||
|
|
||
| MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>"); | ||
| MODULE_LICENSE("GPL"); | ||
|
|
||
| int fwnode_mdiobus_register_phy(struct mii_bus *bus, | ||
| struct fwnode_handle *child, u32 addr) | ||
| { | ||
| struct mii_timestamper *mii_ts = NULL; | ||
| struct phy_device *phy; | ||
| bool is_c45 = false; | ||
| u32 phy_id; | ||
| int rc; | ||
|
|
||
| if (is_of_node(child)) { | ||
| mii_ts = of_find_mii_timestamper(to_of_node(child)); | ||
| if (IS_ERR(mii_ts)) | ||
| return PTR_ERR(mii_ts); | ||
| } | ||
|
|
||
| rc = fwnode_property_match_string(child, "compatible", "ethernet-phy-ieee802.3-c45"); | ||
| if (rc >= 0) | ||
| is_c45 = true; | ||
|
|
||
| if (is_c45 || fwnode_get_phy_id(child, &phy_id)) | ||
| phy = get_phy_device(bus, addr, is_c45); | ||
| else | ||
| phy = phy_device_create(bus, addr, phy_id, 0, NULL); | ||
| if (IS_ERR(phy)) { | ||
| unregister_mii_timestamper(mii_ts); | ||
| return PTR_ERR(phy); | ||
| } | ||
|
|
||
| if (is_acpi_node(child)) { | ||
| phy->irq = bus->irq[addr]; | ||
|
|
||
| /* Associate the fwnode with the device structure so it | ||
| * can be looked up later. | ||
| */ | ||
| phy->mdio.dev.fwnode = child; | ||
|
|
||
| /* All data is now stored in the phy struct, so register it */ | ||
| rc = phy_device_register(phy); | ||
| if (rc) { | ||
| phy_device_free(phy); | ||
| fwnode_handle_put(phy->mdio.dev.fwnode); | ||
| return rc; | ||
| } | ||
| } else if (is_of_node(child)) { | ||
| rc = of_mdiobus_phy_device_register(bus, phy, to_of_node(child), addr); | ||
| if (rc) { | ||
| unregister_mii_timestamper(mii_ts); | ||
| phy_device_free(phy); | ||
| return rc; | ||
| } | ||
| } | ||
|
|
||
| /* phy->mii_ts may already be defined by the PHY driver. A | ||
| * mii_timestamper probed via the device tree will still have | ||
| * precedence. | ||
| */ | ||
| if (mii_ts) | ||
| phy->mii_ts = mii_ts; | ||
| return 0; | ||
| } | ||
| EXPORT_SYMBOL(fwnode_mdiobus_register_phy); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||
| /* | ||
| * FWNODE helper for the MDIO (Ethernet PHY) API | ||
| */ | ||
|
|
||
| #ifndef __LINUX_FWNODE_MDIO_H | ||
| #define __LINUX_FWNODE_MDIO_H | ||
|
|
||
| #include <linux/phy.h> | ||
|
|
||
| #if IS_ENABLED(CONFIG_FWNODE_MDIO) | ||
| int fwnode_mdiobus_register_phy(struct mii_bus *bus, | ||
| struct fwnode_handle *child, u32 addr); | ||
|
|
||
| #else /* CONFIG_FWNODE_MDIO */ | ||
| static inline int fwnode_mdiobus_register_phy(struct mii_bus *bus, | ||
| struct fwnode_handle *child, | ||
| u32 addr) | ||
| { | ||
| return -EINVAL; | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* __LINUX_FWNODE_MDIO_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters