Lines Matching +full:device +full:- +full:addr

1 // SPDX-License-Identifier: GPL-2.0+
12 #include <linux/device.h>
41 #include "mdio-boardinfo.h"
46 mdiodev->reset_gpio = gpiod_get_optional(&mdiodev->dev, in mdiobus_register_gpiod()
48 if (IS_ERR(mdiodev->reset_gpio)) in mdiobus_register_gpiod()
49 return PTR_ERR(mdiodev->reset_gpio); in mdiobus_register_gpiod()
51 if (mdiodev->reset_gpio) in mdiobus_register_gpiod()
52 gpiod_set_consumer_name(mdiodev->reset_gpio, "PHY reset"); in mdiobus_register_gpiod()
61 reset = reset_control_get_optional_exclusive(&mdiodev->dev, "phy"); in mdiobus_register_reset()
65 mdiodev->reset_ctrl = reset; in mdiobus_register_reset()
74 if (mdiodev->bus->mdio_map[mdiodev->addr]) in mdiobus_register_device()
75 return -EBUSY; in mdiobus_register_device()
77 if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) { in mdiobus_register_device()
90 mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev; in mdiobus_register_device()
98 if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev) in mdiobus_unregister_device()
99 return -EINVAL; in mdiobus_unregister_device()
101 reset_control_put(mdiodev->reset_ctrl); in mdiobus_unregister_device()
103 mdiodev->bus->mdio_map[mdiodev->addr] = NULL; in mdiobus_unregister_device()
109 struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr) in mdiobus_get_phy() argument
111 struct mdio_device *mdiodev = bus->mdio_map[addr]; in mdiobus_get_phy()
116 if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY)) in mdiobus_get_phy()
123 bool mdiobus_is_registered_device(struct mii_bus *bus, int addr) in mdiobus_is_registered_device() argument
125 return bus->mdio_map[addr]; in mdiobus_is_registered_device()
130 * mdiobus_alloc_size - allocate a mii_bus structure
132 * If non-zero, then bus->priv is points to that memory.
154 bus->state = MDIOBUS_ALLOCATED; in mdiobus_alloc_size()
156 bus->priv = (void *)bus + aligned_size; in mdiobus_alloc_size()
158 /* Initialise the interrupts to polling and 64-bit seqcounts */ in mdiobus_alloc_size()
160 bus->irq[i] = PHY_POLL; in mdiobus_alloc_size()
161 u64_stats_init(&bus->stats[i].syncp); in mdiobus_alloc_size()
169 * mdiobus_release - mii_bus device release callback
170 * @d: the target struct device that contains the mii_bus
175 static void mdiobus_release(struct device *d) in mdiobus_release()
179 BUG_ON(bus->state != MDIOBUS_RELEASED && in mdiobus_release()
181 bus->state != MDIOBUS_ALLOCATED); in mdiobus_release()
186 int addr; member
197 start = u64_stats_fetch_begin(&s->syncp); in mdio_bus_get_stat()
199 } while (u64_stats_fetch_retry(&s->syncp, start)); in mdio_bus_get_stat()
210 val += mdio_bus_get_stat(&bus->stats[i], offset); in mdio_bus_get_global_stat()
215 static ssize_t mdio_bus_stat_field_show(struct device *dev, in mdio_bus_stat_field_show()
225 sattr = eattr->var; in mdio_bus_stat_field_show()
227 if (sattr->addr < 0) in mdio_bus_stat_field_show()
228 val = mdio_bus_get_global_stat(bus, sattr->field_offset); in mdio_bus_stat_field_show()
230 val = mdio_bus_get_stat(&bus->stats[sattr->addr], in mdio_bus_stat_field_show()
231 sattr->field_offset); in mdio_bus_stat_field_show()
236 static ssize_t mdio_bus_device_stat_field_show(struct device *dev, in mdio_bus_device_stat_field_show()
241 struct mii_bus *bus = mdiodev->bus; in mdio_bus_device_stat_field_show()
244 int addr = mdiodev->addr; in mdio_bus_device_stat_field_show() local
248 sattr = eattr->var; in mdio_bus_device_stat_field_show()
250 val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset); in mdio_bus_device_stat_field_show()
261 -1, offsetof(struct mdio_bus_stats, field) \
269 -1, offsetof(struct mdio_bus_stats, field) \
281 #define MDIO_BUS_STATS_ADDR_ATTR_DECL(field, addr, file) \ argument
282 static struct dev_ext_attribute dev_attr_mdio_bus_addr_##field##_##addr = { \
287 addr, offsetof(struct mdio_bus_stats, field) \
291 #define MDIO_BUS_STATS_ADDR_ATTR(field, addr) \ argument
292 MDIO_BUS_STATS_ADDR_ATTR_DECL(field, addr, \
293 __stringify(field) "_" __stringify(addr))
295 #define MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(addr) \ argument
296 MDIO_BUS_STATS_ADDR_ATTR(transfers, addr); \
297 MDIO_BUS_STATS_ADDR_ATTR(errors, addr); \
298 MDIO_BUS_STATS_ADDR_ATTR(writes, addr); \
299 MDIO_BUS_STATS_ADDR_ATTR(reads, addr) \
334 #define MDIO_BUS_STATS_ADDR_ATTR_GROUP(addr) \ argument
335 &dev_attr_mdio_bus_addr_transfers_##addr.attr.attr, \
336 &dev_attr_mdio_bus_addr_errors_##addr.attr.attr, \
337 &dev_attr_mdio_bus_addr_writes_##addr.attr.attr, \
338 &dev_attr_mdio_bus_addr_reads_##addr.attr.attr \
397 * mdio_find_bus - Given the name of a mdiobus, find the mii_bus.
401 * embedded struct device will have its reference count incremented,
406 struct device *d; in mdio_find_bus()
415 * of_mdio_find_bus - Given an mii_bus node, find the mii_bus.
419 * embedded struct device will have its reference count incremented,
429 struct device *d; in of_mdio_find_bus()
440 * matches the mdio device's address with its 'reg' property. If
441 * found, set the of_node pointer for the mdio device. This allows
442 * auto-probed phy devices to be supplied with information passed in
448 struct device *dev = &mdiodev->dev; in of_mdiobus_link_mdiodev()
451 if (dev->of_node || !bus->dev.of_node) in of_mdiobus_link_mdiodev()
454 for_each_available_child_of_node(bus->dev.of_node, child) { in of_mdiobus_link_mdiodev()
455 int addr; in of_mdiobus_link_mdiodev() local
457 addr = of_mdio_parse_addr(dev, child); in of_mdiobus_link_mdiodev()
458 if (addr < 0) in of_mdiobus_link_mdiodev()
461 if (addr == mdiodev->addr) { in of_mdiobus_link_mdiodev()
475 * mdiobus_create_device - create a full MDIO device given
488 mdiodev = mdio_device_create(bus, bi->mdio_addr); in mdiobus_create_device()
490 return -ENODEV; in mdiobus_create_device()
492 strncpy(mdiodev->modalias, bi->modalias, in mdiobus_create_device()
493 sizeof(mdiodev->modalias)); in mdiobus_create_device()
494 mdiodev->bus_match = mdio_device_bus_match; in mdiobus_create_device()
495 mdiodev->dev.platform_data = (void *)bi->platform_data; in mdiobus_create_device()
505 * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus
524 if (NULL == bus || NULL == bus->name || in __mdiobus_register()
525 NULL == bus->read || NULL == bus->write) in __mdiobus_register()
526 return -EINVAL; in __mdiobus_register()
528 if (bus->parent && bus->parent->of_node) in __mdiobus_register()
529 bus->parent->of_node->fwnode.flags |= in __mdiobus_register()
532 BUG_ON(bus->state != MDIOBUS_ALLOCATED && in __mdiobus_register()
533 bus->state != MDIOBUS_UNREGISTERED); in __mdiobus_register()
535 bus->owner = owner; in __mdiobus_register()
536 bus->dev.parent = bus->parent; in __mdiobus_register()
537 bus->dev.class = &mdio_bus_class; in __mdiobus_register()
538 bus->dev.groups = NULL; in __mdiobus_register()
539 dev_set_name(&bus->dev, "%s", bus->id); in __mdiobus_register()
542 * the device in mdiobus_free() in __mdiobus_register()
546 bus->state = MDIOBUS_UNREGISTERED; in __mdiobus_register()
548 err = device_register(&bus->dev); in __mdiobus_register()
550 pr_err("mii_bus %s failed to register\n", bus->id); in __mdiobus_register()
551 return -EINVAL; in __mdiobus_register()
554 mutex_init(&bus->mdio_lock); in __mdiobus_register()
555 mutex_init(&bus->shared_lock); in __mdiobus_register()
558 gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_HIGH); in __mdiobus_register()
560 err = dev_err_probe(&bus->dev, PTR_ERR(gpiod), in __mdiobus_register()
562 bus->id); in __mdiobus_register()
563 device_del(&bus->dev); in __mdiobus_register()
566 bus->reset_gpiod = gpiod; in __mdiobus_register()
567 fsleep(bus->reset_delay_us); in __mdiobus_register()
569 if (bus->reset_post_delay_us > 0) in __mdiobus_register()
570 fsleep(bus->reset_post_delay_us); in __mdiobus_register()
573 if (bus->reset) { in __mdiobus_register()
574 err = bus->reset(bus); in __mdiobus_register()
580 if ((bus->phy_mask & (1 << i)) == 0) { in __mdiobus_register()
584 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) { in __mdiobus_register()
593 bus->state = MDIOBUS_REGISTERED; in __mdiobus_register()
594 pr_info("%s: probed\n", bus->name); in __mdiobus_register()
598 while (--i >= 0) { in __mdiobus_register()
599 mdiodev = bus->mdio_map[i]; in __mdiobus_register()
603 mdiodev->device_remove(mdiodev); in __mdiobus_register()
604 mdiodev->device_free(mdiodev); in __mdiobus_register()
608 if (bus->reset_gpiod) in __mdiobus_register()
609 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in __mdiobus_register()
611 device_del(&bus->dev); in __mdiobus_register()
621 if (WARN_ON_ONCE(bus->state != MDIOBUS_REGISTERED)) in mdiobus_unregister()
623 bus->state = MDIOBUS_UNREGISTERED; in mdiobus_unregister()
626 mdiodev = bus->mdio_map[i]; in mdiobus_unregister()
630 if (mdiodev->reset_gpio) in mdiobus_unregister()
631 gpiod_put(mdiodev->reset_gpio); in mdiobus_unregister()
633 mdiodev->device_remove(mdiodev); in mdiobus_unregister()
634 mdiodev->device_free(mdiodev); in mdiobus_unregister()
638 if (bus->reset_gpiod) in mdiobus_unregister()
639 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in mdiobus_unregister()
641 device_del(&bus->dev); in mdiobus_unregister()
646 * mdiobus_free - free a struct mii_bus
649 * This function releases the reference to the underlying device
656 if (bus->state == MDIOBUS_ALLOCATED) { in mdiobus_free()
661 BUG_ON(bus->state != MDIOBUS_UNREGISTERED); in mdiobus_free()
662 bus->state = MDIOBUS_RELEASED; in mdiobus_free()
664 put_device(&bus->dev); in mdiobus_free()
669 * mdiobus_scan - scan a bus for MDIO devices.
671 * @addr: address on bus to scan
680 struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr) in mdiobus_scan() argument
682 struct phy_device *phydev = ERR_PTR(-ENODEV); in mdiobus_scan()
685 switch (bus->probe_capabilities) { in mdiobus_scan()
688 phydev = get_phy_device(bus, addr, false); in mdiobus_scan()
691 phydev = get_phy_device(bus, addr, true); in mdiobus_scan()
694 phydev = get_phy_device(bus, addr, false); in mdiobus_scan()
696 phydev = get_phy_device(bus, addr, true); in mdiobus_scan()
704 * For DT, see if the auto-probed phy has a correspoding child in mdiobus_scan()
707 of_mdiobus_link_mdiodev(bus, &phydev->mdio); in mdiobus_scan()
712 return ERR_PTR(-ENODEV); in mdiobus_scan()
722 u64_stats_update_begin(&stats->syncp); in mdiobus_stats_acct()
724 u64_stats_inc(&stats->transfers); in mdiobus_stats_acct()
726 u64_stats_inc(&stats->errors); in mdiobus_stats_acct()
731 u64_stats_inc(&stats->reads); in mdiobus_stats_acct()
733 u64_stats_inc(&stats->writes); in mdiobus_stats_acct()
735 u64_stats_update_end(&stats->syncp); in mdiobus_stats_acct()
740 * __mdiobus_read - Unlocked version of the mdiobus_read function
742 * @addr: the phy address
749 int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in __mdiobus_read() argument
753 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_read()
755 retval = bus->read(bus, addr, regnum); in __mdiobus_read()
757 trace_mdio_access(bus, 1, addr, regnum, retval, retval); in __mdiobus_read()
758 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_read()
765 * __mdiobus_write - Unlocked version of the mdiobus_write function
767 * @addr: the phy address
775 int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in __mdiobus_write() argument
779 lockdep_assert_held_once(&bus->mdio_lock); in __mdiobus_write()
781 err = bus->write(bus, addr, regnum, val); in __mdiobus_write()
783 trace_mdio_access(bus, 0, addr, regnum, val, err); in __mdiobus_write()
784 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_write()
791 * __mdiobus_modify_changed - Unlocked version of the mdiobus_modify function
793 * @addr: the phy address
799 * device. Any error returns a negative number.
803 int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, in __mdiobus_modify_changed() argument
808 ret = __mdiobus_read(bus, addr, regnum); in __mdiobus_modify_changed()
816 ret = __mdiobus_write(bus, addr, regnum, new); in __mdiobus_modify_changed()
823 * mdiobus_read_nested - Nested version of the mdiobus_read function
825 * @addr: the phy address
835 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read_nested() argument
839 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_read_nested()
840 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read_nested()
841 mutex_unlock(&bus->mdio_lock); in mdiobus_read_nested()
848 * mdiobus_read - Convenience function for reading a given MII mgmt register
850 * @addr: the phy address
857 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read() argument
861 mutex_lock(&bus->mdio_lock); in mdiobus_read()
862 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read()
863 mutex_unlock(&bus->mdio_lock); in mdiobus_read()
870 * mdiobus_write_nested - Nested version of the mdiobus_write function
872 * @addr: the phy address
883 int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write_nested() argument
887 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_write_nested()
888 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write_nested()
889 mutex_unlock(&bus->mdio_lock); in mdiobus_write_nested()
896 * mdiobus_write - Convenience function for writing a given MII mgmt register
898 * @addr: the phy address
906 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write() argument
910 mutex_lock(&bus->mdio_lock); in mdiobus_write()
911 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write()
912 mutex_unlock(&bus->mdio_lock); in mdiobus_write()
919 * mdiobus_modify - Convenience function for modifying a given mdio device
922 * @addr: the phy address
927 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set) in mdiobus_modify() argument
931 mutex_lock(&bus->mdio_lock); in mdiobus_modify()
932 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in mdiobus_modify()
933 mutex_unlock(&bus->mdio_lock); in mdiobus_modify()
940 * mdio_bus_match - determine if given MDIO driver supports the given
941 * MDIO device
942 * @dev: target MDIO device
945 * Description: Given a MDIO device, and a MDIO driver, return 1 if
946 * the driver supports the device. Otherwise, return 0. This may
950 static int mdio_bus_match(struct device *dev, struct device_driver *drv) in mdio_bus_match()
957 if (mdio->bus_match) in mdio_bus_match()
958 return mdio->bus_match(dev, drv); in mdio_bus_match()
963 static int mdio_uevent(struct device *dev, struct kobj_uevent_env *env) in mdio_uevent()
967 /* Some devices have extra OF data and an OF-style MODALIAS */ in mdio_uevent()
969 if (rc != -ENODEV) in mdio_uevent()
1027 MODULE_DESCRIPTION("MDIO bus/device layer");