Commit 543887d7 authored by David S. Miller's avatar David S. Miller

Merge branch 'mdiobus-module-owner'

Florian Fainelli says:

====================
ACPI/DT mdiobus module owner fixes

This patch series fixes wrong mdiobus module ownership for MDIO buses
registered from DT or ACPI.

Thanks Maxime for providing the first patch and making me see that ACPI
also had the same issue.

Changes in v2:

- fixed missing kdoc in the first patch
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 4203d840 30b605b8
...@@ -18,16 +18,18 @@ MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>"); ...@@ -18,16 +18,18 @@ MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
/** /**
* acpi_mdiobus_register - Register mii_bus and create PHYs from the ACPI ASL. * __acpi_mdiobus_register - Register mii_bus and create PHYs from the ACPI ASL.
* @mdio: pointer to mii_bus structure * @mdio: pointer to mii_bus structure
* @fwnode: pointer to fwnode of MDIO bus. This fwnode is expected to represent * @fwnode: pointer to fwnode of MDIO bus. This fwnode is expected to represent
* @owner: module owning this @mdio object.
* an ACPI device object corresponding to the MDIO bus and its children are * an ACPI device object corresponding to the MDIO bus and its children are
* expected to correspond to the PHY devices on that bus. * expected to correspond to the PHY devices on that bus.
* *
* This function registers the mii_bus structure and registers a phy_device * This function registers the mii_bus structure and registers a phy_device
* for each child node of @fwnode. * for each child node of @fwnode.
*/ */
int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode) int __acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode,
struct module *owner)
{ {
struct fwnode_handle *child; struct fwnode_handle *child;
u32 addr; u32 addr;
...@@ -35,7 +37,7 @@ int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode) ...@@ -35,7 +37,7 @@ int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode)
/* Mask out all PHYs from auto probing. */ /* Mask out all PHYs from auto probing. */
mdio->phy_mask = GENMASK(31, 0); mdio->phy_mask = GENMASK(31, 0);
ret = mdiobus_register(mdio); ret = __mdiobus_register(mdio, owner);
if (ret) if (ret)
return ret; return ret;
...@@ -55,4 +57,4 @@ int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode) ...@@ -55,4 +57,4 @@ int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode)
} }
return 0; return 0;
} }
EXPORT_SYMBOL(acpi_mdiobus_register); EXPORT_SYMBOL(__acpi_mdiobus_register);
...@@ -139,21 +139,23 @@ bool of_mdiobus_child_is_phy(struct device_node *child) ...@@ -139,21 +139,23 @@ bool of_mdiobus_child_is_phy(struct device_node *child)
EXPORT_SYMBOL(of_mdiobus_child_is_phy); EXPORT_SYMBOL(of_mdiobus_child_is_phy);
/** /**
* of_mdiobus_register - Register mii_bus and create PHYs from the device tree * __of_mdiobus_register - Register mii_bus and create PHYs from the device tree
* @mdio: pointer to mii_bus structure * @mdio: pointer to mii_bus structure
* @np: pointer to device_node of MDIO bus. * @np: pointer to device_node of MDIO bus.
* @owner: module owning the @mdio object.
* *
* This function registers the mii_bus structure and registers a phy_device * This function registers the mii_bus structure and registers a phy_device
* for each child node of @np. * for each child node of @np.
*/ */
int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) int __of_mdiobus_register(struct mii_bus *mdio, struct device_node *np,
struct module *owner)
{ {
struct device_node *child; struct device_node *child;
bool scanphys = false; bool scanphys = false;
int addr, rc; int addr, rc;
if (!np) if (!np)
return mdiobus_register(mdio); return __mdiobus_register(mdio, owner);
/* Do not continue if the node is disabled */ /* Do not continue if the node is disabled */
if (!of_device_is_available(np)) if (!of_device_is_available(np))
...@@ -172,7 +174,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) ...@@ -172,7 +174,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
of_property_read_u32(np, "reset-post-delay-us", &mdio->reset_post_delay_us); of_property_read_u32(np, "reset-post-delay-us", &mdio->reset_post_delay_us);
/* Register the MDIO bus */ /* Register the MDIO bus */
rc = mdiobus_register(mdio); rc = __mdiobus_register(mdio, owner);
if (rc) if (rc)
return rc; return rc;
...@@ -236,7 +238,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) ...@@ -236,7 +238,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
mdiobus_unregister(mdio); mdiobus_unregister(mdio);
return rc; return rc;
} }
EXPORT_SYMBOL(of_mdiobus_register); EXPORT_SYMBOL(__of_mdiobus_register);
/** /**
* of_mdio_find_device - Given a device tree node, find the mdio_device * of_mdio_find_device - Given a device tree node, find the mdio_device
......
...@@ -98,13 +98,14 @@ EXPORT_SYMBOL(__devm_mdiobus_register); ...@@ -98,13 +98,14 @@ EXPORT_SYMBOL(__devm_mdiobus_register);
#if IS_ENABLED(CONFIG_OF_MDIO) #if IS_ENABLED(CONFIG_OF_MDIO)
/** /**
* devm_of_mdiobus_register - Resource managed variant of of_mdiobus_register() * __devm_of_mdiobus_register - Resource managed variant of of_mdiobus_register()
* @dev: Device to register mii_bus for * @dev: Device to register mii_bus for
* @mdio: MII bus structure to register * @mdio: MII bus structure to register
* @np: Device node to parse * @np: Device node to parse
* @owner: Owning module
*/ */
int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio, int __devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
struct device_node *np) struct device_node *np, struct module *owner)
{ {
struct mdiobus_devres *dr; struct mdiobus_devres *dr;
int ret; int ret;
...@@ -117,7 +118,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio, ...@@ -117,7 +118,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
if (!dr) if (!dr)
return -ENOMEM; return -ENOMEM;
ret = of_mdiobus_register(mdio, np); ret = __of_mdiobus_register(mdio, np, owner);
if (ret) { if (ret) {
devres_free(dr); devres_free(dr);
return ret; return ret;
...@@ -127,7 +128,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio, ...@@ -127,7 +128,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
devres_add(dev, dr); devres_add(dev, dr);
return 0; return 0;
} }
EXPORT_SYMBOL(devm_of_mdiobus_register); EXPORT_SYMBOL(__devm_of_mdiobus_register);
#endif /* CONFIG_OF_MDIO */ #endif /* CONFIG_OF_MDIO */
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -9,7 +9,14 @@ ...@@ -9,7 +9,14 @@
#include <linux/phy.h> #include <linux/phy.h>
#if IS_ENABLED(CONFIG_ACPI_MDIO) #if IS_ENABLED(CONFIG_ACPI_MDIO)
int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode); int __acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode,
struct module *owner);
static inline int
acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *handle)
{
return __acpi_mdiobus_register(mdio, handle, THIS_MODULE);
}
#else /* CONFIG_ACPI_MDIO */ #else /* CONFIG_ACPI_MDIO */
static inline int static inline int
acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode) acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode)
......
...@@ -14,9 +14,25 @@ ...@@ -14,9 +14,25 @@
#if IS_ENABLED(CONFIG_OF_MDIO) #if IS_ENABLED(CONFIG_OF_MDIO)
bool of_mdiobus_child_is_phy(struct device_node *child); bool of_mdiobus_child_is_phy(struct device_node *child);
int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np); int __of_mdiobus_register(struct mii_bus *mdio, struct device_node *np,
int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio, struct module *owner);
struct device_node *np);
static inline int of_mdiobus_register(struct mii_bus *mdio,
struct device_node *np)
{
return __of_mdiobus_register(mdio, np, THIS_MODULE);
}
int __devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
struct device_node *np, struct module *owner);
static inline int devm_of_mdiobus_register(struct device *dev,
struct mii_bus *mdio,
struct device_node *np)
{
return __devm_of_mdiobus_register(dev, mdio, np, THIS_MODULE);
}
struct mdio_device *of_mdio_find_device(struct device_node *np); struct mdio_device *of_mdio_find_device(struct device_node *np);
struct phy_device *of_phy_find_device(struct device_node *phy_np); struct phy_device *of_phy_find_device(struct device_node *phy_np);
struct phy_device * struct phy_device *
......
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