Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1/*
  2 * OF helpers for the MDIO (Ethernet PHY) API
  3 *
  4 * Copyright (c) 2009 Secret Lab Technologies, Ltd.
  5 *
  6 * This file is released under the GPLv2
  7 *
  8 * This file provides helper functions for extracting PHY device information
  9 * out of the OpenFirmware device tree and using it to populate an mii_bus.
 10 */
 11
 12#include <linux/kernel.h>
 13#include <linux/device.h>
 14#include <linux/netdevice.h>
 15#include <linux/err.h>
 16#include <linux/phy.h>
 17#include <linux/phy_fixed.h>
 18#include <linux/of.h>
 19#include <linux/of_gpio.h>
 20#include <linux/of_irq.h>
 21#include <linux/of_mdio.h>
 22#include <linux/of_net.h>
 23#include <linux/module.h>
 24
 25MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
 26MODULE_LICENSE("GPL");
 27
 28/* Extract the clause 22 phy ID from the compatible string of the form
 29 * ethernet-phy-idAAAA.BBBB */
 30static int of_get_phy_id(struct device_node *device, u32 *phy_id)
 31{
 32	struct property *prop;
 33	const char *cp;
 34	unsigned int upper, lower;
 35
 36	of_property_for_each_string(device, "compatible", prop, cp) {
 37		if (sscanf(cp, "ethernet-phy-id%4x.%4x", &upper, &lower) == 2) {
 38			*phy_id = ((upper & 0xFFFF) << 16) | (lower & 0xFFFF);
 39			return 0;
 40		}
 41	}
 42	return -EINVAL;
 43}
 44
 45static void of_mdiobus_register_phy(struct mii_bus *mdio,
 46				    struct device_node *child, u32 addr)
 47{
 48	struct phy_device *phy;
 49	bool is_c45;
 50	int rc;
 51	u32 phy_id;
 52
 53	is_c45 = of_device_is_compatible(child,
 54					 "ethernet-phy-ieee802.3-c45");
 55
 56	if (!is_c45 && !of_get_phy_id(child, &phy_id))
 57		phy = phy_device_create(mdio, addr, phy_id, 0, NULL);
 58	else
 59		phy = get_phy_device(mdio, addr, is_c45);
 60	if (IS_ERR(phy))
 61		return;
 62
 63	rc = irq_of_parse_and_map(child, 0);
 64	if (rc > 0) {
 65		phy->irq = rc;
 66		mdio->irq[addr] = rc;
 67	} else {
 68		phy->irq = mdio->irq[addr];
 69	}
 70
 71	if (of_property_read_bool(child, "broken-turn-around"))
 72		mdio->phy_ignore_ta_mask |= 1 << addr;
 73
 74	/* Associate the OF node with the device structure so it
 75	 * can be looked up later */
 76	of_node_get(child);
 77	phy->mdio.dev.of_node = child;
 78
 79	/* All data is now stored in the phy struct;
 80	 * register it */
 81	rc = phy_device_register(phy);
 82	if (rc) {
 83		phy_device_free(phy);
 84		of_node_put(child);
 85		return;
 86	}
 87
 88	dev_dbg(&mdio->dev, "registered phy %s at address %i\n",
 89		child->name, addr);
 90}
 91
 92static void of_mdiobus_register_device(struct mii_bus *mdio,
 93				       struct device_node *child, u32 addr)
 94{
 95	struct mdio_device *mdiodev;
 96	int rc;
 97
 98	mdiodev = mdio_device_create(mdio, addr);
 99	if (IS_ERR(mdiodev))
100		return;
101
102	/* Associate the OF node with the device structure so it
103	 * can be looked up later.
104	 */
105	of_node_get(child);
106	mdiodev->dev.of_node = child;
107
108	/* All data is now stored in the mdiodev struct; register it. */
109	rc = mdio_device_register(mdiodev);
110	if (rc) {
111		mdio_device_free(mdiodev);
112		of_node_put(child);
113		return;
114	}
115
116	dev_dbg(&mdio->dev, "registered mdio device %s at address %i\n",
117		child->name, addr);
118}
119
120int of_mdio_parse_addr(struct device *dev, const struct device_node *np)
121{
122	u32 addr;
123	int ret;
124
125	ret = of_property_read_u32(np, "reg", &addr);
126	if (ret < 0) {
127		dev_err(dev, "%s has invalid PHY address\n", np->full_name);
128		return ret;
129	}
130
131	/* A PHY must have a reg property in the range [0-31] */
132	if (addr >= PHY_MAX_ADDR) {
133		dev_err(dev, "%s PHY address %i is too large\n",
134			np->full_name, addr);
135		return -EINVAL;
136	}
137
138	return addr;
139}
140EXPORT_SYMBOL(of_mdio_parse_addr);
141
142/* The following is a list of PHY compatible strings which appear in
143 * some DTBs. The compatible string is never matched against a PHY
144 * driver, so is pointless. We only expect devices which are not PHYs
145 * to have a compatible string, so they can be matched to an MDIO
146 * driver.  Encourage users to upgrade their DT blobs to remove these.
147 */
148static const struct of_device_id whitelist_phys[] = {
149	{ .compatible = "brcm,40nm-ephy" },
150	{ .compatible = "marvell,88E1111", },
151	{ .compatible = "marvell,88e1116", },
152	{ .compatible = "marvell,88e1118", },
153	{ .compatible = "marvell,88e1145", },
154	{ .compatible = "marvell,88e1149r", },
155	{ .compatible = "marvell,88e1310", },
156	{ .compatible = "marvell,88E1510", },
157	{ .compatible = "marvell,88E1514", },
158	{ .compatible = "moxa,moxart-rtl8201cp", },
159	{}
160};
161
162/*
163 * Return true if the child node is for a phy. It must either:
164 * o Compatible string of "ethernet-phy-idX.X"
165 * o Compatible string of "ethernet-phy-ieee802.3-c45"
166 * o Compatible string of "ethernet-phy-ieee802.3-c22"
167 * o In the white list above (and issue a warning)
168 * o No compatibility string
169 *
170 * A device which is not a phy is expected to have a compatible string
171 * indicating what sort of device it is.
172 */
173static bool of_mdiobus_child_is_phy(struct device_node *child)
174{
175	u32 phy_id;
176
177	if (of_get_phy_id(child, &phy_id) != -EINVAL)
178		return true;
179
180	if (of_device_is_compatible(child, "ethernet-phy-ieee802.3-c45"))
181		return true;
182
183	if (of_device_is_compatible(child, "ethernet-phy-ieee802.3-c22"))
184		return true;
185
186	if (of_match_node(whitelist_phys, child)) {
187		pr_warn(FW_WARN
188			"%s: Whitelisted compatible string. Please remove\n",
189			child->full_name);
190		return true;
191	}
192
193	if (!of_find_property(child, "compatible", NULL))
194		return true;
195
196	return false;
197}
198
199/**
200 * of_mdiobus_register - Register mii_bus and create PHYs from the device tree
201 * @mdio: pointer to mii_bus structure
202 * @np: pointer to device_node of MDIO bus.
203 *
204 * This function registers the mii_bus structure and registers a phy_device
205 * for each child node of @np.
206 */
207int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
208{
209	struct device_node *child;
210	bool scanphys = false;
211	int addr, rc;
212
213	/* Do not continue if the node is disabled */
214	if (!of_device_is_available(np))
215		return -ENODEV;
216
217	/* Mask out all PHYs from auto probing.  Instead the PHYs listed in
218	 * the device tree are populated after the bus has been registered */
219	mdio->phy_mask = ~0;
220
221	mdio->dev.of_node = np;
222
223	/* Register the MDIO bus */
224	rc = mdiobus_register(mdio);
225	if (rc)
226		return rc;
227
228	/* Loop over the child nodes and register a phy_device for each phy */
229	for_each_available_child_of_node(np, child) {
230		addr = of_mdio_parse_addr(&mdio->dev, child);
231		if (addr < 0) {
232			scanphys = true;
233			continue;
234		}
235
236		if (of_mdiobus_child_is_phy(child))
237			of_mdiobus_register_phy(mdio, child, addr);
238		else
239			of_mdiobus_register_device(mdio, child, addr);
240	}
241
242	if (!scanphys)
243		return 0;
244
245	/* auto scan for PHYs with empty reg property */
246	for_each_available_child_of_node(np, child) {
247		/* Skip PHYs with reg property set */
248		if (of_find_property(child, "reg", NULL))
249			continue;
250
251		for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
252			/* skip already registered PHYs */
253			if (mdiobus_is_registered_device(mdio, addr))
254				continue;
255
256			/* be noisy to encourage people to set reg property */
257			dev_info(&mdio->dev, "scan phy %s at address %i\n",
258				 child->name, addr);
259
260			if (of_mdiobus_child_is_phy(child))
261				of_mdiobus_register_phy(mdio, child, addr);
262		}
263	}
264
265	return 0;
266}
267EXPORT_SYMBOL(of_mdiobus_register);
268
269/* Helper function for of_phy_find_device */
270static int of_phy_match(struct device *dev, void *phy_np)
271{
272	return dev->of_node == phy_np;
273}
274
275/**
276 * of_phy_find_device - Give a PHY node, find the phy_device
277 * @phy_np: Pointer to the phy's device tree node
278 *
279 * If successful, returns a pointer to the phy_device with the embedded
280 * struct device refcount incremented by one, or NULL on failure.
281 */
282struct phy_device *of_phy_find_device(struct device_node *phy_np)
283{
284	struct device *d;
285	struct mdio_device *mdiodev;
286
287	if (!phy_np)
288		return NULL;
289
290	d = bus_find_device(&mdio_bus_type, NULL, phy_np, of_phy_match);
291	if (d) {
292		mdiodev = to_mdio_device(d);
293		if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY)
294			return to_phy_device(d);
295		put_device(d);
296	}
297
298	return NULL;
299}
300EXPORT_SYMBOL(of_phy_find_device);
301
302/**
303 * of_phy_connect - Connect to the phy described in the device tree
304 * @dev: pointer to net_device claiming the phy
305 * @phy_np: Pointer to device tree node for the PHY
306 * @hndlr: Link state callback for the network device
307 * @flags: flags to pass to the PHY
308 * @iface: PHY data interface type
309 *
310 * If successful, returns a pointer to the phy_device with the embedded
311 * struct device refcount incremented by one, or NULL on failure. The
312 * refcount must be dropped by calling phy_disconnect() or phy_detach().
313 */
314struct phy_device *of_phy_connect(struct net_device *dev,
315				  struct device_node *phy_np,
316				  void (*hndlr)(struct net_device *), u32 flags,
317				  phy_interface_t iface)
318{
319	struct phy_device *phy = of_phy_find_device(phy_np);
320	int ret;
321
322	if (!phy)
323		return NULL;
324
325	phy->dev_flags = flags;
326
327	ret = phy_connect_direct(dev, phy, hndlr, iface);
328
329	/* refcount is held by phy_connect_direct() on success */
330	put_device(&phy->mdio.dev);
331
332	return ret ? NULL : phy;
333}
334EXPORT_SYMBOL(of_phy_connect);
335
336/**
337 * of_phy_get_and_connect
338 * - Get phy node and connect to the phy described in the device tree
339 * @dev: pointer to net_device claiming the phy
340 * @np: Pointer to device tree node for the net_device claiming the phy
341 * @hndlr: Link state callback for the network device
342 *
343 * If successful, returns a pointer to the phy_device with the embedded
344 * struct device refcount incremented by one, or NULL on failure. The
345 * refcount must be dropped by calling phy_disconnect() or phy_detach().
346 */
347struct phy_device *of_phy_get_and_connect(struct net_device *dev,
348					  struct device_node *np,
349					  void (*hndlr)(struct net_device *))
350{
351	phy_interface_t iface;
352	struct device_node *phy_np;
353	struct phy_device *phy;
354
355	iface = of_get_phy_mode(np);
356	if (iface < 0)
357		return NULL;
358
359	phy_np = of_parse_phandle(np, "phy-handle", 0);
360	if (!phy_np)
361		return NULL;
362
363	phy = of_phy_connect(dev, phy_np, hndlr, 0, iface);
364
365	of_node_put(phy_np);
366
367	return phy;
368}
369EXPORT_SYMBOL(of_phy_get_and_connect);
370
371/**
372 * of_phy_attach - Attach to a PHY without starting the state machine
373 * @dev: pointer to net_device claiming the phy
374 * @phy_np: Node pointer for the PHY
375 * @flags: flags to pass to the PHY
376 * @iface: PHY data interface type
377 *
378 * If successful, returns a pointer to the phy_device with the embedded
379 * struct device refcount incremented by one, or NULL on failure. The
380 * refcount must be dropped by calling phy_disconnect() or phy_detach().
381 */
382struct phy_device *of_phy_attach(struct net_device *dev,
383				 struct device_node *phy_np, u32 flags,
384				 phy_interface_t iface)
385{
386	struct phy_device *phy = of_phy_find_device(phy_np);
387	int ret;
388
389	if (!phy)
390		return NULL;
391
392	ret = phy_attach_direct(dev, phy, flags, iface);
393
394	/* refcount is held by phy_attach_direct() on success */
395	put_device(&phy->mdio.dev);
396
397	return ret ? NULL : phy;
398}
399EXPORT_SYMBOL(of_phy_attach);
400
401/*
402 * of_phy_is_fixed_link() and of_phy_register_fixed_link() must
403 * support two DT bindings:
404 * - the old DT binding, where 'fixed-link' was a property with 5
405 *   cells encoding various informations about the fixed PHY
406 * - the new DT binding, where 'fixed-link' is a sub-node of the
407 *   Ethernet device.
408 */
409bool of_phy_is_fixed_link(struct device_node *np)
410{
411	struct device_node *dn;
412	int len, err;
413	const char *managed;
414
415	/* New binding */
416	dn = of_get_child_by_name(np, "fixed-link");
417	if (dn) {
418		of_node_put(dn);
419		return true;
420	}
421
422	err = of_property_read_string(np, "managed", &managed);
423	if (err == 0 && strcmp(managed, "auto") != 0)
424		return true;
425
426	/* Old binding */
427	if (of_get_property(np, "fixed-link", &len) &&
428	    len == (5 * sizeof(__be32)))
429		return true;
430
431	return false;
432}
433EXPORT_SYMBOL(of_phy_is_fixed_link);
434
435int of_phy_register_fixed_link(struct device_node *np)
436{
437	struct fixed_phy_status status = {};
438	struct device_node *fixed_link_node;
439	const __be32 *fixed_link_prop;
440	int link_gpio;
441	int len, err;
442	struct phy_device *phy;
443	const char *managed;
444
445	err = of_property_read_string(np, "managed", &managed);
446	if (err == 0) {
447		if (strcmp(managed, "in-band-status") == 0) {
448			/* status is zeroed, namely its .link member */
449			phy = fixed_phy_register(PHY_POLL, &status, -1, np);
450			return PTR_ERR_OR_ZERO(phy);
451		}
452	}
453
454	/* New binding */
455	fixed_link_node = of_get_child_by_name(np, "fixed-link");
456	if (fixed_link_node) {
457		status.link = 1;
458		status.duplex = of_property_read_bool(fixed_link_node,
459						      "full-duplex");
460		if (of_property_read_u32(fixed_link_node, "speed",
461					 &status.speed)) {
462			of_node_put(fixed_link_node);
463			return -EINVAL;
464		}
465		status.pause = of_property_read_bool(fixed_link_node, "pause");
466		status.asym_pause = of_property_read_bool(fixed_link_node,
467							  "asym-pause");
468		link_gpio = of_get_named_gpio_flags(fixed_link_node,
469						    "link-gpios", 0, NULL);
470		of_node_put(fixed_link_node);
471		if (link_gpio == -EPROBE_DEFER)
472			return -EPROBE_DEFER;
473
474		phy = fixed_phy_register(PHY_POLL, &status, link_gpio, np);
475		return PTR_ERR_OR_ZERO(phy);
476	}
477
478	/* Old binding */
479	fixed_link_prop = of_get_property(np, "fixed-link", &len);
480	if (fixed_link_prop && len == (5 * sizeof(__be32))) {
481		status.link = 1;
482		status.duplex = be32_to_cpu(fixed_link_prop[1]);
483		status.speed = be32_to_cpu(fixed_link_prop[2]);
484		status.pause = be32_to_cpu(fixed_link_prop[3]);
485		status.asym_pause = be32_to_cpu(fixed_link_prop[4]);
486		phy = fixed_phy_register(PHY_POLL, &status, -1, np);
487		return PTR_ERR_OR_ZERO(phy);
488	}
489
490	return -ENODEV;
491}
492EXPORT_SYMBOL(of_phy_register_fixed_link);
493
494void of_phy_deregister_fixed_link(struct device_node *np)
495{
496	struct phy_device *phydev;
497
498	phydev = of_phy_find_device(np);
499	if (!phydev)
500		return;
501
502	fixed_phy_unregister(phydev);
503
504	put_device(&phydev->mdio.dev);	/* of_phy_find_device() */
505	phy_device_free(phydev);	/* fixed_phy_register() */
506}
507EXPORT_SYMBOL(of_phy_deregister_fixed_link);