Lines Matching +full:mdio +full:- +full:bus

1 // SPDX-License-Identifier: GPL-2.0+
2 /* MDIO Bus interface
34 #include <trace/events/mdio.h>
39 mdiodev->reset_gpio = gpiod_get_optional(&mdiodev->dev, in mdiobus_register_gpiod()
41 if (IS_ERR(mdiodev->reset_gpio)) in mdiobus_register_gpiod()
42 return PTR_ERR(mdiodev->reset_gpio); in mdiobus_register_gpiod()
44 if (mdiodev->reset_gpio) in mdiobus_register_gpiod()
45 gpiod_set_consumer_name(mdiodev->reset_gpio, "PHY reset"); in mdiobus_register_gpiod()
54 reset = reset_control_get_optional_exclusive(&mdiodev->dev, "phy"); in mdiobus_register_reset()
58 mdiodev->reset_ctrl = reset; in mdiobus_register_reset()
67 if (mdiodev->bus->mdio_map[mdiodev->addr]) in mdiobus_register_device()
68 return -EBUSY; in mdiobus_register_device()
70 if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) { in mdiobus_register_device()
83 mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev; in mdiobus_register_device()
91 if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev) in mdiobus_unregister_device()
92 return -EINVAL; in mdiobus_unregister_device()
94 gpiod_put(mdiodev->reset_gpio); in mdiobus_unregister_device()
95 reset_control_put(mdiodev->reset_ctrl); in mdiobus_unregister_device()
97 mdiodev->bus->mdio_map[mdiodev->addr] = NULL; in mdiobus_unregister_device()
103 static struct mdio_device *mdiobus_find_device(struct mii_bus *bus, int addr) in mdiobus_find_device() argument
105 bool addr_valid = addr >= 0 && addr < ARRAY_SIZE(bus->mdio_map); in mdiobus_find_device()
110 return bus->mdio_map[addr]; in mdiobus_find_device()
113 struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr) in mdiobus_get_phy() argument
117 mdiodev = mdiobus_find_device(bus, addr); in mdiobus_get_phy()
121 if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY)) in mdiobus_get_phy()
124 return container_of(mdiodev, struct phy_device, mdio); in mdiobus_get_phy()
128 bool mdiobus_is_registered_device(struct mii_bus *bus, int addr) in mdiobus_is_registered_device() argument
130 return mdiobus_find_device(bus, addr) != NULL; in mdiobus_is_registered_device()
135 * mdiobus_release - mii_bus device release callback
143 struct mii_bus *bus = to_mii_bus(d); in mdiobus_release() local
145 WARN(bus->state != MDIOBUS_RELEASED && in mdiobus_release()
147 bus->state != MDIOBUS_ALLOCATED, in mdiobus_release()
149 bus->id); in mdiobus_release()
151 if (bus->state == MDIOBUS_RELEASED) in mdiobus_release()
154 kfree(bus); in mdiobus_release()
169 start = u64_stats_fetch_begin(&s->syncp); in mdio_bus_get_stat()
171 } while (u64_stats_fetch_retry(&s->syncp, start)); in mdio_bus_get_stat()
176 static u64 mdio_bus_get_global_stat(struct mii_bus *bus, unsigned int offset) in mdio_bus_get_global_stat() argument
182 val += mdio_bus_get_stat(&bus->stats[i], offset); in mdio_bus_get_global_stat()
191 struct mii_bus *bus = to_mii_bus(dev); in mdio_bus_stat_field_show() local
197 sattr = eattr->var; in mdio_bus_stat_field_show()
199 if (sattr->addr < 0) in mdio_bus_stat_field_show()
200 val = mdio_bus_get_global_stat(bus, sattr->field_offset); in mdio_bus_stat_field_show()
202 val = mdio_bus_get_stat(&bus->stats[sattr->addr], in mdio_bus_stat_field_show()
203 sattr->field_offset); in mdio_bus_stat_field_show()
213 struct mii_bus *bus = mdiodev->bus; in mdio_bus_device_stat_field_show() local
216 int addr = mdiodev->addr; in mdio_bus_device_stat_field_show()
220 sattr = eattr->var; in mdio_bus_device_stat_field_show()
222 val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset); in mdio_bus_device_stat_field_show()
233 -1, offsetof(struct mdio_bus_stats, field) \
241 -1, offsetof(struct mdio_bus_stats, field) \
370 * mdio_find_bus - Given the name of a mdiobus, find the mii_bus.
375 * and this must be put_deviced'ed once the bus is finished with.
388 * of_mdio_find_bus - Given an mii_bus node, find the mii_bus.
393 * and this must be put once the bus is finished with.
416 u64_stats_update_begin(&stats->syncp); in mdiobus_stats_acct()
418 u64_stats_inc(&stats->transfers); in mdiobus_stats_acct()
420 u64_stats_inc(&stats->errors); in mdiobus_stats_acct()
425 u64_stats_inc(&stats->reads); in mdiobus_stats_acct()
427 u64_stats_inc(&stats->writes); in mdiobus_stats_acct()
429 u64_stats_update_end(&stats->syncp); in mdiobus_stats_acct()
434 * __mdiobus_read - Unlocked version of the mdiobus_read function
435 * @bus: the mii_bus struct
439 * Read a MDIO bus register. Caller must hold the mdio bus lock.
443 int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in __mdiobus_read() argument
447 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_read()
450 return -ENXIO; in __mdiobus_read()
452 if (bus->read) in __mdiobus_read()
453 retval = bus->read(bus, addr, regnum); in __mdiobus_read()
455 retval = -EOPNOTSUPP; in __mdiobus_read()
457 trace_mdio_access(bus, 1, addr, regnum, retval, retval); in __mdiobus_read()
458 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_read()
465 * __mdiobus_write - Unlocked version of the mdiobus_write function
466 * @bus: the mii_bus struct
471 * Write a MDIO bus register. Caller must hold the mdio bus lock.
475 int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in __mdiobus_write() argument
479 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_write()
482 return -ENXIO; in __mdiobus_write()
484 if (bus->write) in __mdiobus_write()
485 err = bus->write(bus, addr, regnum, val); in __mdiobus_write()
487 err = -EOPNOTSUPP; in __mdiobus_write()
489 trace_mdio_access(bus, 0, addr, regnum, val, err); in __mdiobus_write()
490 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_write()
497 * __mdiobus_modify_changed - Unlocked version of the mdiobus_modify function
498 * @bus: the mii_bus struct
509 int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, in __mdiobus_modify_changed() argument
514 ret = __mdiobus_read(bus, addr, regnum); in __mdiobus_modify_changed()
522 ret = __mdiobus_write(bus, addr, regnum, new); in __mdiobus_modify_changed()
529 * __mdiobus_c45_read - Unlocked version of the mdiobus_c45_read function
530 * @bus: the mii_bus struct
535 * Read a MDIO bus register. Caller must hold the mdio bus lock.
539 int __mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) in __mdiobus_c45_read() argument
543 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_c45_read()
546 return -ENXIO; in __mdiobus_c45_read()
548 if (bus->read_c45) in __mdiobus_c45_read()
549 retval = bus->read_c45(bus, addr, devad, regnum); in __mdiobus_c45_read()
551 retval = -EOPNOTSUPP; in __mdiobus_c45_read()
553 trace_mdio_access(bus, 1, addr, regnum, retval, retval); in __mdiobus_c45_read()
554 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_c45_read()
561 * __mdiobus_c45_write - Unlocked version of the mdiobus_write function
562 * @bus: the mii_bus struct
568 * Write a MDIO bus register. Caller must hold the mdio bus lock.
572 int __mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, in __mdiobus_c45_write() argument
577 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_c45_write()
580 return -ENXIO; in __mdiobus_c45_write()
582 if (bus->write_c45) in __mdiobus_c45_write()
583 err = bus->write_c45(bus, addr, devad, regnum, val); in __mdiobus_c45_write()
585 err = -EOPNOTSUPP; in __mdiobus_c45_write()
587 trace_mdio_access(bus, 0, addr, regnum, val, err); in __mdiobus_c45_write()
588 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_c45_write()
595 * __mdiobus_c45_modify_changed - Unlocked version of the mdiobus_modify function
596 * @bus: the mii_bus struct
608 static int __mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, in __mdiobus_c45_modify_changed() argument
614 ret = __mdiobus_c45_read(bus, addr, devad, regnum); in __mdiobus_c45_modify_changed()
622 ret = __mdiobus_c45_write(bus, addr, devad, regnum, new); in __mdiobus_c45_modify_changed()
628 * mdiobus_read_nested - Nested version of the mdiobus_read function
629 * @bus: the mii_bus struct
633 * In case of nested MDIO bus access avoid lockdep false positives by
637 * because the bus read/write functions may wait for an interrupt
640 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read_nested() argument
644 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_read_nested()
645 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read_nested()
646 mutex_unlock(&bus->mdio_lock); in mdiobus_read_nested()
653 * mdiobus_read - Convenience function for reading a given MII mgmt register
654 * @bus: the mii_bus struct
659 * because the bus read/write functions may wait for an interrupt
662 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read() argument
666 mutex_lock(&bus->mdio_lock); in mdiobus_read()
667 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read()
668 mutex_unlock(&bus->mdio_lock); in mdiobus_read()
675 * mdiobus_c45_read - Convenience function for reading a given MII mgmt register
676 * @bus: the mii_bus struct
682 * because the bus read/write functions may wait for an interrupt
685 int mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) in mdiobus_c45_read() argument
689 mutex_lock(&bus->mdio_lock); in mdiobus_c45_read()
690 retval = __mdiobus_c45_read(bus, addr, devad, regnum); in mdiobus_c45_read()
691 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_read()
698 * mdiobus_c45_read_nested - Nested version of the mdiobus_c45_read function
699 * @bus: the mii_bus struct
704 * In case of nested MDIO bus access avoid lockdep false positives by
708 * because the bus read/write functions may wait for an interrupt
711 int mdiobus_c45_read_nested(struct mii_bus *bus, int addr, int devad, in mdiobus_c45_read_nested() argument
716 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_c45_read_nested()
717 retval = __mdiobus_c45_read(bus, addr, devad, regnum); in mdiobus_c45_read_nested()
718 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_read_nested()
725 * mdiobus_write_nested - Nested version of the mdiobus_write function
726 * @bus: the mii_bus struct
731 * In case of nested MDIO bus access avoid lockdep false positives by
735 * because the bus read/write functions may wait for an interrupt
738 int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write_nested() argument
742 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_write_nested()
743 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write_nested()
744 mutex_unlock(&bus->mdio_lock); in mdiobus_write_nested()
751 * mdiobus_write - Convenience function for writing a given MII mgmt register
752 * @bus: the mii_bus struct
758 * because the bus read/write functions may wait for an interrupt
761 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write() argument
765 mutex_lock(&bus->mdio_lock); in mdiobus_write()
766 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write()
767 mutex_unlock(&bus->mdio_lock); in mdiobus_write()
774 * mdiobus_c45_write - Convenience function for writing a given MII mgmt register
775 * @bus: the mii_bus struct
782 * because the bus read/write functions may wait for an interrupt
785 int mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, in mdiobus_c45_write() argument
790 mutex_lock(&bus->mdio_lock); in mdiobus_c45_write()
791 err = __mdiobus_c45_write(bus, addr, devad, regnum, val); in mdiobus_c45_write()
792 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_write()
799 * mdiobus_c45_write_nested - Nested version of the mdiobus_c45_write function
800 * @bus: the mii_bus struct
806 * In case of nested MDIO bus access avoid lockdep false positives by
810 * because the bus read/write functions may wait for an interrupt
813 int mdiobus_c45_write_nested(struct mii_bus *bus, int addr, int devad, in mdiobus_c45_write_nested() argument
818 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_c45_write_nested()
819 err = __mdiobus_c45_write(bus, addr, devad, regnum, val); in mdiobus_c45_write_nested()
820 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_write_nested()
827 * __mdiobus_modify - Convenience function for modifying a given mdio device
829 * @bus: the mii_bus struct
835 int __mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, in __mdiobus_modify() argument
840 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in __mdiobus_modify()
847 * mdiobus_modify - Convenience function for modifying a given mdio device
849 * @bus: the mii_bus struct
855 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set) in mdiobus_modify() argument
859 mutex_lock(&bus->mdio_lock); in mdiobus_modify()
860 err = __mdiobus_modify(bus, addr, regnum, mask, set); in mdiobus_modify()
861 mutex_unlock(&bus->mdio_lock); in mdiobus_modify()
868 * mdiobus_c45_modify - Convenience function for modifying a given mdio device
870 * @bus: the mii_bus struct
877 int mdiobus_c45_modify(struct mii_bus *bus, int addr, int devad, u32 regnum, in mdiobus_c45_modify() argument
882 mutex_lock(&bus->mdio_lock); in mdiobus_c45_modify()
883 err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, in mdiobus_c45_modify()
885 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_modify()
892 * mdiobus_modify_changed - Convenience function for modifying a given mdio
894 * @bus: the mii_bus struct
900 int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, in mdiobus_modify_changed() argument
905 mutex_lock(&bus->mdio_lock); in mdiobus_modify_changed()
906 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in mdiobus_modify_changed()
907 mutex_unlock(&bus->mdio_lock); in mdiobus_modify_changed()
914 * mdiobus_c45_modify_changed - Convenience function for modifying a given mdio
916 * @bus: the mii_bus struct
923 int mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, int devad, in mdiobus_c45_modify_changed() argument
928 mutex_lock(&bus->mdio_lock); in mdiobus_c45_modify_changed()
929 err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, mask, set); in mdiobus_c45_modify_changed()
930 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_modify_changed()
937 * mdio_bus_match - determine if given MDIO driver supports the given
938 * MDIO device
939 * @dev: target MDIO device
940 * @drv: given MDIO driver
942 * Description: Given a MDIO device, and a MDIO driver, return 1 if
945 * of MDIO devices have different match criteria.
950 struct mdio_device *mdio = to_mdio_device(dev); in mdio_bus_match() local
952 /* Both the driver and device must type-match */ in mdio_bus_match()
953 if (!(mdiodrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY) != in mdio_bus_match()
954 !(mdio->flags & MDIO_DEVICE_FLAG_PHY)) in mdio_bus_match()
960 if (mdio->bus_match) in mdio_bus_match()
961 return mdio->bus_match(dev, drv); in mdio_bus_match()
970 /* Some devices have extra OF data and an OF-style MODALIAS */ in mdio_uevent()
972 if (rc != -ENODEV) in mdio_uevent()
1028 MODULE_DESCRIPTION("MDIO bus/device layer");