Commit ac53c264 authored by Marcin Wojtas's avatar Marcin Wojtas Committed by David S. Miller

net: mdiobus: withdraw fwnode_mdbiobus_register

The newly implemented fwnode_mdbiobus_register turned out to be
problematic - in case the fwnode_/of_/acpi_mdio are built as
modules, a dependency cycle can be observed during the depmod phase of
modules_install, eg.:

depmod: ERROR: Cycle detected: fwnode_mdio -> of_mdio -> fwnode_mdio
depmod: ERROR: Found 2 modules in dependency cycles!

OR:

depmod: ERROR: Cycle detected: acpi_mdio -> fwnode_mdio -> acpi_mdio
depmod: ERROR: Found 2 modules in dependency cycles!

A possible solution could be to rework fwnode_mdiobus_register,
so that to merge the contents of acpi_mdiobus_register and
of_mdiobus_register. However feasible, such change would
be very intrusive and affect huge amount of the of_mdiobus_register
users.

Since there are currently 2 users of ACPI and MDIO
(xgmac_mdio and mvmdio), withdraw the fwnode_mdbiobus_register
and roll back to a simple 'if' condition in affected drivers.

Fixes: 62a6ef6a ("net: mdiobus: Introduce fwnode_mdbiobus_register()")
Signed-off-by: default avatarMarcin Wojtas <mw@semihalf.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f92e1869
...@@ -67,7 +67,9 @@ config FSL_PQ_MDIO ...@@ -67,7 +67,9 @@ config FSL_PQ_MDIO
config FSL_XGMAC_MDIO config FSL_XGMAC_MDIO
tristate "Freescale XGMAC MDIO" tristate "Freescale XGMAC MDIO"
depends on FWNODE_MDIO select PHYLIB
depends on OF
select OF_MDIO
help help
This driver supports the MDIO bus on the Fman 10G Ethernet MACs, and This driver supports the MDIO bus on the Fman 10G Ethernet MACs, and
on the FMan mEMAC (which supports both Clauses 22 and 45) on the FMan mEMAC (which supports both Clauses 22 and 45)
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
*/ */
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/fwnode_mdio.h> #include <linux/acpi_mdio.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mdio.h> #include <linux/mdio.h>
...@@ -246,6 +246,7 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum) ...@@ -246,6 +246,7 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum)
static int xgmac_mdio_probe(struct platform_device *pdev) static int xgmac_mdio_probe(struct platform_device *pdev)
{ {
struct fwnode_handle *fwnode;
struct mdio_fsl_priv *priv; struct mdio_fsl_priv *priv;
struct resource *res; struct resource *res;
struct mii_bus *bus; struct mii_bus *bus;
...@@ -290,7 +291,13 @@ static int xgmac_mdio_probe(struct platform_device *pdev) ...@@ -290,7 +291,13 @@ static int xgmac_mdio_probe(struct platform_device *pdev)
priv->has_a011043 = device_property_read_bool(&pdev->dev, priv->has_a011043 = device_property_read_bool(&pdev->dev,
"fsl,erratum-a011043"); "fsl,erratum-a011043");
ret = fwnode_mdiobus_register(bus, pdev->dev.fwnode); fwnode = pdev->dev.fwnode;
if (is_of_node(fwnode))
ret = of_mdiobus_register(bus, to_of_node(fwnode));
else if (is_acpi_node(fwnode))
ret = acpi_mdiobus_register(bus, fwnode);
else
ret = -EINVAL;
if (ret) { if (ret) {
dev_err(&pdev->dev, "cannot register MDIO bus\n"); dev_err(&pdev->dev, "cannot register MDIO bus\n");
goto err_registration; goto err_registration;
......
...@@ -18,9 +18,9 @@ ...@@ -18,9 +18,9 @@
*/ */
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/acpi_mdio.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/fwnode_mdio.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -371,7 +371,13 @@ static int orion_mdio_probe(struct platform_device *pdev) ...@@ -371,7 +371,13 @@ static int orion_mdio_probe(struct platform_device *pdev)
goto out_mdio; goto out_mdio;
} }
ret = fwnode_mdiobus_register(bus, pdev->dev.fwnode); /* For the platforms not supporting DT/ACPI fall-back
* to mdiobus_register via of_mdiobus_register.
*/
if (is_acpi_node(pdev->dev.fwnode))
ret = acpi_mdiobus_register(bus, pdev->dev.fwnode);
else
ret = of_mdiobus_register(bus, pdev->dev.of_node);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "Cannot register MDIO bus (%d)\n", ret); dev_err(&pdev->dev, "Cannot register MDIO bus (%d)\n", ret);
goto out_mdio; goto out_mdio;
......
...@@ -7,10 +7,8 @@ ...@@ -7,10 +7,8 @@
*/ */
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/acpi_mdio.h>
#include <linux/fwnode_mdio.h> #include <linux/fwnode_mdio.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_mdio.h>
#include <linux/phy.h> #include <linux/phy.h>
MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>"); MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");
...@@ -144,23 +142,3 @@ int fwnode_mdiobus_register_phy(struct mii_bus *bus, ...@@ -144,23 +142,3 @@ int fwnode_mdiobus_register_phy(struct mii_bus *bus,
return 0; return 0;
} }
EXPORT_SYMBOL(fwnode_mdiobus_register_phy); EXPORT_SYMBOL(fwnode_mdiobus_register_phy);
/**
* fwnode_mdiobus_register - bring up all the PHYs on a given MDIO bus and
* attach them to it.
* @bus: Target MDIO bus.
* @fwnode: Pointer to fwnode of the MDIO controller.
*
* Return values are determined accordingly to acpi_/of_ mdiobus_register()
* operation.
*/
int fwnode_mdiobus_register(struct mii_bus *bus, struct fwnode_handle *fwnode)
{
if (is_acpi_node(fwnode))
return acpi_mdiobus_register(bus, fwnode);
else if (is_of_node(fwnode))
return of_mdiobus_register(bus, to_of_node(fwnode));
else
return -EINVAL;
}
EXPORT_SYMBOL(fwnode_mdiobus_register);
...@@ -16,7 +16,6 @@ int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio, ...@@ -16,7 +16,6 @@ int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio,
int fwnode_mdiobus_register_phy(struct mii_bus *bus, int fwnode_mdiobus_register_phy(struct mii_bus *bus,
struct fwnode_handle *child, u32 addr); struct fwnode_handle *child, u32 addr);
int fwnode_mdiobus_register(struct mii_bus *bus, struct fwnode_handle *fwnode);
#else /* CONFIG_FWNODE_MDIO */ #else /* CONFIG_FWNODE_MDIO */
int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio, int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio,
struct phy_device *phy, struct phy_device *phy,
...@@ -31,17 +30,6 @@ static inline int fwnode_mdiobus_register_phy(struct mii_bus *bus, ...@@ -31,17 +30,6 @@ static inline int fwnode_mdiobus_register_phy(struct mii_bus *bus,
{ {
return -EINVAL; return -EINVAL;
} }
static inline int fwnode_mdiobus_register(struct mii_bus *bus,
struct fwnode_handle *fwnode)
{
/*
* Fall back to mdiobus_register() function to register a bus.
* This way, we don't have to keep compat bits around in drivers.
*/
return mdiobus_register(bus);
}
#endif #endif
#endif /* __LINUX_FWNODE_MDIO_H */ #endif /* __LINUX_FWNODE_MDIO_H */
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