Lines Matching +full:function +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0+
42 #include "mdio-boardinfo.h"
47 mdiodev->reset_gpio = gpiod_get_optional(&mdiodev->dev, in mdiobus_register_gpiod()
49 if (IS_ERR(mdiodev->reset_gpio)) in mdiobus_register_gpiod()
50 return PTR_ERR(mdiodev->reset_gpio); in mdiobus_register_gpiod()
52 if (mdiodev->reset_gpio) in mdiobus_register_gpiod()
53 gpiod_set_consumer_name(mdiodev->reset_gpio, "PHY reset"); in mdiobus_register_gpiod()
62 reset = reset_control_get_optional_exclusive(&mdiodev->dev, "phy"); in mdiobus_register_reset()
66 mdiodev->reset_ctrl = reset; in mdiobus_register_reset()
75 if (mdiodev->bus->mdio_map[mdiodev->addr]) in mdiobus_register_device()
76 return -EBUSY; in mdiobus_register_device()
78 if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) { in mdiobus_register_device()
91 mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev; in mdiobus_register_device()
99 if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev) in mdiobus_unregister_device()
100 return -EINVAL; in mdiobus_unregister_device()
102 reset_control_put(mdiodev->reset_ctrl); in mdiobus_unregister_device()
104 mdiodev->bus->mdio_map[mdiodev->addr] = NULL; in mdiobus_unregister_device()
112 bool addr_valid = addr >= 0 && addr < ARRAY_SIZE(bus->mdio_map); in mdiobus_find_device()
117 return bus->mdio_map[addr]; in mdiobus_find_device()
128 if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY)) in mdiobus_get_phy()
142 * mdiobus_alloc_size - allocate a mii_bus structure
144 * If non-zero, then bus->priv is points to that memory.
166 bus->state = MDIOBUS_ALLOCATED; in mdiobus_alloc_size()
168 bus->priv = (void *)bus + aligned_size; in mdiobus_alloc_size()
170 /* Initialise the interrupts to polling and 64-bit seqcounts */ in mdiobus_alloc_size()
172 bus->irq[i] = PHY_POLL; in mdiobus_alloc_size()
173 u64_stats_init(&bus->stats[i].syncp); in mdiobus_alloc_size()
181 * mdiobus_release - mii_bus device release callback
191 WARN(bus->state != MDIOBUS_RELEASED && in mdiobus_release()
193 bus->state != MDIOBUS_ALLOCATED, in mdiobus_release()
195 bus->id); in mdiobus_release()
197 if (bus->state == MDIOBUS_RELEASED) in mdiobus_release()
215 start = u64_stats_fetch_begin(&s->syncp); in mdio_bus_get_stat()
217 } while (u64_stats_fetch_retry(&s->syncp, start)); in mdio_bus_get_stat()
228 val += mdio_bus_get_stat(&bus->stats[i], offset); in mdio_bus_get_global_stat()
243 sattr = eattr->var; in mdio_bus_stat_field_show()
245 if (sattr->addr < 0) in mdio_bus_stat_field_show()
246 val = mdio_bus_get_global_stat(bus, sattr->field_offset); in mdio_bus_stat_field_show()
248 val = mdio_bus_get_stat(&bus->stats[sattr->addr], in mdio_bus_stat_field_show()
249 sattr->field_offset); in mdio_bus_stat_field_show()
259 struct mii_bus *bus = mdiodev->bus; in mdio_bus_device_stat_field_show()
262 int addr = mdiodev->addr; in mdio_bus_device_stat_field_show()
266 sattr = eattr->var; in mdio_bus_device_stat_field_show()
268 val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset); in mdio_bus_device_stat_field_show()
279 -1, offsetof(struct mdio_bus_stats, field) \
287 -1, offsetof(struct mdio_bus_stats, field) \
415 * mdio_find_bus - Given the name of a mdiobus, find the mii_bus.
433 * of_mdio_find_bus - Given an mii_bus node, find the mii_bus.
460 * auto-probed phy devices to be supplied with information passed in
466 struct device *dev = &mdiodev->dev; in of_mdiobus_link_mdiodev()
469 if (dev->of_node || !bus->dev.of_node) in of_mdiobus_link_mdiodev()
472 for_each_available_child_of_node(bus->dev.of_node, child) { in of_mdiobus_link_mdiodev()
479 if (addr == mdiodev->addr) { in of_mdiobus_link_mdiodev()
496 * mdiobus_create_device - create a full MDIO device given
509 mdiodev = mdio_device_create(bus, bi->mdio_addr); in mdiobus_create_device()
511 return -ENODEV; in mdiobus_create_device()
513 strscpy(mdiodev->modalias, bi->modalias, in mdiobus_create_device()
514 sizeof(mdiodev->modalias)); in mdiobus_create_device()
515 mdiodev->bus_match = mdio_device_bus_match; in mdiobus_create_device()
516 mdiodev->dev.platform_data = (void *)bi->platform_data; in mdiobus_create_device()
527 struct phy_device *phydev = ERR_PTR(-ENODEV); in mdiobus_scan()
534 /* For DT, see if the auto-probed phy has a corresponding child in mdiobus_scan()
537 of_mdiobus_link_mdiodev(bus, &phydev->mdio); in mdiobus_scan()
542 return ERR_PTR(-ENODEV); in mdiobus_scan()
549 * mdiobus_scan_c22 - scan one address on a bus for C22 MDIO devices.
553 * This function scans one address on the MDIO bus, looking for
556 * PHY devices typically do. Hence this function assumes anything
567 * mdiobus_scan_c45 - scan one address on a bus for C45 MDIO devices.
571 * This function scans one address on the MDIO bus, looking for
574 * PHY devices typically do. Hence this function assumes anything
588 if ((bus->phy_mask & BIT(i)) == 0) { in mdiobus_scan_bus_c22()
592 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) in mdiobus_scan_bus_c22()
604 if ((bus->phy_mask & BIT(i)) == 0) { in mdiobus_scan_bus_c45()
608 if (bus->mdio_map[i]) in mdiobus_scan_bus_c45()
612 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) in mdiobus_scan_bus_c45()
637 oui = phydev->phy_id >> 10; in mdiobus_prevent_c45_scan()
646 * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus
654 * PHYs will not be brought up by this function. They are expected
666 if (!bus || !bus->name) in __mdiobus_register()
667 return -EINVAL; in __mdiobus_register()
670 if (!!bus->read != !!bus->write || !!bus->read_c45 != !!bus->write_c45) in __mdiobus_register()
671 return -EINVAL; in __mdiobus_register()
674 if (!bus->read && !bus->read_c45) in __mdiobus_register()
675 return -EINVAL; in __mdiobus_register()
677 if (bus->parent && bus->parent->of_node) in __mdiobus_register()
678 bus->parent->of_node->fwnode.flags |= in __mdiobus_register()
681 WARN(bus->state != MDIOBUS_ALLOCATED && in __mdiobus_register()
682 bus->state != MDIOBUS_UNREGISTERED, in __mdiobus_register()
683 "%s: not in ALLOCATED or UNREGISTERED state\n", bus->id); in __mdiobus_register()
685 bus->owner = owner; in __mdiobus_register()
686 bus->dev.parent = bus->parent; in __mdiobus_register()
687 bus->dev.class = &mdio_bus_class; in __mdiobus_register()
688 bus->dev.groups = NULL; in __mdiobus_register()
689 dev_set_name(&bus->dev, "%s", bus->id); in __mdiobus_register()
697 if (bus->state == MDIOBUS_ALLOCATED) in __mdiobus_register()
698 fwnode_handle_get(dev_fwnode(&bus->dev)); in __mdiobus_register()
703 * State will be updated later in this function in case of success in __mdiobus_register()
705 bus->state = MDIOBUS_UNREGISTERED; in __mdiobus_register()
707 err = device_register(&bus->dev); in __mdiobus_register()
709 pr_err("mii_bus %s failed to register\n", bus->id); in __mdiobus_register()
710 return -EINVAL; in __mdiobus_register()
713 mutex_init(&bus->mdio_lock); in __mdiobus_register()
714 mutex_init(&bus->shared_lock); in __mdiobus_register()
717 gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_HIGH); in __mdiobus_register()
719 err = dev_err_probe(&bus->dev, PTR_ERR(gpiod), in __mdiobus_register()
721 bus->id); in __mdiobus_register()
722 device_del(&bus->dev); in __mdiobus_register()
725 bus->reset_gpiod = gpiod; in __mdiobus_register()
726 fsleep(bus->reset_delay_us); in __mdiobus_register()
728 if (bus->reset_post_delay_us > 0) in __mdiobus_register()
729 fsleep(bus->reset_post_delay_us); in __mdiobus_register()
732 if (bus->reset) { in __mdiobus_register()
733 err = bus->reset(bus); in __mdiobus_register()
738 if (bus->read) { in __mdiobus_register()
746 if (!prevent_c45_scan && bus->read_c45) { in __mdiobus_register()
754 bus->state = MDIOBUS_REGISTERED; in __mdiobus_register()
755 dev_dbg(&bus->dev, "probed\n"); in __mdiobus_register()
760 mdiodev = bus->mdio_map[i]; in __mdiobus_register()
764 mdiodev->device_remove(mdiodev); in __mdiobus_register()
765 mdiodev->device_free(mdiodev); in __mdiobus_register()
769 if (bus->reset_gpiod) in __mdiobus_register()
770 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in __mdiobus_register()
772 device_del(&bus->dev); in __mdiobus_register()
782 if (WARN_ON_ONCE(bus->state != MDIOBUS_REGISTERED)) in mdiobus_unregister()
784 bus->state = MDIOBUS_UNREGISTERED; in mdiobus_unregister()
787 mdiodev = bus->mdio_map[i]; in mdiobus_unregister()
791 if (mdiodev->reset_gpio) in mdiobus_unregister()
792 gpiod_put(mdiodev->reset_gpio); in mdiobus_unregister()
794 mdiodev->device_remove(mdiodev); in mdiobus_unregister()
795 mdiodev->device_free(mdiodev); in mdiobus_unregister()
799 if (bus->reset_gpiod) in mdiobus_unregister()
800 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in mdiobus_unregister()
802 device_del(&bus->dev); in mdiobus_unregister()
807 * mdiobus_free - free a struct mii_bus
810 * This function releases the reference to the underlying device
817 if (bus->state == MDIOBUS_ALLOCATED) { in mdiobus_free()
822 WARN(bus->state != MDIOBUS_UNREGISTERED, in mdiobus_free()
823 "%s: not in UNREGISTERED state\n", bus->id); in mdiobus_free()
824 bus->state = MDIOBUS_RELEASED; in mdiobus_free()
826 put_device(&bus->dev); in mdiobus_free()
833 u64_stats_update_begin(&stats->syncp); in mdiobus_stats_acct()
835 u64_stats_inc(&stats->transfers); in mdiobus_stats_acct()
837 u64_stats_inc(&stats->errors); in mdiobus_stats_acct()
842 u64_stats_inc(&stats->reads); in mdiobus_stats_acct()
844 u64_stats_inc(&stats->writes); in mdiobus_stats_acct()
846 u64_stats_update_end(&stats->syncp); in mdiobus_stats_acct()
851 * __mdiobus_read - Unlocked version of the mdiobus_read function
864 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_read()
866 if (bus->read) in __mdiobus_read()
867 retval = bus->read(bus, addr, regnum); in __mdiobus_read()
869 retval = -EOPNOTSUPP; in __mdiobus_read()
872 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_read()
879 * __mdiobus_write - Unlocked version of the mdiobus_write function
893 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_write()
895 if (bus->write) in __mdiobus_write()
896 err = bus->write(bus, addr, regnum, val); in __mdiobus_write()
898 err = -EOPNOTSUPP; in __mdiobus_write()
901 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_write()
908 * __mdiobus_modify_changed - Unlocked version of the mdiobus_modify function
912 * @mask: bit mask of bits to clear
913 * @set: bit mask of bits to set
921 u16 mask, u16 set) in __mdiobus_modify_changed() argument
929 new = (ret & ~mask) | set; in __mdiobus_modify_changed()
940 * __mdiobus_c45_read - Unlocked version of the mdiobus_c45_read function
954 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_c45_read()
956 if (bus->read_c45) in __mdiobus_c45_read()
957 retval = bus->read_c45(bus, addr, devad, regnum); in __mdiobus_c45_read()
959 retval = -EOPNOTSUPP; in __mdiobus_c45_read()
962 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_c45_read()
969 * __mdiobus_c45_write - Unlocked version of the mdiobus_write function
985 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_c45_write()
987 if (bus->write_c45) in __mdiobus_c45_write()
988 err = bus->write_c45(bus, addr, devad, regnum, val); in __mdiobus_c45_write()
990 err = -EOPNOTSUPP; in __mdiobus_c45_write()
993 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_c45_write()
1000 * __mdiobus_c45_modify_changed - Unlocked version of the mdiobus_modify function
1005 * @mask: bit mask of bits to clear
1006 * @set: bit mask of bits to set
1014 int devad, u32 regnum, u16 mask, in __mdiobus_c45_modify_changed() argument
1023 new = (ret & ~mask) | set; in __mdiobus_c45_modify_changed()
1033 * mdiobus_read_nested - Nested version of the mdiobus_read function
1049 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_read_nested()
1051 mutex_unlock(&bus->mdio_lock); in mdiobus_read_nested()
1058 * mdiobus_read - Convenience function for reading a given MII mgmt register
1071 mutex_lock(&bus->mdio_lock); in mdiobus_read()
1073 mutex_unlock(&bus->mdio_lock); in mdiobus_read()
1080 * mdiobus_c45_read - Convenience function for reading a given MII mgmt register
1094 mutex_lock(&bus->mdio_lock); in mdiobus_c45_read()
1096 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_read()
1103 * mdiobus_c45_read_nested - Nested version of the mdiobus_c45_read function
1121 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_c45_read_nested()
1123 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_read_nested()
1130 * mdiobus_write_nested - Nested version of the mdiobus_write function
1147 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_write_nested()
1149 mutex_unlock(&bus->mdio_lock); in mdiobus_write_nested()
1156 * mdiobus_write - Convenience function for writing a given MII mgmt register
1170 mutex_lock(&bus->mdio_lock); in mdiobus_write()
1172 mutex_unlock(&bus->mdio_lock); in mdiobus_write()
1179 * mdiobus_c45_write - Convenience function for writing a given MII mgmt register
1195 mutex_lock(&bus->mdio_lock); in mdiobus_c45_write()
1197 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_write()
1204 * mdiobus_c45_write_nested - Nested version of the mdiobus_c45_write function
1223 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_c45_write_nested()
1225 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_write_nested()
1232 * __mdiobus_modify - Convenience function for modifying a given mdio device
1237 * @mask: bit mask of bits to clear
1238 * @set: bit mask of bits to set
1240 int __mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, in __mdiobus_modify() argument
1245 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in __mdiobus_modify()
1252 * mdiobus_modify - Convenience function for modifying a given mdio device
1257 * @mask: bit mask of bits to clear
1258 * @set: bit mask of bits to set
1260 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set) in mdiobus_modify() argument
1264 mutex_lock(&bus->mdio_lock); in mdiobus_modify()
1265 err = __mdiobus_modify(bus, addr, regnum, mask, set); in mdiobus_modify()
1266 mutex_unlock(&bus->mdio_lock); in mdiobus_modify()
1273 * mdiobus_c45_modify - Convenience function for modifying a given mdio device
1279 * @mask: bit mask of bits to clear
1280 * @set: bit mask of bits to set
1283 u16 mask, u16 set) in mdiobus_c45_modify() argument
1287 mutex_lock(&bus->mdio_lock); in mdiobus_c45_modify()
1289 mask, set); in mdiobus_c45_modify()
1290 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_modify()
1297 * mdiobus_modify_changed - Convenience function for modifying a given mdio
1302 * @mask: bit mask of bits to clear
1303 * @set: bit mask of bits to set
1306 u16 mask, u16 set) in mdiobus_modify_changed() argument
1310 mutex_lock(&bus->mdio_lock); in mdiobus_modify_changed()
1311 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in mdiobus_modify_changed()
1312 mutex_unlock(&bus->mdio_lock); in mdiobus_modify_changed()
1319 * mdiobus_c45_modify_changed - Convenience function for modifying a given mdio
1325 * @mask: bit mask of bits to clear
1326 * @set: bit mask of bits to set
1329 u32 regnum, u16 mask, u16 set) in mdiobus_c45_modify_changed() argument
1333 mutex_lock(&bus->mdio_lock); in mdiobus_c45_modify_changed()
1334 err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, mask, set); in mdiobus_c45_modify_changed()
1335 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_modify_changed()
1342 * mdio_bus_match - determine if given MDIO driver supports the given
1349 * require calling the devices own match function, since different classes
1357 /* Both the driver and device must type-match */ in mdio_bus_match()
1358 if (!(mdiodrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY) != in mdio_bus_match()
1359 !(mdio->flags & MDIO_DEVICE_FLAG_PHY)) in mdio_bus_match()
1365 if (mdio->bus_match) in mdio_bus_match()
1366 return mdio->bus_match(dev, drv); in mdio_bus_match()
1375 /* Some devices have extra OF data and an OF-style MODALIAS */ in mdio_uevent()
1377 if (rc != -ENODEV) in mdio_uevent()