62 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * ACPI helpers for the MDIO (Ethernet PHY) API4 *5 * This file provides helper functions for extracting PHY device information6 * out of the ACPI ASL and using it to populate an mii_bus.7 */8 9#include <linux/acpi.h>10#include <linux/acpi_mdio.h>11#include <linux/bits.h>12#include <linux/dev_printk.h>13#include <linux/fwnode_mdio.h>14#include <linux/module.h>15#include <linux/types.h>16 17MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");18MODULE_LICENSE("GPL");19MODULE_DESCRIPTION("ACPI MDIO bus (Ethernet PHY) accessors");20 21/**22 * __acpi_mdiobus_register - Register mii_bus and create PHYs from the ACPI ASL.23 * @mdio: pointer to mii_bus structure24 * @fwnode: pointer to fwnode of MDIO bus. This fwnode is expected to represent25 * @owner: module owning this @mdio object.26 * an ACPI device object corresponding to the MDIO bus and its children are27 * expected to correspond to the PHY devices on that bus.28 *29 * This function registers the mii_bus structure and registers a phy_device30 * for each child node of @fwnode.31 */32int __acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode,33 struct module *owner)34{35 struct fwnode_handle *child;36 u32 addr;37 int ret;38 39 /* Mask out all PHYs from auto probing. */40 mdio->phy_mask = GENMASK(31, 0);41 ret = __mdiobus_register(mdio, owner);42 if (ret)43 return ret;44 45 ACPI_COMPANION_SET(&mdio->dev, to_acpi_device_node(fwnode));46 47 /* Loop over the child nodes and register a phy_device for each PHY */48 fwnode_for_each_child_node(fwnode, child) {49 ret = acpi_get_local_address(ACPI_HANDLE_FWNODE(child), &addr);50 if (ret || addr >= PHY_MAX_ADDR)51 continue;52 53 ret = fwnode_mdiobus_register_phy(mdio, child, addr);54 if (ret == -ENODEV)55 dev_err(&mdio->dev,56 "MDIO device at address %d is missing.\n",57 addr);58 }59 return 0;60}61EXPORT_SYMBOL(__acpi_mdiobus_register);62