Hi Marcin, On Mon, 2023-01-16 at 18:34 +0100, Marcin Wojtas wrote: > fixed-link PHYs API is used by DSA and a number of drivers > and was depending on of_. Switch to fwnode_ so to make it > hardware description agnostic and allow to be used in ACPI > world as well. > > Signed-off-by: Marcin Wojtas <mw@xxxxxxxxxxxx> > --- > include/linux/fwnode_mdio.h | 19 ++++ > drivers/net/mdio/fwnode_mdio.c | 96 ++++++++++++++++++++ > drivers/net/mdio/of_mdio.c | 79 +--------------- > 3 files changed, 118 insertions(+), 76 deletions(-) > > #endif /* __LINUX_FWNODE_MDIO_H */ > diff --git a/drivers/net/mdio/fwnode_mdio.c > b/drivers/net/mdio/fwnode_mdio.c > index b782c35c4ac1..56f57381ae69 100644 > --- a/drivers/net/mdio/fwnode_mdio.c > +++ b/drivers/net/mdio/fwnode_mdio.c > @@ -10,6 +10,7 @@ > #include <linux/fwnode_mdio.h> > #include <linux/of.h> > #include <linux/phy.h> > +#include <linux/phy_fixed.h> > #include <linux/pse-pd/pse.h> > > MODULE_AUTHOR("Calvin Johnson <calvin.johnson@xxxxxxxxxxx>"); > @@ -185,3 +186,98 @@ int fwnode_mdiobus_register_phy(struct mii_bus > *bus, > return rc; > } > EXPORT_SYMBOL(fwnode_mdiobus_register_phy); > + > +/* > + * fwnode_phy_is_fixed_link() and fwnode_phy_register_fixed_link() > must > + * support two bindings: > + * - the old binding, where 'fixed-link' was a property with 5 > + * cells encoding various information about the fixed PHY > + * - the new binding, where 'fixed-link' is a sub-node of the > + * Ethernet device. > + */ networking comment style > +bool fwnode_phy_is_fixed_link(struct fwnode_handle *fwnode) > +{ > + struct fwnode_handle *fixed_link_node; > + const char *managed; > + > + /* New binding */ > + fixed_link_node = fwnode_get_named_child_node(fwnode, "fixed- > link"); > + if (fixed_link_node) { > + fwnode_handle_put(fixed_link_node); > + return true; > + } > + > + if (fwnode_property_read_string(fwnode, "managed", &managed) == > 0 && > + strcmp(managed, "auto") != 0) > + return true; > + > + /* Old binding */ > + return fwnode_property_count_u32(fwnode, "fixed-link") == 5; > +} > +EXPORT_SYMBOL(fwnode_phy_is_fixed_link); > + > +int fwnode_phy_register_fixed_link(struct fwnode_handle *fwnode) > +{ > + struct fixed_phy_status status = {}; > + struct fwnode_handle *fixed_link_node; Reverse christmas tree > + u32 fixed_link_prop[5]; > + const char *managed; > + int rc; > + > + if (fwnode_property_read_string(fwnode, "managed", &managed) == > 0 && > + strcmp(managed, "in-band-status") == 0) { > + /* status is zeroed, namely its .link member */ > + goto register_phy; > + } > + > + /* New binding */ > + fixed_link_node = fwnode_get_named_child_node(fwnode, "fixed- > link"); > + if (fixed_link_node) { > + status.link = 1; > + status.duplex = > fwnode_property_present(fixed_link_node, > + "full-duplex"); > + rc = fwnode_property_read_u32(fixed_link_node, "speed", > + &status.speed); > + if (rc) { > + fwnode_handle_put(fixed_link_node); > + return rc; > + } > + status.pause = fwnode_property_present(fixed_link_node, > "pause"); > + status.asym_pause = > fwnode_property_present(fixed_link_node, > + "asym- > pause"); > + fwnode_handle_put(fixed_link_node); > + > + goto register_phy; > + } > + > + /* Old binding */ > + rc = fwnode_property_read_u32_array(fwnode, "fixed-link", > fixed_link_prop, > + ARRAY_SIZE(fixed_link_prop) > ); > + if (rc) > + return rc; > + > + status.link = 1; > + status.duplex = fixed_link_prop[1]; > + status.speed = fixed_link_prop[2]; > + status.pause = fixed_link_prop[3]; > + status.asym_pause = fixed_link_prop[4]; > + > +register_phy: > + return PTR_ERR_OR_ZERO(fixed_phy_register(PHY_POLL, &status, > fwnode)); > +} > +EXPORT_SYMBOL(fwnode_phy_register_fixed_link); > + > >