• Home
  • Raw
  • Download

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

1 // SPDX-License-Identifier: GPL-2.0+
2 /* MDIO Bus interface
39 #include <trace/events/mdio.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
113 if (addr < 0 || addr >= ARRAY_SIZE(bus->mdio_map)) in mdiobus_get_phy()
116 mdiodev = bus->mdio_map[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 bus->mdio_map[addr]; in mdiobus_is_registered_device()
135 * mdiobus_alloc_size - allocate a mii_bus structure
137 * If non-zero, then bus->priv is points to that memory.
139 * Description: called by a bus driver to allocate an mii_bus
144 struct mii_bus *bus; in mdiobus_alloc_size() local
145 size_t aligned_size = ALIGN(sizeof(*bus), NETDEV_ALIGN); in mdiobus_alloc_size()
153 alloc_size = sizeof(*bus); in mdiobus_alloc_size()
155 bus = kzalloc(alloc_size, GFP_KERNEL); in mdiobus_alloc_size()
156 if (!bus) in mdiobus_alloc_size()
159 bus->state = MDIOBUS_ALLOCATED; in mdiobus_alloc_size()
161 bus->priv = (void *)bus + aligned_size; in mdiobus_alloc_size()
163 /* Initialise the interrupts to polling and 64-bit seqcounts */ in mdiobus_alloc_size()
165 bus->irq[i] = PHY_POLL; in mdiobus_alloc_size()
166 u64_stats_init(&bus->stats[i].syncp); in mdiobus_alloc_size()
169 return bus; in mdiobus_alloc_size()
174 * mdiobus_release - mii_bus device release callback
182 struct mii_bus *bus = to_mii_bus(d); in mdiobus_release() local
183 BUG_ON(bus->state != MDIOBUS_RELEASED && in mdiobus_release()
185 bus->state != MDIOBUS_ALLOCATED); in mdiobus_release()
186 kfree(bus); in mdiobus_release()
201 start = u64_stats_fetch_begin(&s->syncp); in mdio_bus_get_stat()
203 } while (u64_stats_fetch_retry(&s->syncp, start)); in mdio_bus_get_stat()
208 static u64 mdio_bus_get_global_stat(struct mii_bus *bus, unsigned int offset) in mdio_bus_get_global_stat() argument
214 val += mdio_bus_get_stat(&bus->stats[i], offset); in mdio_bus_get_global_stat()
223 struct mii_bus *bus = to_mii_bus(dev); in mdio_bus_stat_field_show() local
229 sattr = eattr->var; in mdio_bus_stat_field_show()
231 if (sattr->addr < 0) in mdio_bus_stat_field_show()
232 val = mdio_bus_get_global_stat(bus, sattr->field_offset); in mdio_bus_stat_field_show()
234 val = mdio_bus_get_stat(&bus->stats[sattr->addr], in mdio_bus_stat_field_show()
235 sattr->field_offset); in mdio_bus_stat_field_show()
245 struct mii_bus *bus = mdiodev->bus; in mdio_bus_device_stat_field_show() local
248 int addr = mdiodev->addr; in mdio_bus_device_stat_field_show()
252 sattr = eattr->var; in mdio_bus_device_stat_field_show()
254 val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset); in mdio_bus_device_stat_field_show()
265 -1, offsetof(struct mdio_bus_stats, field) \
273 -1, offsetof(struct mdio_bus_stats, field) \
401 * mdio_find_bus - Given the name of a mdiobus, find the mii_bus.
406 * and this must be put_deviced'ed once the bus is finished with.
419 * of_mdio_find_bus - Given an mii_bus node, find the mii_bus.
424 * and this must be put once the bus is finished with.
443 /* Walk the list of subnodes of a mdio bus and look for a node that
444 * matches the mdio device's address with its 'reg' property. If
445 * found, set the of_node pointer for the mdio device. This allows
446 * auto-probed phy devices to be supplied with information passed in
449 static void of_mdiobus_link_mdiodev(struct mii_bus *bus, in of_mdiobus_link_mdiodev() argument
452 struct device *dev = &mdiodev->dev; in of_mdiobus_link_mdiodev()
455 if (dev->of_node || !bus->dev.of_node) in of_mdiobus_link_mdiodev()
458 for_each_available_child_of_node(bus->dev.of_node, child) { in of_mdiobus_link_mdiodev()
465 if (addr == mdiodev->addr) { in of_mdiobus_link_mdiodev()
472 static inline void of_mdiobus_link_mdiodev(struct mii_bus *mdio, in of_mdiobus_link_mdiodev() argument
479 * mdiobus_create_device_from_board_info - create a full MDIO device given
481 * @bus: MDIO bus to create the devices on
486 static int mdiobus_create_device(struct mii_bus *bus, in mdiobus_create_device() argument
492 mdiodev = mdio_device_create(bus, bi->mdio_addr); in mdiobus_create_device()
494 return -ENODEV; in mdiobus_create_device()
496 strncpy(mdiodev->modalias, bi->modalias, in mdiobus_create_device()
497 sizeof(mdiodev->modalias)); in mdiobus_create_device()
498 mdiodev->bus_match = mdio_device_bus_match; in mdiobus_create_device()
499 mdiodev->dev.platform_data = (void *)bi->platform_data; in mdiobus_create_device()
509 * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus
510 * @bus: target mii_bus
511 * @owner: module containing bus accessor functions
513 * Description: Called by a bus driver to bring up all the PHYs
514 * on a given bus, and attach them to the bus. Drivers should use
516 * need to pass a specific owner module. MDIO devices which are not
522 int __mdiobus_register(struct mii_bus *bus, struct module *owner) in __mdiobus_register() argument
528 if (NULL == bus || NULL == bus->name || in __mdiobus_register()
529 NULL == bus->read || NULL == bus->write) in __mdiobus_register()
530 return -EINVAL; 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()
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()
557 /* de-assert bus level PHY GPIO reset */ in __mdiobus_register()
558 gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_LOW); in __mdiobus_register()
560 dev_err(&bus->dev, "mii_bus %s couldn't get reset GPIO\n", in __mdiobus_register()
561 bus->id); in __mdiobus_register()
562 device_del(&bus->dev); in __mdiobus_register()
565 bus->reset_gpiod = gpiod; in __mdiobus_register()
568 fsleep(bus->reset_delay_us); in __mdiobus_register()
570 if (bus->reset_post_delay_us > 0) in __mdiobus_register()
571 fsleep(bus->reset_post_delay_us); in __mdiobus_register()
574 if (bus->reset) { in __mdiobus_register()
575 err = bus->reset(bus); in __mdiobus_register()
581 if ((bus->phy_mask & BIT(i)) == 0) { in __mdiobus_register()
584 phydev = mdiobus_scan(bus, i); in __mdiobus_register()
585 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) { in __mdiobus_register()
592 mdiobus_setup_mdiodev_from_board_info(bus, mdiobus_create_device); in __mdiobus_register()
594 bus->state = MDIOBUS_REGISTERED; in __mdiobus_register()
595 dev_dbg(&bus->dev, "probed\n"); in __mdiobus_register()
599 while (--i >= 0) { in __mdiobus_register()
600 mdiodev = bus->mdio_map[i]; in __mdiobus_register()
604 mdiodev->device_remove(mdiodev); in __mdiobus_register()
605 mdiodev->device_free(mdiodev); in __mdiobus_register()
609 if (bus->reset_gpiod) in __mdiobus_register()
610 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in __mdiobus_register()
612 device_del(&bus->dev); in __mdiobus_register()
617 void mdiobus_unregister(struct mii_bus *bus) in mdiobus_unregister() argument
622 if (WARN_ON_ONCE(bus->state != MDIOBUS_REGISTERED)) in mdiobus_unregister()
624 bus->state = MDIOBUS_UNREGISTERED; in mdiobus_unregister()
627 mdiodev = bus->mdio_map[i]; in mdiobus_unregister()
631 if (mdiodev->reset_gpio) in mdiobus_unregister()
632 gpiod_put(mdiodev->reset_gpio); in mdiobus_unregister()
634 mdiodev->device_remove(mdiodev); in mdiobus_unregister()
635 mdiodev->device_free(mdiodev); in mdiobus_unregister()
639 if (bus->reset_gpiod) in mdiobus_unregister()
640 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in mdiobus_unregister()
642 device_del(&bus->dev); in mdiobus_unregister()
647 * mdiobus_free - free a struct mii_bus
648 * @bus: mii_bus to free
654 void mdiobus_free(struct mii_bus *bus) in mdiobus_free() argument
657 if (bus->state == MDIOBUS_ALLOCATED) { in mdiobus_free()
658 kfree(bus); in mdiobus_free()
662 BUG_ON(bus->state != MDIOBUS_UNREGISTERED); in mdiobus_free()
663 bus->state = MDIOBUS_RELEASED; in mdiobus_free()
665 put_device(&bus->dev); in mdiobus_free()
670 * mdiobus_scan - scan a bus for MDIO devices.
671 * @bus: mii_bus to scan
672 * @addr: address on bus to scan
674 * This function scans the MDIO bus, looking for devices which can be
676 * MDIO devices have such registers, but PHY devices typically
678 * treated as a PHY. Other MDIO devices, such as switches, will
681 struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr) in mdiobus_scan() argument
683 struct phy_device *phydev = ERR_PTR(-ENODEV); in mdiobus_scan()
686 switch (bus->probe_capabilities) { in mdiobus_scan()
689 phydev = get_phy_device(bus, addr, false); in mdiobus_scan()
692 phydev = get_phy_device(bus, addr, true); in mdiobus_scan()
695 phydev = get_phy_device(bus, addr, false); in mdiobus_scan()
697 phydev = get_phy_device(bus, addr, true); in mdiobus_scan()
705 * For DT, see if the auto-probed phy has a correspoding child in mdiobus_scan()
706 * in the bus node, and set the of_node pointer in this case. in mdiobus_scan()
708 of_mdiobus_link_mdiodev(bus, &phydev->mdio); in mdiobus_scan()
713 return ERR_PTR(-ENODEV); in mdiobus_scan()
723 u64_stats_update_begin(&stats->syncp); in mdiobus_stats_acct()
725 u64_stats_inc(&stats->transfers); in mdiobus_stats_acct()
727 u64_stats_inc(&stats->errors); in mdiobus_stats_acct()
732 u64_stats_inc(&stats->reads); in mdiobus_stats_acct()
734 u64_stats_inc(&stats->writes); in mdiobus_stats_acct()
736 u64_stats_update_end(&stats->syncp); in mdiobus_stats_acct()
741 * __mdiobus_read - Unlocked version of the mdiobus_read function
742 * @bus: the mii_bus struct
746 * Read a MDIO bus register. Caller must hold the mdio bus lock.
750 int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in __mdiobus_read() argument
754 WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock)); in __mdiobus_read()
757 return -ENXIO; in __mdiobus_read()
759 if (bus->read) in __mdiobus_read()
760 retval = bus->read(bus, addr, regnum); in __mdiobus_read()
762 retval = -EOPNOTSUPP; in __mdiobus_read()
764 trace_mdio_access(bus, 1, addr, regnum, retval, retval); in __mdiobus_read()
765 mdiobus_stats_acct(&bus->stats[addr], true, retval); in __mdiobus_read()
772 * __mdiobus_write - Unlocked version of the mdiobus_write function
773 * @bus: the mii_bus struct
778 * Write a MDIO bus register. Caller must hold the mdio bus lock.
782 int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in __mdiobus_write() argument
786 WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock)); in __mdiobus_write()
789 return -ENXIO; in __mdiobus_write()
791 if (bus->write) in __mdiobus_write()
792 err = bus->write(bus, addr, regnum, val); in __mdiobus_write()
794 err = -EOPNOTSUPP; in __mdiobus_write()
796 trace_mdio_access(bus, 0, addr, regnum, val, err); in __mdiobus_write()
797 mdiobus_stats_acct(&bus->stats[addr], false, err); in __mdiobus_write()
804 * __mdiobus_modify_changed - Unlocked version of the mdiobus_modify function
805 * @bus: the mii_bus struct
816 int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, in __mdiobus_modify_changed() argument
821 ret = __mdiobus_read(bus, addr, regnum); in __mdiobus_modify_changed()
829 ret = __mdiobus_write(bus, addr, regnum, new); in __mdiobus_modify_changed()
836 * mdiobus_read_nested - Nested version of the mdiobus_read function
837 * @bus: the mii_bus struct
841 * In case of nested MDIO bus access avoid lockdep false positives by
845 * because the bus read/write functions may wait for an interrupt
848 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read_nested() argument
852 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_read_nested()
853 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read_nested()
854 mutex_unlock(&bus->mdio_lock); in mdiobus_read_nested()
861 * mdiobus_read - Convenience function for reading a given MII mgmt register
862 * @bus: the mii_bus struct
867 * because the bus read/write functions may wait for an interrupt
870 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) in mdiobus_read() argument
874 mutex_lock(&bus->mdio_lock); in mdiobus_read()
875 retval = __mdiobus_read(bus, addr, regnum); in mdiobus_read()
876 mutex_unlock(&bus->mdio_lock); in mdiobus_read()
883 * mdiobus_write_nested - Nested version of the mdiobus_write function
884 * @bus: the mii_bus struct
889 * In case of nested MDIO bus access avoid lockdep false positives by
893 * because the bus read/write functions may wait for an interrupt
896 int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write_nested() argument
900 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); in mdiobus_write_nested()
901 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write_nested()
902 mutex_unlock(&bus->mdio_lock); in mdiobus_write_nested()
909 * mdiobus_write - Convenience function for writing a given MII mgmt register
910 * @bus: the mii_bus struct
916 * because the bus read/write functions may wait for an interrupt
919 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) in mdiobus_write() argument
923 mutex_lock(&bus->mdio_lock); in mdiobus_write()
924 err = __mdiobus_write(bus, addr, regnum, val); in mdiobus_write()
925 mutex_unlock(&bus->mdio_lock); in mdiobus_write()
932 * mdiobus_modify - Convenience function for modifying a given mdio device
934 * @bus: the mii_bus struct
940 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set) in mdiobus_modify() argument
944 mutex_lock(&bus->mdio_lock); in mdiobus_modify()
945 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); in mdiobus_modify()
946 mutex_unlock(&bus->mdio_lock); in mdiobus_modify()
953 * mdio_bus_match - determine if given MDIO driver supports the given
954 * MDIO device
955 * @dev: target MDIO device
956 * @drv: given MDIO driver
958 * Description: Given a MDIO device, and a MDIO driver, return 1 if
961 * of MDIO devices have different match criteria.
965 struct mdio_device *mdio = to_mdio_device(dev); in mdio_bus_match() local
970 if (mdio->bus_match) in mdio_bus_match()
971 return mdio->bus_match(dev, drv); in mdio_bus_match()
980 /* Some devices have extra OF data and an OF-style MODALIAS */ in mdio_uevent()
982 if (rc != -ENODEV) in mdio_uevent()
1039 MODULE_DESCRIPTION("MDIO bus/device layer");