Lines Matching +full:bus +full:- +full:addr
1 // SPDX-License-Identifier: GPL-2.0+
2 /* MDIO Bus interface
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()
110 static struct mdio_device *mdiobus_find_device(struct mii_bus *bus, int addr) in mdiobus_find_device() argument
112 bool addr_valid = addr >= 0 && addr < ARRAY_SIZE(bus->mdio_map); in mdiobus_find_device()
114 if (WARN_ONCE(!addr_valid, "addr %d out of range\n", addr)) in mdiobus_find_device()
117 return bus->mdio_map[addr]; in mdiobus_find_device()
120 struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr) in mdiobus_get_phy() argument
124 mdiodev = mdiobus_find_device(bus, addr); in mdiobus_get_phy()
128 if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY)) in mdiobus_get_phy()
135 bool mdiobus_is_registered_device(struct mii_bus *bus, int addr) in mdiobus_is_registered_device() argument
137 return mdiobus_find_device(bus, addr) != NULL; in mdiobus_is_registered_device()
142 * mdiobus_alloc_size - allocate a mii_bus structure
144 * If non-zero, then bus->priv is points to that memory.
146 * Description: called by a bus driver to allocate an mii_bus
151 struct mii_bus *bus; in mdiobus_alloc_size() local
152 size_t aligned_size = ALIGN(sizeof(*bus), NETDEV_ALIGN); in mdiobus_alloc_size()
160 alloc_size = sizeof(*bus); in mdiobus_alloc_size()
162 bus = kzalloc(alloc_size, GFP_KERNEL); in mdiobus_alloc_size()
163 if (!bus) in mdiobus_alloc_size()
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()
176 return bus; in mdiobus_alloc_size()
181 * mdiobus_release - mii_bus device release callback
189 struct mii_bus *bus = to_mii_bus(d); in mdiobus_release() local
191 WARN(bus->state != MDIOBUS_RELEASED && in mdiobus_release()
193 bus->state != MDIOBUS_ALLOCATED, in mdiobus_release()
195 bus->id); in mdiobus_release()
196 kfree(bus); in mdiobus_release()
200 int addr; member
211 start = u64_stats_fetch_begin(&s->syncp); in mdio_bus_get_stat()
213 } while (u64_stats_fetch_retry(&s->syncp, start)); in mdio_bus_get_stat()
218 static u64 mdio_bus_get_global_stat(struct mii_bus *bus, unsigned int offset) in mdio_bus_get_global_stat() argument
224 val += mdio_bus_get_stat(&bus->stats[i], offset); in mdio_bus_get_global_stat()
233 struct mii_bus *bus = to_mii_bus(dev); in mdio_bus_stat_field_show() local
239 sattr = eattr->var; in mdio_bus_stat_field_show()
241 if (sattr->addr < 0) in mdio_bus_stat_field_show()
242 val = mdio_bus_get_global_stat(bus, sattr->field_offset); in mdio_bus_stat_field_show()
244 val = mdio_bus_get_stat(&bus->stats[sattr->addr], in mdio_bus_stat_field_show()
245 sattr->field_offset); in mdio_bus_stat_field_show()
255 struct mii_bus *bus = mdiodev->bus; in mdio_bus_device_stat_field_show() local
258 int addr = mdiodev->addr; in mdio_bus_device_stat_field_show() local
262 sattr = eattr->var; in mdio_bus_device_stat_field_show()
264 val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset); in mdio_bus_device_stat_field_show()
275 -1, offsetof(struct mdio_bus_stats, field) \
283 -1, offsetof(struct mdio_bus_stats, field) \
295 #define MDIO_BUS_STATS_ADDR_ATTR_DECL(field, addr, file) \ argument
296 static struct dev_ext_attribute dev_attr_mdio_bus_addr_##field##_##addr = { \
301 addr, offsetof(struct mdio_bus_stats, field) \
305 #define MDIO_BUS_STATS_ADDR_ATTR(field, addr) \ argument
306 MDIO_BUS_STATS_ADDR_ATTR_DECL(field, addr, \
307 __stringify(field) "_" __stringify(addr))
309 #define MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(addr) \ argument
310 MDIO_BUS_STATS_ADDR_ATTR(transfers, addr); \
311 MDIO_BUS_STATS_ADDR_ATTR(errors, addr); \
312 MDIO_BUS_STATS_ADDR_ATTR(writes, addr); \
313 MDIO_BUS_STATS_ADDR_ATTR(reads, addr) \
348 #define MDIO_BUS_STATS_ADDR_ATTR_GROUP(addr) \ argument
349 &dev_attr_mdio_bus_addr_transfers_##addr.attr.attr, \
350 &dev_attr_mdio_bus_addr_errors_##addr.attr.attr, \
351 &dev_attr_mdio_bus_addr_writes_##addr.attr.attr, \
352 &dev_attr_mdio_bus_addr_reads_##addr.attr.attr \
411 * mdio_find_bus - Given the name of a mdiobus, find the mii_bus.
416 * and this must be put_deviced'ed once the bus is finished with.
429 * of_mdio_find_bus - Given an mii_bus node, find the mii_bus.
434 * and this must be put once the bus is finished with.
453 /* Walk the list of subnodes of a mdio bus and look for a node that
456 * auto-probed phy devices to be supplied with information passed in
459 static void of_mdiobus_link_mdiodev(struct mii_bus *bus, in of_mdiobus_link_mdiodev() argument
462 struct device *dev = &mdiodev->dev; in of_mdiobus_link_mdiodev()
465 if (dev->of_node || !bus->dev.of_node) in of_mdiobus_link_mdiodev()
468 for_each_available_child_of_node(bus->dev.of_node, child) { in of_mdiobus_link_mdiodev()
469 int addr; in of_mdiobus_link_mdiodev() local
471 addr = of_mdio_parse_addr(dev, child); in of_mdiobus_link_mdiodev()
472 if (addr < 0) in of_mdiobus_link_mdiodev()
475 if (addr == mdiodev->addr) { in of_mdiobus_link_mdiodev()
492 * mdiobus_create_device - create a full MDIO device given
494 * @bus: MDIO bus to create the devices on
499 static int mdiobus_create_device(struct mii_bus *bus, in mdiobus_create_device() argument
505 mdiodev = mdio_device_create(bus, bi->mdio_addr); in mdiobus_create_device()
507 return -ENODEV; in mdiobus_create_device()
509 strncpy(mdiodev->modalias, bi->modalias, in mdiobus_create_device()
510 sizeof(mdiodev->modalias)); in mdiobus_create_device()
511 mdiodev->bus_match = mdio_device_bus_match; in mdiobus_create_device()
512 mdiodev->dev.platform_data = (void *)bi->platform_data; in mdiobus_create_device()
521 static struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr, bool c45) in mdiobus_scan() argument
523 struct phy_device *phydev = ERR_PTR(-ENODEV); in mdiobus_scan()
526 phydev = get_phy_device(bus, addr, c45); in mdiobus_scan()
530 /* For DT, see if the auto-probed phy has a corresponding child in mdiobus_scan()
531 * in the bus node, and set the of_node pointer in this case. in mdiobus_scan()
533 of_mdiobus_link_mdiodev(bus, &phydev->mdio); in mdiobus_scan()
538 return ERR_PTR(-ENODEV); in mdiobus_scan()
545 * mdiobus_scan_c22 - scan one address on a bus for C22 MDIO devices.
546 * @bus: mii_bus to scan
547 * @addr: address on bus to scan
549 * This function scans one address on the MDIO bus, looking for
556 struct phy_device *mdiobus_scan_c22(struct mii_bus *bus, int addr) in mdiobus_scan_c22() argument
558 return mdiobus_scan(bus, addr, false); in mdiobus_scan_c22()
563 * mdiobus_scan_c45 - scan one address on a bus for C45 MDIO devices.
564 * @bus: mii_bus to scan
565 * @addr: address on bus to scan
567 * This function scans one address on the MDIO bus, looking for
574 static struct phy_device *mdiobus_scan_c45(struct mii_bus *bus, int addr) in mdiobus_scan_c45() argument
576 return mdiobus_scan(bus, addr, true); in mdiobus_scan_c45()
579 static int mdiobus_scan_bus_c22(struct mii_bus *bus) in mdiobus_scan_bus_c22() argument
584 if ((bus->phy_mask & BIT(i)) == 0) { in mdiobus_scan_bus_c22()
587 phydev = mdiobus_scan_c22(bus, i); in mdiobus_scan_bus_c22()
588 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) in mdiobus_scan_bus_c22()
595 static int mdiobus_scan_bus_c45(struct mii_bus *bus) in mdiobus_scan_bus_c45() argument
600 if ((bus->phy_mask & BIT(i)) == 0) { in mdiobus_scan_bus_c45()
604 if (bus->mdio_map[i]) in mdiobus_scan_bus_c45()
607 phydev = mdiobus_scan_c45(bus, i); in mdiobus_scan_bus_c45()
608 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) in mdiobus_scan_bus_c45()
616 * transaction on the bus, like accepting a read themselves, and
622 static bool mdiobus_prevent_c45_scan(struct mii_bus *bus) in mdiobus_prevent_c45_scan() argument
630 phydev = mdiobus_get_phy(bus, i); in mdiobus_prevent_c45_scan()
633 oui = phydev->phy_id >> 10; in mdiobus_prevent_c45_scan()
642 * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus
643 * @bus: target mii_bus
644 * @owner: module containing bus accessor functions
646 * Description: Called by a bus driver to bring up all the PHYs
647 * on a given bus, and attach them to the bus. Drivers should use
655 int __mdiobus_register(struct mii_bus *bus, struct module *owner) in __mdiobus_register() argument
662 if (!bus || !bus->name) in __mdiobus_register()
663 return -EINVAL; in __mdiobus_register()
666 if (!!bus->read != !!bus->write || !!bus->read_c45 != !!bus->write_c45) in __mdiobus_register()
667 return -EINVAL; in __mdiobus_register()
670 if (!bus->read && !bus->read_c45) in __mdiobus_register()
671 return -EINVAL; in __mdiobus_register()
673 if (bus->parent && bus->parent->of_node) in __mdiobus_register()
674 bus->parent->of_node->fwnode.flags |= in __mdiobus_register()
677 WARN(bus->state != MDIOBUS_ALLOCATED && in __mdiobus_register()
678 bus->state != MDIOBUS_UNREGISTERED, in __mdiobus_register()
679 "%s: not in ALLOCATED or UNREGISTERED state\n", bus->id); in __mdiobus_register()
681 bus->owner = owner; in __mdiobus_register()
682 bus->dev.parent = bus->parent; in __mdiobus_register()
683 bus->dev.class = &mdio_bus_class; in __mdiobus_register()
684 bus->dev.groups = NULL; in __mdiobus_register()
685 dev_set_name(&bus->dev, "%s", bus->id); in __mdiobus_register()
692 bus->state = MDIOBUS_UNREGISTERED; in __mdiobus_register()
694 err = device_register(&bus->dev); in __mdiobus_register()
696 pr_err("mii_bus %s failed to register\n", bus->id); in __mdiobus_register()
697 return -EINVAL; in __mdiobus_register()
700 mutex_init(&bus->mdio_lock); in __mdiobus_register()
701 mutex_init(&bus->shared_lock); in __mdiobus_register()
703 /* assert bus level PHY GPIO reset */ in __mdiobus_register()
704 gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_HIGH); in __mdiobus_register()
706 err = dev_err_probe(&bus->dev, PTR_ERR(gpiod), in __mdiobus_register()
708 bus->id); in __mdiobus_register()
709 device_del(&bus->dev); in __mdiobus_register()
712 bus->reset_gpiod = gpiod; in __mdiobus_register()
713 fsleep(bus->reset_delay_us); in __mdiobus_register()
715 if (bus->reset_post_delay_us > 0) in __mdiobus_register()
716 fsleep(bus->reset_post_delay_us); in __mdiobus_register()
719 if (bus->reset) { in __mdiobus_register()
720 err = bus->reset(bus); in __mdiobus_register()
725 if (bus->read) { in __mdiobus_register()
726 err = mdiobus_scan_bus_c22(bus); in __mdiobus_register()
731 prevent_c45_scan = mdiobus_prevent_c45_scan(bus); in __mdiobus_register()
733 if (!prevent_c45_scan && bus->read_c45) { in __mdiobus_register()
734 err = mdiobus_scan_bus_c45(bus); in __mdiobus_register()
739 mdiobus_setup_mdiodev_from_board_info(bus, mdiobus_create_device); in __mdiobus_register()
741 bus->state = MDIOBUS_REGISTERED; in __mdiobus_register()
742 dev_dbg(&bus->dev, "probed\n"); in __mdiobus_register()
747 mdiodev = bus->mdio_map[i]; in __mdiobus_register()
751 mdiodev->device_remove(mdiodev); in __mdiobus_register()
752 mdiodev->device_free(mdiodev); in __mdiobus_register()
756 if (bus->reset_gpiod) in __mdiobus_register()
757 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in __mdiobus_register()
759 device_del(&bus->dev); in __mdiobus_register()
764 void mdiobus_unregister(struct mii_bus *bus) in mdiobus_unregister() argument
769 if (WARN_ON_ONCE(bus->state != MDIOBUS_REGISTERED)) in mdiobus_unregister()
771 bus->state = MDIOBUS_UNREGISTERED; in mdiobus_unregister()
774 mdiodev = bus->mdio_map[i]; in mdiobus_unregister()
778 if (mdiodev->reset_gpio) in mdiobus_unregister()
779 gpiod_put(mdiodev->reset_gpio); in mdiobus_unregister()
781 mdiodev->device_remove(mdiodev); in mdiobus_unregister()
782 mdiodev->device_free(mdiodev); in mdiobus_unregister()
786 if (bus->reset_gpiod) in mdiobus_unregister()
787 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in mdiobus_unregister()
789 device_del(&bus->dev); in mdiobus_unregister()
794 * mdiobus_free - free a struct mii_bus
795 * @bus: mii_bus to free
801 void mdiobus_free(struct mii_bus *bus) in mdiobus_free() argument
804 if (bus->state == MDIOBUS_ALLOCATED) { in mdiobus_free()
805 kfree(bus); in mdiobus_free()
809 WARN(bus->state != MDIOBUS_UNREGISTERED, in mdiobus_free()
810 "%s: not in UNREGISTERED state\n", bus->id); in mdiobus_free()
811 bus->state = MDIOBUS_RELEASED; in mdiobus_free()
813 put_device(&bus->dev); in mdiobus_free()
820 u64_stats_update_begin(&stats->syncp); in mdiobus_stats_acct()
822 u64_stats_inc(&stats->transfers); in mdiobus_stats_acct()
824 u64_stats_inc(&stats->errors); in mdiobus_stats_acct()
829 u64_stats_inc(&stats->reads); in mdiobus_stats_acct()
831 u64_stats_inc(&stats->writes); in mdiobus_stats_acct()
833 u64_stats_update_end(&stats->syncp); in mdiobus_stats_acct()
838 * __mdiobus_read - Unlocked version of the mdiobus_read function
839 * @bus: the mii_bus struct
840 * @addr: the phy address
843 * Read a MDIO bus register. Caller must hold the mdio bus lock.
847 int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in __mdiobus_read() argument
851 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_read()
853 if (bus->read) in __mdiobus_read()
854 retval = bus->read(bus, addr, regnum); in __mdiobus_read()
856 retval = -EOPNOTSUPP; in __mdiobus_read()
858 trace_mdio_access(bus, 1, addr, regnum, retval, retval); in __mdiobus_read()
859 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_read()
866 * __mdiobus_write - Unlocked version of the mdiobus_write function
867 * @bus: the mii_bus struct
868 * @addr: the phy address
872 * Write a MDIO bus register. Caller must hold the mdio bus lock.
876 int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in __mdiobus_write() argument
880 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_write()
882 if (bus->write) in __mdiobus_write()
883 err = bus->write(bus, addr, regnum, val); in __mdiobus_write()
885 err = -EOPNOTSUPP; in __mdiobus_write()
887 trace_mdio_access(bus, 0, addr, regnum, val, err); in __mdiobus_write()
888 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_write()
895 * __mdiobus_modify_changed - Unlocked version of the mdiobus_modify function
896 * @bus: the mii_bus struct
897 * @addr: the phy address
907 int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, in __mdiobus_modify_changed() argument
912 ret = __mdiobus_read(bus, addr, regnum); in __mdiobus_modify_changed()
920 ret = __mdiobus_write(bus, addr, regnum, new); in __mdiobus_modify_changed()
927 * __mdiobus_c45_read - Unlocked version of the mdiobus_c45_read function
928 * @bus: the mii_bus struct
929 * @addr: the phy address
933 * Read a MDIO bus register. Caller must hold the mdio bus lock.
937 int __mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) in __mdiobus_c45_read() argument
941 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_c45_read()
943 if (bus->read_c45) in __mdiobus_c45_read()
944 retval = bus->read_c45(bus, addr, devad, regnum); in __mdiobus_c45_read()
946 retval = -EOPNOTSUPP; in __mdiobus_c45_read()
948 trace_mdio_access(bus, 1, addr, regnum, retval, retval); in __mdiobus_c45_read()
949 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_c45_read()
956 * __mdiobus_c45_write - Unlocked version of the mdiobus_write function
957 * @bus: the mii_bus struct
958 * @addr: the phy address
963 * Write a MDIO bus register. Caller must hold the mdio bus lock.
967 int __mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, in __mdiobus_c45_write() argument
972 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_c45_write()
974 if (bus->write_c45) in __mdiobus_c45_write()
975 err = bus->write_c45(bus, addr, devad, regnum, val); in __mdiobus_c45_write()
977 err = -EOPNOTSUPP; in __mdiobus_c45_write()
979 trace_mdio_access(bus, 0, addr, regnum, val, err); in __mdiobus_c45_write()
980 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_c45_write()
987 * __mdiobus_c45_modify_changed - Unlocked version of the mdiobus_modify function
988 * @bus: the mii_bus struct
989 * @addr: the phy address
1000 static int __mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, in __mdiobus_c45_modify_changed() argument
1006 ret = __mdiobus_c45_read(bus, addr, devad, regnum); in __mdiobus_c45_modify_changed()
1014 ret = __mdiobus_c45_write(bus, addr, devad, regnum, new); in __mdiobus_c45_modify_changed()
1020 * mdiobus_read_nested - Nested version of the mdiobus_read function
1021 * @bus: the mii_bus struct
1022 * @addr: the phy address
1025 * In case of nested MDIO bus access avoid lockdep false positives by
1029 * because the bus read/write functions may wait for an interrupt
1032 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read_nested() argument
1036 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_read_nested()
1037 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read_nested()
1038 mutex_unlock(&bus->mdio_lock); in mdiobus_read_nested()
1045 * mdiobus_read - Convenience function for reading a given MII mgmt register
1046 * @bus: the mii_bus struct
1047 * @addr: the phy address
1051 * because the bus read/write functions may wait for an interrupt
1054 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read() argument
1058 mutex_lock(&bus->mdio_lock); in mdiobus_read()
1059 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read()
1060 mutex_unlock(&bus->mdio_lock); in mdiobus_read()
1067 * mdiobus_c45_read - Convenience function for reading a given MII mgmt register
1068 * @bus: the mii_bus struct
1069 * @addr: the phy address
1074 * because the bus read/write functions may wait for an interrupt
1077 int mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) in mdiobus_c45_read() argument
1081 mutex_lock(&bus->mdio_lock); in mdiobus_c45_read()
1082 retval = __mdiobus_c45_read(bus, addr, devad, regnum); in mdiobus_c45_read()
1083 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_read()
1090 * mdiobus_c45_read_nested - Nested version of the mdiobus_c45_read function
1091 * @bus: the mii_bus struct
1092 * @addr: the phy address
1096 * In case of nested MDIO bus access avoid lockdep false positives by
1100 * because the bus read/write functions may wait for an interrupt
1103 int mdiobus_c45_read_nested(struct mii_bus *bus, int addr, int devad, in mdiobus_c45_read_nested() argument
1108 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_c45_read_nested()
1109 retval = __mdiobus_c45_read(bus, addr, devad, regnum); in mdiobus_c45_read_nested()
1110 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_read_nested()
1117 * mdiobus_write_nested - Nested version of the mdiobus_write function
1118 * @bus: the mii_bus struct
1119 * @addr: the phy address
1123 * In case of nested MDIO bus access avoid lockdep false positives by
1127 * because the bus read/write functions may wait for an interrupt
1130 int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write_nested() argument
1134 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_write_nested()
1135 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write_nested()
1136 mutex_unlock(&bus->mdio_lock); in mdiobus_write_nested()
1143 * mdiobus_write - Convenience function for writing a given MII mgmt register
1144 * @bus: the mii_bus struct
1145 * @addr: the phy address
1150 * because the bus read/write functions may wait for an interrupt
1153 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write() argument
1157 mutex_lock(&bus->mdio_lock); in mdiobus_write()
1158 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write()
1159 mutex_unlock(&bus->mdio_lock); in mdiobus_write()
1166 * mdiobus_c45_write - Convenience function for writing a given MII mgmt register
1167 * @bus: the mii_bus struct
1168 * @addr: the phy address
1174 * because the bus read/write functions may wait for an interrupt
1177 int mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, in mdiobus_c45_write() argument
1182 mutex_lock(&bus->mdio_lock); in mdiobus_c45_write()
1183 err = __mdiobus_c45_write(bus, addr, devad, regnum, val); in mdiobus_c45_write()
1184 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_write()
1191 * mdiobus_c45_write_nested - Nested version of the mdiobus_c45_write function
1192 * @bus: the mii_bus struct
1193 * @addr: the phy address
1198 * In case of nested MDIO bus access avoid lockdep false positives by
1202 * because the bus read/write functions may wait for an interrupt
1205 int mdiobus_c45_write_nested(struct mii_bus *bus, int addr, int devad, in mdiobus_c45_write_nested() argument
1210 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_c45_write_nested()
1211 err = __mdiobus_c45_write(bus, addr, devad, regnum, val); in mdiobus_c45_write_nested()
1212 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_write_nested()
1219 * __mdiobus_modify - Convenience function for modifying a given mdio device
1221 * @bus: the mii_bus struct
1222 * @addr: the phy address
1227 int __mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, in __mdiobus_modify() argument
1232 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in __mdiobus_modify()
1239 * mdiobus_modify - Convenience function for modifying a given mdio device
1241 * @bus: the mii_bus struct
1242 * @addr: the phy address
1247 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set) in mdiobus_modify() argument
1251 mutex_lock(&bus->mdio_lock); in mdiobus_modify()
1252 err = __mdiobus_modify(bus, addr, regnum, mask, set); in mdiobus_modify()
1253 mutex_unlock(&bus->mdio_lock); in mdiobus_modify()
1260 * mdiobus_c45_modify - Convenience function for modifying a given mdio device
1262 * @bus: the mii_bus struct
1263 * @addr: the phy address
1269 int mdiobus_c45_modify(struct mii_bus *bus, int addr, int devad, u32 regnum, in mdiobus_c45_modify() argument
1274 mutex_lock(&bus->mdio_lock); in mdiobus_c45_modify()
1275 err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, in mdiobus_c45_modify()
1277 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_modify()
1284 * mdiobus_modify_changed - Convenience function for modifying a given mdio
1286 * @bus: the mii_bus struct
1287 * @addr: the phy address
1292 int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, in mdiobus_modify_changed() argument
1297 mutex_lock(&bus->mdio_lock); in mdiobus_modify_changed()
1298 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in mdiobus_modify_changed()
1299 mutex_unlock(&bus->mdio_lock); in mdiobus_modify_changed()
1306 * mdiobus_c45_modify_changed - Convenience function for modifying a given mdio
1308 * @bus: the mii_bus struct
1309 * @addr: the phy address
1315 int mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, int devad, in mdiobus_c45_modify_changed() argument
1320 mutex_lock(&bus->mdio_lock); in mdiobus_c45_modify_changed()
1321 err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, mask, set); in mdiobus_c45_modify_changed()
1322 mutex_unlock(&bus->mdio_lock); in mdiobus_c45_modify_changed()
1329 * mdio_bus_match - determine if given MDIO driver supports the given
1344 /* Both the driver and device must type-match */ in mdio_bus_match()
1345 if (!(mdiodrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY) != in mdio_bus_match()
1346 !(mdio->flags & MDIO_DEVICE_FLAG_PHY)) in mdio_bus_match()
1352 if (mdio->bus_match) in mdio_bus_match()
1353 return mdio->bus_match(dev, drv); in mdio_bus_match()
1362 /* Some devices have extra OF data and an OF-style MODALIAS */ in mdio_uevent()
1364 if (rc != -ENODEV) in mdio_uevent()
1421 MODULE_DESCRIPTION("MDIO bus/device layer");