Lines Matching +full:mdio +full:- +full:bus
1 // SPDX-License-Identifier: GPL-2.0+
2 /* MDIO Bus interface
38 #include <trace/events/mdio.h>
40 #include "mdio-boardinfo.h"
45 mdiodev->reset_gpio = gpiod_get_optional(&mdiodev->dev, in mdiobus_register_gpiod()
47 if (IS_ERR(mdiodev->reset_gpio)) in mdiobus_register_gpiod()
48 return PTR_ERR(mdiodev->reset_gpio); in mdiobus_register_gpiod()
50 if (mdiodev->reset_gpio) in mdiobus_register_gpiod()
51 gpiod_set_consumer_name(mdiodev->reset_gpio, "PHY reset"); in mdiobus_register_gpiod()
60 reset = reset_control_get_optional_exclusive(&mdiodev->dev, "phy"); in mdiobus_register_reset()
64 mdiodev->reset_ctrl = reset; in mdiobus_register_reset()
73 if (mdiodev->bus->mdio_map[mdiodev->addr]) in mdiobus_register_device()
74 return -EBUSY; in mdiobus_register_device()
76 if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) { in mdiobus_register_device()
89 mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev; in mdiobus_register_device()
97 if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev) in mdiobus_unregister_device()
98 return -EINVAL; in mdiobus_unregister_device()
100 reset_control_put(mdiodev->reset_ctrl); in mdiobus_unregister_device()
102 mdiodev->bus->mdio_map[mdiodev->addr] = NULL; in mdiobus_unregister_device()
108 static struct mdio_device *mdiobus_find_device(struct mii_bus *bus, int addr) in mdiobus_find_device() argument
110 bool addr_valid = addr >= 0 && addr < ARRAY_SIZE(bus->mdio_map); in mdiobus_find_device()
115 return bus->mdio_map[addr]; in mdiobus_find_device()
118 struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr) in mdiobus_get_phy() argument
122 mdiodev = mdiobus_find_device(bus, addr); in mdiobus_get_phy()
126 if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY)) in mdiobus_get_phy()
129 return container_of(mdiodev, struct phy_device, mdio); in mdiobus_get_phy()
133 bool mdiobus_is_registered_device(struct mii_bus *bus, int addr) in mdiobus_is_registered_device() argument
135 return mdiobus_find_device(bus, addr) != NULL; in mdiobus_is_registered_device()
140 * mdiobus_alloc_size - allocate a mii_bus structure
142 * If non-zero, then bus->priv is points to that memory.
144 * Description: called by a bus driver to allocate an mii_bus
149 struct mii_bus *bus; in mdiobus_alloc_size() local
150 size_t aligned_size = ALIGN(sizeof(*bus), NETDEV_ALIGN); in mdiobus_alloc_size()
158 alloc_size = sizeof(*bus); in mdiobus_alloc_size()
160 bus = kzalloc(alloc_size, GFP_KERNEL); in mdiobus_alloc_size()
161 if (!bus) in mdiobus_alloc_size()
164 bus->state = MDIOBUS_ALLOCATED; in mdiobus_alloc_size()
166 bus->priv = (void *)bus + aligned_size; in mdiobus_alloc_size()
168 /* Initialise the interrupts to polling and 64-bit seqcounts */ in mdiobus_alloc_size()
170 bus->irq[i] = PHY_POLL; in mdiobus_alloc_size()
171 u64_stats_init(&bus->stats[i].syncp); in mdiobus_alloc_size()
174 return bus; in mdiobus_alloc_size()
179 * mdiobus_release - mii_bus device release callback
187 struct mii_bus *bus = to_mii_bus(d); in mdiobus_release() local
189 WARN(bus->state != MDIOBUS_RELEASED && in mdiobus_release()
191 bus->state != MDIOBUS_ALLOCATED, in mdiobus_release()
193 bus->id); in mdiobus_release()
195 if (bus->state == MDIOBUS_RELEASED) in mdiobus_release()
198 kfree(bus); in mdiobus_release()
213 start = u64_stats_fetch_begin(&s->syncp); in mdio_bus_get_stat()
215 } while (u64_stats_fetch_retry(&s->syncp, start)); in mdio_bus_get_stat()
220 static u64 mdio_bus_get_global_stat(struct mii_bus *bus, unsigned int offset) in mdio_bus_get_global_stat() argument
226 val += mdio_bus_get_stat(&bus->stats[i], offset); in mdio_bus_get_global_stat()
235 struct mii_bus *bus = to_mii_bus(dev); in mdio_bus_stat_field_show() local
241 sattr = eattr->var; in mdio_bus_stat_field_show()
243 if (sattr->addr < 0) in mdio_bus_stat_field_show()
244 val = mdio_bus_get_global_stat(bus, sattr->field_offset); in mdio_bus_stat_field_show()
246 val = mdio_bus_get_stat(&bus->stats[sattr->addr], in mdio_bus_stat_field_show()
247 sattr->field_offset); in mdio_bus_stat_field_show()
257 struct mii_bus *bus = mdiodev->bus; in mdio_bus_device_stat_field_show() local
260 int addr = mdiodev->addr; in mdio_bus_device_stat_field_show()
264 sattr = eattr->var; in mdio_bus_device_stat_field_show()
266 val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset); in mdio_bus_device_stat_field_show()
277 -1, offsetof(struct mdio_bus_stats, field) \
285 -1, offsetof(struct mdio_bus_stats, field) \
413 * mdio_find_bus - Given the name of a mdiobus, find the mii_bus.
418 * and this must be put_deviced'ed once the bus is finished with.
431 * of_mdio_find_bus - Given an mii_bus node, find the mii_bus.
436 * and this must be put once the bus is finished with.
455 /* Walk the list of subnodes of a mdio bus and look for a node that
456 * matches the mdio device's address with its 'reg' property. If
457 * found, set the of_node pointer for the mdio device. This allows
458 * auto-probed phy devices to be supplied with information passed in
470 if (of_node_name_eq(child, "ethernet-phy-package")) { in of_mdiobus_find_phy()
474 return -EINVAL; in of_mdiobus_find_phy()
492 if (addr == mdiodev->addr) { in of_mdiobus_find_phy()
494 /* The refcount on "child" is passed to the mdio in of_mdiobus_find_phy()
501 return -ENODEV; in of_mdiobus_find_phy()
504 static void of_mdiobus_link_mdiodev(struct mii_bus *bus, in of_mdiobus_link_mdiodev() argument
507 struct device *dev = &mdiodev->dev; in of_mdiobus_link_mdiodev()
509 if (dev->of_node || !bus->dev.of_node) in of_mdiobus_link_mdiodev()
512 of_mdiobus_find_phy(dev, mdiodev, bus->dev.of_node); in of_mdiobus_link_mdiodev()
515 static inline void of_mdiobus_link_mdiodev(struct mii_bus *mdio, in of_mdiobus_link_mdiodev() argument
522 * mdiobus_create_device - create a full MDIO device given
524 * @bus: MDIO bus to create the devices on
529 static int mdiobus_create_device(struct mii_bus *bus, in mdiobus_create_device() argument
535 mdiodev = mdio_device_create(bus, bi->mdio_addr); in mdiobus_create_device()
537 return -ENODEV; in mdiobus_create_device()
539 strscpy(mdiodev->modalias, bi->modalias, in mdiobus_create_device()
540 sizeof(mdiodev->modalias)); in mdiobus_create_device()
541 mdiodev->bus_match = mdio_device_bus_match; in mdiobus_create_device()
542 mdiodev->dev.platform_data = (void *)bi->platform_data; in mdiobus_create_device()
551 static struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr, bool c45) in mdiobus_scan() argument
553 struct phy_device *phydev = ERR_PTR(-ENODEV); in mdiobus_scan()
558 phydev = get_phy_device(bus, addr, c45); in mdiobus_scan()
562 /* For DT, see if the auto-probed phy has a corresponding child in mdiobus_scan()
563 * in the bus node, and set the of_node pointer in this case. in mdiobus_scan()
565 of_mdiobus_link_mdiodev(bus, &phydev->mdio); in mdiobus_scan()
567 /* Search for a swnode for the phy in the swnode hierarchy of the bus. in mdiobus_scan()
570 if (dev_fwnode(&bus->dev) && !dev_fwnode(&phydev->mdio.dev)) { in mdiobus_scan()
571 snprintf(node_name, sizeof(node_name), "ethernet-phy@%d", in mdiobus_scan()
573 fwnode = fwnode_get_named_child_node(dev_fwnode(&bus->dev), in mdiobus_scan()
576 device_set_node(&phydev->mdio.dev, fwnode); in mdiobus_scan()
582 return ERR_PTR(-ENODEV); in mdiobus_scan()
589 * mdiobus_scan_c22 - scan one address on a bus for C22 MDIO devices.
590 * @bus: mii_bus to scan
591 * @addr: address on bus to scan
593 * This function scans one address on the MDIO bus, looking for
595 * registers 2 and 3. Not all MDIO devices have such registers, but
597 * found is a PHY, or can be treated as a PHY. Other MDIO devices,
600 struct phy_device *mdiobus_scan_c22(struct mii_bus *bus, int addr) in mdiobus_scan_c22() argument
602 return mdiobus_scan(bus, addr, false); in mdiobus_scan_c22()
607 * mdiobus_scan_c45 - scan one address on a bus for C45 MDIO devices.
608 * @bus: mii_bus to scan
609 * @addr: address on bus to scan
611 * This function scans one address on the MDIO bus, looking for
613 * registers 2 and 3. Not all MDIO devices have such registers, but
615 * found is a PHY, or can be treated as a PHY. Other MDIO devices,
618 static struct phy_device *mdiobus_scan_c45(struct mii_bus *bus, int addr) in mdiobus_scan_c45() argument
620 return mdiobus_scan(bus, addr, true); in mdiobus_scan_c45()
623 static int mdiobus_scan_bus_c22(struct mii_bus *bus) in mdiobus_scan_bus_c22() argument
628 if ((bus->phy_mask & BIT(i)) == 0) { in mdiobus_scan_bus_c22()
631 phydev = mdiobus_scan_c22(bus, i); in mdiobus_scan_bus_c22()
632 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) in mdiobus_scan_bus_c22()
639 static int mdiobus_scan_bus_c45(struct mii_bus *bus) in mdiobus_scan_bus_c45() argument
644 if ((bus->phy_mask & BIT(i)) == 0) { in mdiobus_scan_bus_c45()
648 if (bus->mdio_map[i]) in mdiobus_scan_bus_c45()
651 phydev = mdiobus_scan_c45(bus, i); in mdiobus_scan_bus_c45()
652 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) in mdiobus_scan_bus_c45()
660 * transaction on the bus, like accepting a read themselves, and
666 static bool mdiobus_prevent_c45_scan(struct mii_bus *bus) in mdiobus_prevent_c45_scan() argument
674 phydev = mdiobus_get_phy(bus, i); in mdiobus_prevent_c45_scan()
677 oui = phydev->phy_id >> 10; in mdiobus_prevent_c45_scan()
686 * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus
687 * @bus: target mii_bus
688 * @owner: module containing bus accessor functions
690 * Description: Called by a bus driver to bring up all the PHYs
691 * on a given bus, and attach them to the bus. Drivers should use
693 * need to pass a specific owner module. MDIO devices which are not
699 int __mdiobus_register(struct mii_bus *bus, struct module *owner) in __mdiobus_register() argument
706 if (!bus || !bus->name) in __mdiobus_register()
707 return -EINVAL; in __mdiobus_register()
710 if (!!bus->read != !!bus->write || !!bus->read_c45 != !!bus->write_c45) in __mdiobus_register()
711 return -EINVAL; in __mdiobus_register()
714 if (!bus->read && !bus->read_c45) in __mdiobus_register()
715 return -EINVAL; in __mdiobus_register()
717 if (bus->parent && bus->parent->of_node) in __mdiobus_register()
718 bus->parent->of_node->fwnode.flags |= in __mdiobus_register()
721 WARN(bus->state != MDIOBUS_ALLOCATED && in __mdiobus_register()
722 bus->state != MDIOBUS_UNREGISTERED, in __mdiobus_register()
723 "%s: not in ALLOCATED or UNREGISTERED state\n", bus->id); in __mdiobus_register()
725 bus->owner = owner; in __mdiobus_register()
726 bus->dev.parent = bus->parent; in __mdiobus_register()
727 bus->dev.class = &mdio_bus_class; in __mdiobus_register()
728 bus->dev.groups = NULL; in __mdiobus_register()
729 dev_set_name(&bus->dev, "%s", bus->id); in __mdiobus_register()
731 /* If the bus state is allocated, we're registering a fresh bus in __mdiobus_register()
733 * to the fwnode. This will be dropped when the bus is released. in __mdiobus_register()
734 * If the bus was set to unregistered, it means that the bus was in __mdiobus_register()
737 if (bus->state == MDIOBUS_ALLOCATED) in __mdiobus_register()
738 fwnode_handle_get(dev_fwnode(&bus->dev)); in __mdiobus_register()
745 bus->state = MDIOBUS_UNREGISTERED; in __mdiobus_register()
747 err = device_register(&bus->dev); in __mdiobus_register()
749 pr_err("mii_bus %s failed to register\n", bus->id); in __mdiobus_register()
750 return -EINVAL; in __mdiobus_register()
753 mutex_init(&bus->mdio_lock); in __mdiobus_register()
754 mutex_init(&bus->shared_lock); in __mdiobus_register()
756 /* assert bus level PHY GPIO reset */ in __mdiobus_register()
757 gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_HIGH); in __mdiobus_register()
759 err = dev_err_probe(&bus->dev, PTR_ERR(gpiod), in __mdiobus_register()
761 bus->id); in __mdiobus_register()
762 device_del(&bus->dev); in __mdiobus_register()
765 bus->reset_gpiod = gpiod; in __mdiobus_register()
766 fsleep(bus->reset_delay_us); in __mdiobus_register()
768 if (bus->reset_post_delay_us > 0) in __mdiobus_register()
769 fsleep(bus->reset_post_delay_us); in __mdiobus_register()
772 if (bus->reset) { in __mdiobus_register()
773 err = bus->reset(bus); in __mdiobus_register()
778 if (bus->read) { in __mdiobus_register()
779 err = mdiobus_scan_bus_c22(bus); in __mdiobus_register()
784 prevent_c45_scan = mdiobus_prevent_c45_scan(bus); in __mdiobus_register()
786 if (!prevent_c45_scan && bus->read_c45) { in __mdiobus_register()
787 err = mdiobus_scan_bus_c45(bus); in __mdiobus_register()
792 mdiobus_setup_mdiodev_from_board_info(bus, mdiobus_create_device); in __mdiobus_register()
794 bus->state = MDIOBUS_REGISTERED; in __mdiobus_register()
795 dev_dbg(&bus->dev, "probed\n"); in __mdiobus_register()
800 mdiodev = bus->mdio_map[i]; in __mdiobus_register()
804 mdiodev->device_remove(mdiodev); in __mdiobus_register()
805 mdiodev->device_free(mdiodev); in __mdiobus_register()
809 if (bus->reset_gpiod) in __mdiobus_register()
810 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in __mdiobus_register()
812 device_del(&bus->dev); in __mdiobus_register()
817 void mdiobus_unregister(struct mii_bus *bus) in mdiobus_unregister() argument
822 if (WARN_ON_ONCE(bus->state != MDIOBUS_REGISTERED)) in mdiobus_unregister()
824 bus->state = MDIOBUS_UNREGISTERED; in mdiobus_unregister()
827 mdiodev = bus->mdio_map[i]; in mdiobus_unregister()
831 if (mdiodev->reset_gpio) in mdiobus_unregister()
832 gpiod_put(mdiodev->reset_gpio); in mdiobus_unregister()
834 mdiodev->device_remove(mdiodev); in mdiobus_unregister()
835 mdiodev->device_free(mdiodev); in mdiobus_unregister()
839 if (bus->reset_gpiod) in mdiobus_unregister()
840 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in mdiobus_unregister()
842 device_del(&bus->dev); in mdiobus_unregister()
847 * mdiobus_free - free a struct mii_bus
848 * @bus: mii_bus to free
854 void mdiobus_free(struct mii_bus *bus) in mdiobus_free() argument
857 if (bus->state == MDIOBUS_ALLOCATED) { in mdiobus_free()
858 kfree(bus); in mdiobus_free()
862 WARN(bus->state != MDIOBUS_UNREGISTERED, in mdiobus_free()
863 "%s: not in UNREGISTERED state\n", bus->id); in mdiobus_free()
864 bus->state = MDIOBUS_RELEASED; in mdiobus_free()
866 put_device(&bus->dev); in mdiobus_free()
873 u64_stats_update_begin(&stats->syncp); in mdiobus_stats_acct()
875 u64_stats_inc(&stats->transfers); in mdiobus_stats_acct()
877 u64_stats_inc(&stats->errors); in mdiobus_stats_acct()
882 u64_stats_inc(&stats->reads); in mdiobus_stats_acct()
884 u64_stats_inc(&stats->writes); in mdiobus_stats_acct()
886 u64_stats_update_end(&stats->syncp); in mdiobus_stats_acct()
891 * __mdiobus_read - Unlocked version of the mdiobus_read function
892 * @bus: the mii_bus struct
896 * Read a MDIO bus register. Caller must hold the mdio bus lock.
900 int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in __mdiobus_read() argument
904 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_read()
906 if (bus->read) in __mdiobus_read()
907 retval = bus->read(bus, addr, regnum); in __mdiobus_read()
909 retval = -EOPNOTSUPP; in __mdiobus_read()
911 trace_mdio_access(bus, 1, addr, regnum, retval, retval); in __mdiobus_read()
912 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_read()
919 * __mdiobus_write - Unlocked version of the mdiobus_write function
920 * @bus: the mii_bus struct
925 * Write a MDIO bus register. Caller must hold the mdio bus lock.
929 int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in __mdiobus_write() argument
933 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_write()
935 if (bus->write) in __mdiobus_write()
936 err = bus->write(bus, addr, regnum, val); in __mdiobus_write()
938 err = -EOPNOTSUPP; in __mdiobus_write()
940 trace_mdio_access(bus, 0, addr, regnum, val, err); in __mdiobus_write()
941 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_write()
948 * __mdiobus_modify_changed - Unlocked version of the mdiobus_modify function
949 * @bus: the mii_bus struct
960 int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, in __mdiobus_modify_changed() argument
965 ret = __mdiobus_read(bus, addr, regnum); in __mdiobus_modify_changed()
973 ret = __mdiobus_write(bus, addr, regnum, new); in __mdiobus_modify_changed()
980 * __mdiobus_c45_read - Unlocked version of the mdiobus_c45_read function
981 * @bus: the mii_bus struct
986 * Read a MDIO bus register. Caller must hold the mdio bus lock.
990 int __mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) in __mdiobus_c45_read() argument
994 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_c45_read()
996 if (bus->read_c45) in __mdiobus_c45_read()
997 retval = bus->read_c45(bus, addr, devad, regnum); in __mdiobus_c45_read()
999 retval = -EOPNOTSUPP; in __mdiobus_c45_read()
1001 trace_mdio_access(bus, 1, addr, regnum, retval, retval); in __mdiobus_c45_read()
1002 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_c45_read()
1009 * __mdiobus_c45_write - Unlocked version of the mdiobus_write function
1010 * @bus: the mii_bus struct
1016 * Write a MDIO bus register. Caller must hold the mdio bus lock.
1020 int __mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, in __mdiobus_c45_write() argument
1025 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_c45_write()
1027 if (bus->write_c45) in __mdiobus_c45_write()
1028 err = bus->write_c45(bus, addr, devad, regnum, val); in __mdiobus_c45_write()
1030 err = -EOPNOTSUPP; in __mdiobus_c45_write()
1032 trace_mdio_access(bus, 0, addr, regnum, val, err); in __mdiobus_c45_write()
1033 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_c45_write()
1040 * __mdiobus_c45_modify_changed - Unlocked version of the mdiobus_modify function
1041 * @bus: the mii_bus struct
1053 static int __mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, in __mdiobus_c45_modify_changed() argument
1059 ret = __mdiobus_c45_read(bus, addr, devad, regnum); in __mdiobus_c45_modify_changed()
1067 ret = __mdiobus_c45_write(bus, addr, devad, regnum, new); in __mdiobus_c45_modify_changed()
1073 * mdiobus_read_nested - Nested version of the mdiobus_read function
1074 * @bus: the mii_bus struct
1078 * In case of nested MDIO bus access avoid lockdep false positives by
1082 * because the bus read/write functions may wait for an interrupt
1085 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read_nested() argument
1089 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_read_nested()
1090 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read_nested()
1091 mutex_unlock(&bus->mdio_lock); in mdiobus_read_nested()
1098 * mdiobus_read - Convenience function for reading a given MII mgmt register
1099 * @bus: the mii_bus struct
1104 * because the bus read/write functions may wait for an interrupt
1107 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read() argument
1111 mutex_lock(&bus->mdio_lock); in mdiobus_read()
1112 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read()
1113 mutex_unlock(&bus->mdio_lock); in mdiobus_read()
1120 * mdiobus_c45_read - Convenience function for reading a given MII mgmt register
1121 * @bus: the mii_bus struct
1127 * because the bus read/write functions may wait for an interrupt
1130 int mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) in mdiobus_c45_read() argument
1134 mutex_lock(&bus->mdio_lock); in mdiobus_c45_read()
1135 retval = __mdiobus_c45_read(bus, addr, devad, regnum); in mdiobus_c45_read()
1136 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_read()
1143 * mdiobus_c45_read_nested - Nested version of the mdiobus_c45_read function
1144 * @bus: the mii_bus struct
1149 * In case of nested MDIO bus access avoid lockdep false positives by
1153 * because the bus read/write functions may wait for an interrupt
1156 int mdiobus_c45_read_nested(struct mii_bus *bus, int addr, int devad, in mdiobus_c45_read_nested() argument
1161 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_c45_read_nested()
1162 retval = __mdiobus_c45_read(bus, addr, devad, regnum); in mdiobus_c45_read_nested()
1163 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_read_nested()
1170 * mdiobus_write_nested - Nested version of the mdiobus_write function
1171 * @bus: the mii_bus struct
1176 * In case of nested MDIO bus access avoid lockdep false positives by
1180 * because the bus read/write functions may wait for an interrupt
1183 int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write_nested() argument
1187 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_write_nested()
1188 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write_nested()
1189 mutex_unlock(&bus->mdio_lock); in mdiobus_write_nested()
1196 * mdiobus_write - Convenience function for writing a given MII mgmt register
1197 * @bus: the mii_bus struct
1203 * because the bus read/write functions may wait for an interrupt
1206 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write() argument
1210 mutex_lock(&bus->mdio_lock); in mdiobus_write()
1211 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write()
1212 mutex_unlock(&bus->mdio_lock); in mdiobus_write()
1219 * mdiobus_c45_write - Convenience function for writing a given MII mgmt register
1220 * @bus: the mii_bus struct
1227 * because the bus read/write functions may wait for an interrupt
1230 int mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, in mdiobus_c45_write() argument
1235 mutex_lock(&bus->mdio_lock); in mdiobus_c45_write()
1236 err = __mdiobus_c45_write(bus, addr, devad, regnum, val); in mdiobus_c45_write()
1237 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_write()
1244 * mdiobus_c45_write_nested - Nested version of the mdiobus_c45_write function
1245 * @bus: the mii_bus struct
1251 * In case of nested MDIO bus access avoid lockdep false positives by
1255 * because the bus read/write functions may wait for an interrupt
1258 int mdiobus_c45_write_nested(struct mii_bus *bus, int addr, int devad, in mdiobus_c45_write_nested() argument
1263 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_c45_write_nested()
1264 err = __mdiobus_c45_write(bus, addr, devad, regnum, val); in mdiobus_c45_write_nested()
1265 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_write_nested()
1272 * __mdiobus_modify - Convenience function for modifying a given mdio device
1274 * @bus: the mii_bus struct
1280 int __mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, in __mdiobus_modify() argument
1285 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in __mdiobus_modify()
1292 * mdiobus_modify - Convenience function for modifying a given mdio device
1294 * @bus: the mii_bus struct
1300 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set) in mdiobus_modify() argument
1304 mutex_lock(&bus->mdio_lock); in mdiobus_modify()
1305 err = __mdiobus_modify(bus, addr, regnum, mask, set); in mdiobus_modify()
1306 mutex_unlock(&bus->mdio_lock); in mdiobus_modify()
1313 * mdiobus_c45_modify - Convenience function for modifying a given mdio device
1315 * @bus: the mii_bus struct
1322 int mdiobus_c45_modify(struct mii_bus *bus, int addr, int devad, u32 regnum, in mdiobus_c45_modify() argument
1327 mutex_lock(&bus->mdio_lock); in mdiobus_c45_modify()
1328 err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, in mdiobus_c45_modify()
1330 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_modify()
1337 * mdiobus_modify_changed - Convenience function for modifying a given mdio
1339 * @bus: the mii_bus struct
1345 int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, in mdiobus_modify_changed() argument
1350 mutex_lock(&bus->mdio_lock); in mdiobus_modify_changed()
1351 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in mdiobus_modify_changed()
1352 mutex_unlock(&bus->mdio_lock); in mdiobus_modify_changed()
1359 * mdiobus_c45_modify_changed - Convenience function for modifying a given mdio
1361 * @bus: the mii_bus struct
1368 int mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, int devad, in mdiobus_c45_modify_changed() argument
1373 mutex_lock(&bus->mdio_lock); in mdiobus_c45_modify_changed()
1374 err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, mask, set); in mdiobus_c45_modify_changed()
1375 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_modify_changed()
1382 * mdio_bus_match - determine if given MDIO driver supports the given
1383 * MDIO device
1384 * @dev: target MDIO device
1385 * @drv: given MDIO driver
1387 * Description: Given a MDIO device, and a MDIO driver, return 1 if
1390 * of MDIO devices have different match criteria.
1395 struct mdio_device *mdio = to_mdio_device(dev); in mdio_bus_match() local
1397 /* Both the driver and device must type-match */ in mdio_bus_match()
1398 if (!(mdiodrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY) != in mdio_bus_match()
1399 !(mdio->flags & MDIO_DEVICE_FLAG_PHY)) in mdio_bus_match()
1405 if (mdio->bus_match) in mdio_bus_match()
1406 return mdio->bus_match(dev, drv); in mdio_bus_match()
1415 /* Some devices have extra OF data and an OF-style MODALIAS */ in mdio_uevent()
1417 if (rc != -ENODEV) in mdio_uevent()
1474 MODULE_DESCRIPTION("MDIO bus/device layer");