Lines Matching full:bus

2 /* MDIO Bus provider interface
37 * If non-zero, then bus->priv is points to that memory.
39 * Description: called by a bus driver to allocate an mii_bus
44 struct mii_bus *bus; in mdiobus_alloc_size() local
45 size_t aligned_size = ALIGN(sizeof(*bus), NETDEV_ALIGN); in mdiobus_alloc_size()
53 alloc_size = sizeof(*bus); in mdiobus_alloc_size()
55 bus = kzalloc(alloc_size, GFP_KERNEL); in mdiobus_alloc_size()
56 if (!bus) in mdiobus_alloc_size()
59 bus->state = MDIOBUS_ALLOCATED; in mdiobus_alloc_size()
61 bus->priv = (void *)bus + aligned_size; in mdiobus_alloc_size()
65 bus->irq[i] = PHY_POLL; in mdiobus_alloc_size()
66 u64_stats_init(&bus->stats[i].syncp); in mdiobus_alloc_size()
69 return bus; in mdiobus_alloc_size()
74 /* Walk the list of subnodes of a mdio bus and look for a node that
123 static void of_mdiobus_link_mdiodev(struct mii_bus *bus, in of_mdiobus_link_mdiodev() argument
128 if (dev->of_node || !bus->dev.of_node) in of_mdiobus_link_mdiodev()
131 of_mdiobus_find_phy(dev, mdiodev, bus->dev.of_node); in of_mdiobus_link_mdiodev()
138 * @bus: MDIO bus to create the devices on
143 static int mdiobus_create_device(struct mii_bus *bus, in mdiobus_create_device() argument
149 mdiodev = mdio_device_create(bus, bi->mdio_addr); in mdiobus_create_device()
164 static struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr, bool c45) in mdiobus_scan() argument
171 phydev = get_phy_device(bus, addr, c45); in mdiobus_scan()
177 * in the bus node, and set the of_node pointer in this case. in mdiobus_scan()
179 of_mdiobus_link_mdiodev(bus, &phydev->mdio); in mdiobus_scan()
182 /* Search for a swnode for the phy in the swnode hierarchy of the bus. in mdiobus_scan()
185 if (dev_fwnode(&bus->dev) && !dev_fwnode(&phydev->mdio.dev)) { in mdiobus_scan()
188 fwnode = fwnode_get_named_child_node(dev_fwnode(&bus->dev), in mdiobus_scan()
204 * mdiobus_scan_c22 - scan one address on a bus for C22 MDIO devices.
205 * @bus: mii_bus to scan
206 * @addr: address on bus to scan
208 * This function scans one address on the MDIO bus, looking for
215 struct phy_device *mdiobus_scan_c22(struct mii_bus *bus, int addr) in mdiobus_scan_c22() argument
217 return mdiobus_scan(bus, addr, false); in mdiobus_scan_c22()
222 * mdiobus_scan_c45 - scan one address on a bus for C45 MDIO devices.
223 * @bus: mii_bus to scan
224 * @addr: address on bus to scan
226 * This function scans one address on the MDIO bus, looking for
233 static struct phy_device *mdiobus_scan_c45(struct mii_bus *bus, int addr) in mdiobus_scan_c45() argument
235 return mdiobus_scan(bus, addr, true); in mdiobus_scan_c45()
238 static int mdiobus_scan_bus_c22(struct mii_bus *bus) in mdiobus_scan_bus_c22() argument
243 if ((bus->phy_mask & BIT(i)) == 0) { in mdiobus_scan_bus_c22()
246 phydev = mdiobus_scan_c22(bus, i); in mdiobus_scan_bus_c22()
254 static int mdiobus_scan_bus_c45(struct mii_bus *bus) in mdiobus_scan_bus_c45() argument
259 if ((bus->phy_mask & BIT(i)) == 0) { in mdiobus_scan_bus_c45()
263 if (bus->mdio_map[i]) in mdiobus_scan_bus_c45()
266 phydev = mdiobus_scan_c45(bus, i); in mdiobus_scan_bus_c45()
275 * transaction on the bus, like accepting a read themselves, and
281 static bool mdiobus_prevent_c45_scan(struct mii_bus *bus) in mdiobus_prevent_c45_scan() argument
289 phydev = mdiobus_get_phy(bus, i); in mdiobus_prevent_c45_scan()
301 * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus
302 * @bus: target mii_bus
303 * @owner: module containing bus accessor functions
305 * Description: Called by a bus driver to bring up all the PHYs
306 * on a given bus, and attach them to the bus. Drivers should use
314 int __mdiobus_register(struct mii_bus *bus, struct module *owner) in __mdiobus_register() argument
321 if (!bus || !bus->name) in __mdiobus_register()
325 if (!!bus->read != !!bus->write || !!bus->read_c45 != !!bus->write_c45) in __mdiobus_register()
329 if (!bus->read && !bus->read_c45) in __mdiobus_register()
332 if (bus->parent && bus->parent->of_node) in __mdiobus_register()
333 bus->parent->of_node->fwnode.flags |= in __mdiobus_register()
336 WARN(bus->state != MDIOBUS_ALLOCATED && in __mdiobus_register()
337 bus->state != MDIOBUS_UNREGISTERED, in __mdiobus_register()
338 "%s: not in ALLOCATED or UNREGISTERED state\n", bus->id); in __mdiobus_register()
340 bus->owner = owner; in __mdiobus_register()
341 bus->dev.parent = bus->parent; in __mdiobus_register()
342 bus->dev.class = &mdio_bus_class; in __mdiobus_register()
343 bus->dev.groups = NULL; in __mdiobus_register()
344 dev_set_name(&bus->dev, "%s", bus->id); in __mdiobus_register()
346 /* If the bus state is allocated, we're registering a fresh bus in __mdiobus_register()
348 * to the fwnode. This will be dropped when the bus is released. in __mdiobus_register()
349 * If the bus was set to unregistered, it means that the bus was in __mdiobus_register()
352 if (bus->state == MDIOBUS_ALLOCATED) in __mdiobus_register()
353 fwnode_handle_get(dev_fwnode(&bus->dev)); in __mdiobus_register()
360 bus->state = MDIOBUS_UNREGISTERED; in __mdiobus_register()
362 err = device_register(&bus->dev); in __mdiobus_register()
364 pr_err("mii_bus %s failed to register\n", bus->id); in __mdiobus_register()
368 mutex_init(&bus->mdio_lock); in __mdiobus_register()
369 mutex_init(&bus->shared_lock); in __mdiobus_register()
371 /* assert bus level PHY GPIO reset */ in __mdiobus_register()
372 gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_HIGH); in __mdiobus_register()
374 err = dev_err_probe(&bus->dev, PTR_ERR(gpiod), in __mdiobus_register()
376 bus->id); in __mdiobus_register()
377 device_del(&bus->dev); in __mdiobus_register()
380 bus->reset_gpiod = gpiod; in __mdiobus_register()
381 fsleep(bus->reset_delay_us); in __mdiobus_register()
383 if (bus->reset_post_delay_us > 0) in __mdiobus_register()
384 fsleep(bus->reset_post_delay_us); in __mdiobus_register()
387 if (bus->reset) { in __mdiobus_register()
388 err = bus->reset(bus); in __mdiobus_register()
393 if (bus->read) { in __mdiobus_register()
394 err = mdiobus_scan_bus_c22(bus); in __mdiobus_register()
399 prevent_c45_scan = mdiobus_prevent_c45_scan(bus); in __mdiobus_register()
401 if (!prevent_c45_scan && bus->read_c45) { in __mdiobus_register()
402 err = mdiobus_scan_bus_c45(bus); in __mdiobus_register()
407 mdiobus_setup_mdiodev_from_board_info(bus, mdiobus_create_device); in __mdiobus_register()
409 bus->state = MDIOBUS_REGISTERED; in __mdiobus_register()
410 dev_dbg(&bus->dev, "probed\n"); in __mdiobus_register()
415 mdiodev = bus->mdio_map[i]; in __mdiobus_register()
424 if (bus->reset_gpiod) in __mdiobus_register()
425 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in __mdiobus_register()
427 device_del(&bus->dev); in __mdiobus_register()
432 void mdiobus_unregister(struct mii_bus *bus) in mdiobus_unregister() argument
437 if (WARN_ON_ONCE(bus->state != MDIOBUS_REGISTERED)) in mdiobus_unregister()
439 bus->state = MDIOBUS_UNREGISTERED; in mdiobus_unregister()
442 mdiodev = bus->mdio_map[i]; in mdiobus_unregister()
451 if (bus->reset_gpiod) in mdiobus_unregister()
452 gpiod_set_value_cansleep(bus->reset_gpiod, 1); in mdiobus_unregister()
454 device_del(&bus->dev); in mdiobus_unregister()
460 * @bus: mii_bus to free
466 void mdiobus_free(struct mii_bus *bus) in mdiobus_free() argument
469 if (bus->state == MDIOBUS_ALLOCATED) { in mdiobus_free()
470 kfree(bus); in mdiobus_free()
474 WARN(bus->state != MDIOBUS_UNREGISTERED, in mdiobus_free()
475 "%s: not in UNREGISTERED state\n", bus->id); in mdiobus_free()
476 bus->state = MDIOBUS_RELEASED; in mdiobus_free()
478 put_device(&bus->dev); in mdiobus_free()