Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.4-rc8 760 lines 18 kB view raw
1// SPDX-License-Identifier: GPL-2.0+ 2/* MDIO Bus interface 3 * 4 * Author: Andy Fleming 5 * 6 * Copyright (c) 2004 Freescale Semiconductor, Inc. 7 */ 8 9#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 10 11#include <linux/kernel.h> 12#include <linux/string.h> 13#include <linux/errno.h> 14#include <linux/unistd.h> 15#include <linux/slab.h> 16#include <linux/interrupt.h> 17#include <linux/init.h> 18#include <linux/delay.h> 19#include <linux/device.h> 20#include <linux/gpio.h> 21#include <linux/gpio/consumer.h> 22#include <linux/of_device.h> 23#include <linux/of_mdio.h> 24#include <linux/of_gpio.h> 25#include <linux/netdevice.h> 26#include <linux/etherdevice.h> 27#include <linux/reset.h> 28#include <linux/skbuff.h> 29#include <linux/spinlock.h> 30#include <linux/mm.h> 31#include <linux/module.h> 32#include <linux/mii.h> 33#include <linux/ethtool.h> 34#include <linux/phy.h> 35#include <linux/io.h> 36#include <linux/uaccess.h> 37 38#define CREATE_TRACE_POINTS 39#include <trace/events/mdio.h> 40 41#include "mdio-boardinfo.h" 42 43static int mdiobus_register_gpiod(struct mdio_device *mdiodev) 44{ 45 int error; 46 47 /* Deassert the optional reset signal */ 48 mdiodev->reset_gpio = gpiod_get_optional(&mdiodev->dev, 49 "reset", GPIOD_OUT_LOW); 50 error = PTR_ERR_OR_ZERO(mdiodev->reset_gpio); 51 if (error) 52 return error; 53 54 if (mdiodev->reset_gpio) 55 gpiod_set_consumer_name(mdiodev->reset_gpio, "PHY reset"); 56 57 return 0; 58} 59 60static int mdiobus_register_reset(struct mdio_device *mdiodev) 61{ 62 struct reset_control *reset = NULL; 63 64 if (mdiodev->dev.of_node) 65 reset = devm_reset_control_get_exclusive(&mdiodev->dev, 66 "phy"); 67 if (IS_ERR(reset)) { 68 if (PTR_ERR(reset) == -ENOENT || PTR_ERR(reset) == -ENOSYS) 69 reset = NULL; 70 else 71 return PTR_ERR(reset); 72 } 73 74 mdiodev->reset_ctrl = reset; 75 76 return 0; 77} 78 79int mdiobus_register_device(struct mdio_device *mdiodev) 80{ 81 int err; 82 83 if (mdiodev->bus->mdio_map[mdiodev->addr]) 84 return -EBUSY; 85 86 if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) { 87 err = mdiobus_register_gpiod(mdiodev); 88 if (err) 89 return err; 90 91 err = mdiobus_register_reset(mdiodev); 92 if (err) 93 return err; 94 95 /* Assert the reset signal */ 96 mdio_device_reset(mdiodev, 1); 97 } 98 99 mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev; 100 101 return 0; 102} 103EXPORT_SYMBOL(mdiobus_register_device); 104 105int mdiobus_unregister_device(struct mdio_device *mdiodev) 106{ 107 if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev) 108 return -EINVAL; 109 110 mdiodev->bus->mdio_map[mdiodev->addr] = NULL; 111 112 return 0; 113} 114EXPORT_SYMBOL(mdiobus_unregister_device); 115 116struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr) 117{ 118 struct mdio_device *mdiodev = bus->mdio_map[addr]; 119 120 if (!mdiodev) 121 return NULL; 122 123 if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY)) 124 return NULL; 125 126 return container_of(mdiodev, struct phy_device, mdio); 127} 128EXPORT_SYMBOL(mdiobus_get_phy); 129 130bool mdiobus_is_registered_device(struct mii_bus *bus, int addr) 131{ 132 return bus->mdio_map[addr]; 133} 134EXPORT_SYMBOL(mdiobus_is_registered_device); 135 136/** 137 * mdiobus_alloc_size - allocate a mii_bus structure 138 * @size: extra amount of memory to allocate for private storage. 139 * If non-zero, then bus->priv is points to that memory. 140 * 141 * Description: called by a bus driver to allocate an mii_bus 142 * structure to fill in. 143 */ 144struct mii_bus *mdiobus_alloc_size(size_t size) 145{ 146 struct mii_bus *bus; 147 size_t aligned_size = ALIGN(sizeof(*bus), NETDEV_ALIGN); 148 size_t alloc_size; 149 int i; 150 151 /* If we alloc extra space, it should be aligned */ 152 if (size) 153 alloc_size = aligned_size + size; 154 else 155 alloc_size = sizeof(*bus); 156 157 bus = kzalloc(alloc_size, GFP_KERNEL); 158 if (!bus) 159 return NULL; 160 161 bus->state = MDIOBUS_ALLOCATED; 162 if (size) 163 bus->priv = (void *)bus + aligned_size; 164 165 /* Initialise the interrupts to polling */ 166 for (i = 0; i < PHY_MAX_ADDR; i++) 167 bus->irq[i] = PHY_POLL; 168 169 return bus; 170} 171EXPORT_SYMBOL(mdiobus_alloc_size); 172 173static void _devm_mdiobus_free(struct device *dev, void *res) 174{ 175 mdiobus_free(*(struct mii_bus **)res); 176} 177 178static int devm_mdiobus_match(struct device *dev, void *res, void *data) 179{ 180 struct mii_bus **r = res; 181 182 if (WARN_ON(!r || !*r)) 183 return 0; 184 185 return *r == data; 186} 187 188/** 189 * devm_mdiobus_alloc_size - Resource-managed mdiobus_alloc_size() 190 * @dev: Device to allocate mii_bus for 191 * @sizeof_priv: Space to allocate for private structure. 192 * 193 * Managed mdiobus_alloc_size. mii_bus allocated with this function is 194 * automatically freed on driver detach. 195 * 196 * If an mii_bus allocated with this function needs to be freed separately, 197 * devm_mdiobus_free() must be used. 198 * 199 * RETURNS: 200 * Pointer to allocated mii_bus on success, NULL on failure. 201 */ 202struct mii_bus *devm_mdiobus_alloc_size(struct device *dev, int sizeof_priv) 203{ 204 struct mii_bus **ptr, *bus; 205 206 ptr = devres_alloc(_devm_mdiobus_free, sizeof(*ptr), GFP_KERNEL); 207 if (!ptr) 208 return NULL; 209 210 /* use raw alloc_dr for kmalloc caller tracing */ 211 bus = mdiobus_alloc_size(sizeof_priv); 212 if (bus) { 213 *ptr = bus; 214 devres_add(dev, ptr); 215 } else { 216 devres_free(ptr); 217 } 218 219 return bus; 220} 221EXPORT_SYMBOL_GPL(devm_mdiobus_alloc_size); 222 223/** 224 * devm_mdiobus_free - Resource-managed mdiobus_free() 225 * @dev: Device this mii_bus belongs to 226 * @bus: the mii_bus associated with the device 227 * 228 * Free mii_bus allocated with devm_mdiobus_alloc_size(). 229 */ 230void devm_mdiobus_free(struct device *dev, struct mii_bus *bus) 231{ 232 int rc; 233 234 rc = devres_release(dev, _devm_mdiobus_free, 235 devm_mdiobus_match, bus); 236 WARN_ON(rc); 237} 238EXPORT_SYMBOL_GPL(devm_mdiobus_free); 239 240/** 241 * mdiobus_release - mii_bus device release callback 242 * @d: the target struct device that contains the mii_bus 243 * 244 * Description: called when the last reference to an mii_bus is 245 * dropped, to free the underlying memory. 246 */ 247static void mdiobus_release(struct device *d) 248{ 249 struct mii_bus *bus = to_mii_bus(d); 250 BUG_ON(bus->state != MDIOBUS_RELEASED && 251 /* for compatibility with error handling in drivers */ 252 bus->state != MDIOBUS_ALLOCATED); 253 kfree(bus); 254} 255 256static struct class mdio_bus_class = { 257 .name = "mdio_bus", 258 .dev_release = mdiobus_release, 259}; 260 261#if IS_ENABLED(CONFIG_OF_MDIO) 262/** 263 * of_mdio_find_bus - Given an mii_bus node, find the mii_bus. 264 * @mdio_bus_np: Pointer to the mii_bus. 265 * 266 * Returns a reference to the mii_bus, or NULL if none found. The 267 * embedded struct device will have its reference count incremented, 268 * and this must be put once the bus is finished with. 269 * 270 * Because the association of a device_node and mii_bus is made via 271 * of_mdiobus_register(), the mii_bus cannot be found before it is 272 * registered with of_mdiobus_register(). 273 * 274 */ 275struct mii_bus *of_mdio_find_bus(struct device_node *mdio_bus_np) 276{ 277 struct device *d; 278 279 if (!mdio_bus_np) 280 return NULL; 281 282 d = class_find_device_by_of_node(&mdio_bus_class, mdio_bus_np); 283 return d ? to_mii_bus(d) : NULL; 284} 285EXPORT_SYMBOL(of_mdio_find_bus); 286 287/* Walk the list of subnodes of a mdio bus and look for a node that 288 * matches the mdio device's address with its 'reg' property. If 289 * found, set the of_node pointer for the mdio device. This allows 290 * auto-probed phy devices to be supplied with information passed in 291 * via DT. 292 */ 293static void of_mdiobus_link_mdiodev(struct mii_bus *bus, 294 struct mdio_device *mdiodev) 295{ 296 struct device *dev = &mdiodev->dev; 297 struct device_node *child; 298 299 if (dev->of_node || !bus->dev.of_node) 300 return; 301 302 for_each_available_child_of_node(bus->dev.of_node, child) { 303 int addr; 304 305 addr = of_mdio_parse_addr(dev, child); 306 if (addr < 0) 307 continue; 308 309 if (addr == mdiodev->addr) { 310 dev->of_node = child; 311 dev->fwnode = of_fwnode_handle(child); 312 return; 313 } 314 } 315} 316#else /* !IS_ENABLED(CONFIG_OF_MDIO) */ 317static inline void of_mdiobus_link_mdiodev(struct mii_bus *mdio, 318 struct mdio_device *mdiodev) 319{ 320} 321#endif 322 323/** 324 * mdiobus_create_device_from_board_info - create a full MDIO device given 325 * a mdio_board_info structure 326 * @bus: MDIO bus to create the devices on 327 * @bi: mdio_board_info structure describing the devices 328 * 329 * Returns 0 on success or < 0 on error. 330 */ 331static int mdiobus_create_device(struct mii_bus *bus, 332 struct mdio_board_info *bi) 333{ 334 struct mdio_device *mdiodev; 335 int ret = 0; 336 337 mdiodev = mdio_device_create(bus, bi->mdio_addr); 338 if (IS_ERR(mdiodev)) 339 return -ENODEV; 340 341 strncpy(mdiodev->modalias, bi->modalias, 342 sizeof(mdiodev->modalias)); 343 mdiodev->bus_match = mdio_device_bus_match; 344 mdiodev->dev.platform_data = (void *)bi->platform_data; 345 346 ret = mdio_device_register(mdiodev); 347 if (ret) 348 mdio_device_free(mdiodev); 349 350 return ret; 351} 352 353/** 354 * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus 355 * @bus: target mii_bus 356 * @owner: module containing bus accessor functions 357 * 358 * Description: Called by a bus driver to bring up all the PHYs 359 * on a given bus, and attach them to the bus. Drivers should use 360 * mdiobus_register() rather than __mdiobus_register() unless they 361 * need to pass a specific owner module. MDIO devices which are not 362 * PHYs will not be brought up by this function. They are expected to 363 * to be explicitly listed in DT and instantiated by of_mdiobus_register(). 364 * 365 * Returns 0 on success or < 0 on error. 366 */ 367int __mdiobus_register(struct mii_bus *bus, struct module *owner) 368{ 369 struct mdio_device *mdiodev; 370 int i, err; 371 struct gpio_desc *gpiod; 372 373 if (NULL == bus || NULL == bus->name || 374 NULL == bus->read || NULL == bus->write) 375 return -EINVAL; 376 377 BUG_ON(bus->state != MDIOBUS_ALLOCATED && 378 bus->state != MDIOBUS_UNREGISTERED); 379 380 bus->owner = owner; 381 bus->dev.parent = bus->parent; 382 bus->dev.class = &mdio_bus_class; 383 bus->dev.groups = NULL; 384 dev_set_name(&bus->dev, "%s", bus->id); 385 386 err = device_register(&bus->dev); 387 if (err) { 388 pr_err("mii_bus %s failed to register\n", bus->id); 389 return -EINVAL; 390 } 391 392 mutex_init(&bus->mdio_lock); 393 394 /* de-assert bus level PHY GPIO reset */ 395 gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_LOW); 396 if (IS_ERR(gpiod)) { 397 dev_err(&bus->dev, "mii_bus %s couldn't get reset GPIO\n", 398 bus->id); 399 device_del(&bus->dev); 400 return PTR_ERR(gpiod); 401 } else if (gpiod) { 402 bus->reset_gpiod = gpiod; 403 404 gpiod_set_value_cansleep(gpiod, 1); 405 udelay(bus->reset_delay_us); 406 gpiod_set_value_cansleep(gpiod, 0); 407 } 408 409 if (bus->reset) 410 bus->reset(bus); 411 412 for (i = 0; i < PHY_MAX_ADDR; i++) { 413 if ((bus->phy_mask & (1 << i)) == 0) { 414 struct phy_device *phydev; 415 416 phydev = mdiobus_scan(bus, i); 417 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) { 418 err = PTR_ERR(phydev); 419 goto error; 420 } 421 } 422 } 423 424 mdiobus_setup_mdiodev_from_board_info(bus, mdiobus_create_device); 425 426 bus->state = MDIOBUS_REGISTERED; 427 pr_info("%s: probed\n", bus->name); 428 return 0; 429 430error: 431 while (--i >= 0) { 432 mdiodev = bus->mdio_map[i]; 433 if (!mdiodev) 434 continue; 435 436 mdiodev->device_remove(mdiodev); 437 mdiodev->device_free(mdiodev); 438 } 439 440 /* Put PHYs in RESET to save power */ 441 if (bus->reset_gpiod) 442 gpiod_set_value_cansleep(bus->reset_gpiod, 1); 443 444 device_del(&bus->dev); 445 return err; 446} 447EXPORT_SYMBOL(__mdiobus_register); 448 449void mdiobus_unregister(struct mii_bus *bus) 450{ 451 struct mdio_device *mdiodev; 452 int i; 453 454 BUG_ON(bus->state != MDIOBUS_REGISTERED); 455 bus->state = MDIOBUS_UNREGISTERED; 456 457 for (i = 0; i < PHY_MAX_ADDR; i++) { 458 mdiodev = bus->mdio_map[i]; 459 if (!mdiodev) 460 continue; 461 462 if (mdiodev->reset_gpio) 463 gpiod_put(mdiodev->reset_gpio); 464 465 mdiodev->device_remove(mdiodev); 466 mdiodev->device_free(mdiodev); 467 } 468 469 /* Put PHYs in RESET to save power */ 470 if (bus->reset_gpiod) 471 gpiod_set_value_cansleep(bus->reset_gpiod, 1); 472 473 device_del(&bus->dev); 474} 475EXPORT_SYMBOL(mdiobus_unregister); 476 477/** 478 * mdiobus_free - free a struct mii_bus 479 * @bus: mii_bus to free 480 * 481 * This function releases the reference to the underlying device 482 * object in the mii_bus. If this is the last reference, the mii_bus 483 * will be freed. 484 */ 485void mdiobus_free(struct mii_bus *bus) 486{ 487 /* For compatibility with error handling in drivers. */ 488 if (bus->state == MDIOBUS_ALLOCATED) { 489 kfree(bus); 490 return; 491 } 492 493 BUG_ON(bus->state != MDIOBUS_UNREGISTERED); 494 bus->state = MDIOBUS_RELEASED; 495 496 put_device(&bus->dev); 497} 498EXPORT_SYMBOL(mdiobus_free); 499 500/** 501 * mdiobus_scan - scan a bus for MDIO devices. 502 * @bus: mii_bus to scan 503 * @addr: address on bus to scan 504 * 505 * This function scans the MDIO bus, looking for devices which can be 506 * identified using a vendor/product ID in registers 2 and 3. Not all 507 * MDIO devices have such registers, but PHY devices typically 508 * do. Hence this function assumes anything found is a PHY, or can be 509 * treated as a PHY. Other MDIO devices, such as switches, will 510 * probably not be found during the scan. 511 */ 512struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr) 513{ 514 struct phy_device *phydev; 515 int err; 516 517 phydev = get_phy_device(bus, addr, false); 518 if (IS_ERR(phydev)) 519 return phydev; 520 521 /* 522 * For DT, see if the auto-probed phy has a correspoding child 523 * in the bus node, and set the of_node pointer in this case. 524 */ 525 of_mdiobus_link_mdiodev(bus, &phydev->mdio); 526 527 err = phy_device_register(phydev); 528 if (err) { 529 phy_device_free(phydev); 530 return ERR_PTR(-ENODEV); 531 } 532 533 return phydev; 534} 535EXPORT_SYMBOL(mdiobus_scan); 536 537/** 538 * __mdiobus_read - Unlocked version of the mdiobus_read function 539 * @bus: the mii_bus struct 540 * @addr: the phy address 541 * @regnum: register number to read 542 * 543 * Read a MDIO bus register. Caller must hold the mdio bus lock. 544 * 545 * NOTE: MUST NOT be called from interrupt context. 546 */ 547int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) 548{ 549 int retval; 550 551 WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock)); 552 553 retval = bus->read(bus, addr, regnum); 554 555 trace_mdio_access(bus, 1, addr, regnum, retval, retval); 556 557 return retval; 558} 559EXPORT_SYMBOL(__mdiobus_read); 560 561/** 562 * __mdiobus_write - Unlocked version of the mdiobus_write function 563 * @bus: the mii_bus struct 564 * @addr: the phy address 565 * @regnum: register number to write 566 * @val: value to write to @regnum 567 * 568 * Write a MDIO bus register. Caller must hold the mdio bus lock. 569 * 570 * NOTE: MUST NOT be called from interrupt context. 571 */ 572int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) 573{ 574 int err; 575 576 WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock)); 577 578 err = bus->write(bus, addr, regnum, val); 579 580 trace_mdio_access(bus, 0, addr, regnum, val, err); 581 582 return err; 583} 584EXPORT_SYMBOL(__mdiobus_write); 585 586/** 587 * mdiobus_read_nested - Nested version of the mdiobus_read function 588 * @bus: the mii_bus struct 589 * @addr: the phy address 590 * @regnum: register number to read 591 * 592 * In case of nested MDIO bus access avoid lockdep false positives by 593 * using mutex_lock_nested(). 594 * 595 * NOTE: MUST NOT be called from interrupt context, 596 * because the bus read/write functions may wait for an interrupt 597 * to conclude the operation. 598 */ 599int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum) 600{ 601 int retval; 602 603 BUG_ON(in_interrupt()); 604 605 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 606 retval = __mdiobus_read(bus, addr, regnum); 607 mutex_unlock(&bus->mdio_lock); 608 609 return retval; 610} 611EXPORT_SYMBOL(mdiobus_read_nested); 612 613/** 614 * mdiobus_read - Convenience function for reading a given MII mgmt register 615 * @bus: the mii_bus struct 616 * @addr: the phy address 617 * @regnum: register number to read 618 * 619 * NOTE: MUST NOT be called from interrupt context, 620 * because the bus read/write functions may wait for an interrupt 621 * to conclude the operation. 622 */ 623int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) 624{ 625 int retval; 626 627 BUG_ON(in_interrupt()); 628 629 mutex_lock(&bus->mdio_lock); 630 retval = __mdiobus_read(bus, addr, regnum); 631 mutex_unlock(&bus->mdio_lock); 632 633 return retval; 634} 635EXPORT_SYMBOL(mdiobus_read); 636 637/** 638 * mdiobus_write_nested - Nested version of the mdiobus_write function 639 * @bus: the mii_bus struct 640 * @addr: the phy address 641 * @regnum: register number to write 642 * @val: value to write to @regnum 643 * 644 * In case of nested MDIO bus access avoid lockdep false positives by 645 * using mutex_lock_nested(). 646 * 647 * NOTE: MUST NOT be called from interrupt context, 648 * because the bus read/write functions may wait for an interrupt 649 * to conclude the operation. 650 */ 651int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val) 652{ 653 int err; 654 655 BUG_ON(in_interrupt()); 656 657 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 658 err = __mdiobus_write(bus, addr, regnum, val); 659 mutex_unlock(&bus->mdio_lock); 660 661 return err; 662} 663EXPORT_SYMBOL(mdiobus_write_nested); 664 665/** 666 * mdiobus_write - Convenience function for writing a given MII mgmt register 667 * @bus: the mii_bus struct 668 * @addr: the phy address 669 * @regnum: register number to write 670 * @val: value to write to @regnum 671 * 672 * NOTE: MUST NOT be called from interrupt context, 673 * because the bus read/write functions may wait for an interrupt 674 * to conclude the operation. 675 */ 676int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) 677{ 678 int err; 679 680 BUG_ON(in_interrupt()); 681 682 mutex_lock(&bus->mdio_lock); 683 err = __mdiobus_write(bus, addr, regnum, val); 684 mutex_unlock(&bus->mdio_lock); 685 686 return err; 687} 688EXPORT_SYMBOL(mdiobus_write); 689 690/** 691 * mdio_bus_match - determine if given MDIO driver supports the given 692 * MDIO device 693 * @dev: target MDIO device 694 * @drv: given MDIO driver 695 * 696 * Description: Given a MDIO device, and a MDIO driver, return 1 if 697 * the driver supports the device. Otherwise, return 0. This may 698 * require calling the devices own match function, since different classes 699 * of MDIO devices have different match criteria. 700 */ 701static int mdio_bus_match(struct device *dev, struct device_driver *drv) 702{ 703 struct mdio_device *mdio = to_mdio_device(dev); 704 705 if (of_driver_match_device(dev, drv)) 706 return 1; 707 708 if (mdio->bus_match) 709 return mdio->bus_match(dev, drv); 710 711 return 0; 712} 713 714static int mdio_uevent(struct device *dev, struct kobj_uevent_env *env) 715{ 716 int rc; 717 718 /* Some devices have extra OF data and an OF-style MODALIAS */ 719 rc = of_device_uevent_modalias(dev, env); 720 if (rc != -ENODEV) 721 return rc; 722 723 return 0; 724} 725 726struct bus_type mdio_bus_type = { 727 .name = "mdio_bus", 728 .match = mdio_bus_match, 729 .uevent = mdio_uevent, 730}; 731EXPORT_SYMBOL(mdio_bus_type); 732 733int __init mdio_bus_init(void) 734{ 735 int ret; 736 737 ret = class_register(&mdio_bus_class); 738 if (!ret) { 739 ret = bus_register(&mdio_bus_type); 740 if (ret) 741 class_unregister(&mdio_bus_class); 742 } 743 744 return ret; 745} 746EXPORT_SYMBOL_GPL(mdio_bus_init); 747 748#if IS_ENABLED(CONFIG_PHYLIB) 749void mdio_bus_exit(void) 750{ 751 class_unregister(&mdio_bus_class); 752 bus_unregister(&mdio_bus_type); 753} 754EXPORT_SYMBOL_GPL(mdio_bus_exit); 755#else 756module_init(mdio_bus_init); 757/* no module_exit, intentional */ 758MODULE_LICENSE("GPL"); 759MODULE_DESCRIPTION("MDIO bus/device layer"); 760#endif