of_mdio.c 15.3 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-only
2 3 4 5 6 7 8 9 10
/*
 * OF helpers for the MDIO (Ethernet PHY) API
 *
 * Copyright (c) 2009 Secret Lab Technologies, Ltd.
 *
 * This file provides helper functions for extracting PHY device information
 * out of the OpenFirmware device tree and using it to populate an mii_bus.
 */

11 12 13 14
#include <linux/kernel.h>
#include <linux/device.h>
#include <linux/netdevice.h>
#include <linux/err.h>
15
#include <linux/phy.h>
16
#include <linux/phy_fixed.h>
17
#include <linux/of.h>
18
#include <linux/of_irq.h>
19
#include <linux/of_mdio.h>
20
#include <linux/of_net.h>
21 22
#include <linux/module.h>

23 24
#define DEFAULT_GPIO_RESET_DELAY	10	/* in microseconds */

25 26 27
MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
MODULE_LICENSE("GPL");

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
/* Extract the clause 22 phy ID from the compatible string of the form
 * ethernet-phy-idAAAA.BBBB */
static int of_get_phy_id(struct device_node *device, u32 *phy_id)
{
	struct property *prop;
	const char *cp;
	unsigned int upper, lower;

	of_property_for_each_string(device, "compatible", prop, cp) {
		if (sscanf(cp, "ethernet-phy-id%4x.%4x", &upper, &lower) == 2) {
			*phy_id = ((upper & 0xFFFF) << 16) | (lower & 0xFFFF);
			return 0;
		}
	}
	return -EINVAL;
}

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
static struct mii_timestamper *of_find_mii_timestamper(struct device_node *node)
{
	struct of_phandle_args arg;
	int err;

	err = of_parse_phandle_with_fixed_args(node, "timestamper", 1, 0, &arg);

	if (err == -ENOENT)
		return NULL;
	else if (err)
		return ERR_PTR(err);

	if (arg.args_count != 1)
		return ERR_PTR(-EINVAL);

	return register_mii_timestamper(arg.np, arg.args[0]);
}

63 64
int of_mdiobus_phy_device_register(struct mii_bus *mdio, struct phy_device *phy,
			      struct device_node *child, u32 addr)
65
{
B
Ben Dooks 已提交
66
	int rc;
67

68
	rc = of_irq_get(child, 0);
69
	if (rc == -EPROBE_DEFER)
70
		return rc;
71

B
Ben Dooks 已提交
72 73
	if (rc > 0) {
		phy->irq = rc;
D
Dan Carpenter 已提交
74
		mdio->irq[addr] = rc;
B
Ben Dooks 已提交
75
	} else {
D
Dan Carpenter 已提交
76
		phy->irq = mdio->irq[addr];
77 78
	}

79 80 81
	if (of_property_read_bool(child, "broken-turn-around"))
		mdio->phy_ignore_ta_mask |= 1 << addr;

82 83 84 85
	of_property_read_u32(child, "reset-assert-us",
			     &phy->mdio.reset_assert_delay);
	of_property_read_u32(child, "reset-deassert-us",
			     &phy->mdio.reset_deassert_delay);
86

87 88 89
	/* Associate the OF node with the device structure so it
	 * can be looked up later */
	of_node_get(child);
A
Andrew Lunn 已提交
90
	phy->mdio.dev.of_node = child;
91
	phy->mdio.dev.fwnode = of_fwnode_handle(child);
92 93 94 95

	/* All data is now stored in the phy struct;
	 * register it */
	rc = phy_device_register(phy);
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
	if (rc) {
		of_node_put(child);
		return rc;
	}

	dev_dbg(&mdio->dev, "registered phy %pOFn at address %i\n",
		child, addr);
	return 0;
}
EXPORT_SYMBOL(of_mdiobus_phy_device_register);

static int of_mdiobus_register_phy(struct mii_bus *mdio,
				    struct device_node *child, u32 addr)
{
	struct mii_timestamper *mii_ts;
	struct phy_device *phy;
	bool is_c45;
	int rc;
	u32 phy_id;

	mii_ts = of_find_mii_timestamper(child);
	if (IS_ERR(mii_ts))
		return PTR_ERR(mii_ts);

	is_c45 = of_device_is_compatible(child,
					 "ethernet-phy-ieee802.3-c45");

	if (!is_c45 && !of_get_phy_id(child, &phy_id))
		phy = phy_device_create(mdio, addr, phy_id, 0, NULL);
	else
		phy = get_phy_device(mdio, addr, is_c45);
	if (IS_ERR(phy)) {
		if (mii_ts)
			unregister_mii_timestamper(mii_ts);
		return PTR_ERR(phy);
	}

	rc = of_mdiobus_phy_device_register(mdio, phy, child, addr);
134
	if (rc) {
135 136
		if (mii_ts)
			unregister_mii_timestamper(mii_ts);
137
		phy_device_free(phy);
138
		return rc;
139
	}
140 141 142 143 144 145 146

	/* phy->mii_ts may already be defined by the PHY driver. A
	 * mii_timestamper probed via the device tree will still have
	 * precedence.
	 */
	if (mii_ts)
		phy->mii_ts = mii_ts;
147

148
	return 0;
149 150
}

151 152
static int of_mdiobus_register_device(struct mii_bus *mdio,
				      struct device_node *child, u32 addr)
153 154 155 156 157
{
	struct mdio_device *mdiodev;
	int rc;

	mdiodev = mdio_device_create(mdio, addr);
158
	if (IS_ERR(mdiodev))
159
		return PTR_ERR(mdiodev);
160 161 162 163 164 165

	/* Associate the OF node with the device structure so it
	 * can be looked up later.
	 */
	of_node_get(child);
	mdiodev->dev.of_node = child;
166
	mdiodev->dev.fwnode = of_fwnode_handle(child);
167 168 169 170 171 172

	/* All data is now stored in the mdiodev struct; register it. */
	rc = mdio_device_register(mdiodev);
	if (rc) {
		mdio_device_free(mdiodev);
		of_node_put(child);
173
		return rc;
174 175
	}

176 177
	dev_dbg(&mdio->dev, "registered mdio device %pOFn at address %i\n",
		child, addr);
178
	return 0;
179 180
}

181 182 183 184 185 186 187 188
/* The following is a list of PHY compatible strings which appear in
 * some DTBs. The compatible string is never matched against a PHY
 * driver, so is pointless. We only expect devices which are not PHYs
 * to have a compatible string, so they can be matched to an MDIO
 * driver.  Encourage users to upgrade their DT blobs to remove these.
 */
static const struct of_device_id whitelist_phys[] = {
	{ .compatible = "brcm,40nm-ephy" },
189
	{ .compatible = "broadcom,bcm5241" },
190 191 192
	{ .compatible = "marvell,88E1111", },
	{ .compatible = "marvell,88e1116", },
	{ .compatible = "marvell,88e1118", },
193
	{ .compatible = "marvell,88e1145", },
194 195 196 197 198 199 200 201
	{ .compatible = "marvell,88e1149r", },
	{ .compatible = "marvell,88e1310", },
	{ .compatible = "marvell,88E1510", },
	{ .compatible = "marvell,88E1514", },
	{ .compatible = "moxa,moxart-rtl8201cp", },
	{}
};

202 203 204 205 206
/*
 * Return true if the child node is for a phy. It must either:
 * o Compatible string of "ethernet-phy-idX.X"
 * o Compatible string of "ethernet-phy-ieee802.3-c45"
 * o Compatible string of "ethernet-phy-ieee802.3-c22"
207
 * o In the white list above (and issue a warning)
208 209 210 211 212
 * o No compatibility string
 *
 * A device which is not a phy is expected to have a compatible string
 * indicating what sort of device it is.
 */
213
bool of_mdiobus_child_is_phy(struct device_node *child)
214 215 216 217 218 219 220 221 222 223 224 225
{
	u32 phy_id;

	if (of_get_phy_id(child, &phy_id) != -EINVAL)
		return true;

	if (of_device_is_compatible(child, "ethernet-phy-ieee802.3-c45"))
		return true;

	if (of_device_is_compatible(child, "ethernet-phy-ieee802.3-c22"))
		return true;

226 227
	if (of_match_node(whitelist_phys, child)) {
		pr_warn(FW_WARN
228 229
			"%pOF: Whitelisted compatible string. Please remove\n",
			child);
230 231 232
		return true;
	}

233 234 235 236 237
	if (!of_find_property(child, "compatible", NULL))
		return true;

	return false;
}
238
EXPORT_SYMBOL(of_mdiobus_child_is_phy);
239

240 241 242 243 244 245 246 247 248 249 250
/**
 * of_mdiobus_register - Register mii_bus and create PHYs from the device tree
 * @mdio: pointer to mii_bus structure
 * @np: pointer to device_node of MDIO bus.
 *
 * This function registers the mii_bus structure and registers a phy_device
 * for each child node of @np.
 */
int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
{
	struct device_node *child;
251
	bool scanphys = false;
252
	int addr, rc;
253

254 255 256
	if (!np)
		return mdiobus_register(mdio);

257 258 259 260
	/* Do not continue if the node is disabled */
	if (!of_device_is_available(np))
		return -ENODEV;

261 262 263 264
	/* Mask out all PHYs from auto probing.  Instead the PHYs listed in
	 * the device tree are populated after the bus has been registered */
	mdio->phy_mask = ~0;

265
	mdio->dev.of_node = np;
266
	mdio->dev.fwnode = of_fwnode_handle(np);
267

268 269 270
	/* Get bus level PHY reset GPIO details */
	mdio->reset_delay_us = DEFAULT_GPIO_RESET_DELAY;
	of_property_read_u32(np, "reset-delay-us", &mdio->reset_delay_us);
271 272
	mdio->reset_post_delay_us = 0;
	of_property_read_u32(np, "reset-post-delay-us", &mdio->reset_post_delay_us);
273

274 275 276 277 278
	/* Register the MDIO bus */
	rc = mdiobus_register(mdio);
	if (rc)
		return rc;

279
	/* Loop over the child nodes and register a phy_device for each phy */
280
	for_each_available_child_of_node(np, child) {
281 282
		addr = of_mdio_parse_addr(&mdio->dev, child);
		if (addr < 0) {
283
			scanphys = true;
284 285 286
			continue;
		}

287
		if (of_mdiobus_child_is_phy(child))
288
			rc = of_mdiobus_register_phy(mdio, child, addr);
289
		else
290
			rc = of_mdiobus_register_device(mdio, child, addr);
291 292 293 294 295 296

		if (rc == -ENODEV)
			dev_err(&mdio->dev,
				"MDIO device at address %d is missing.\n",
				addr);
		else if (rc)
297
			goto unregister;
298 299
	}

300 301 302 303 304 305
	if (!scanphys)
		return 0;

	/* auto scan for PHYs with empty reg property */
	for_each_available_child_of_node(np, child) {
		/* Skip PHYs with reg property set */
306
		if (of_find_property(child, "reg", NULL))
307 308 309 310
			continue;

		for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
			/* skip already registered PHYs */
311
			if (mdiobus_is_registered_device(mdio, addr))
312 313 314
				continue;

			/* be noisy to encourage people to set reg property */
315 316
			dev_info(&mdio->dev, "scan phy %pOFn at address %i\n",
				 child, addr);
317

318
			if (of_mdiobus_child_is_phy(child)) {
319 320 321 322
				/* -ENODEV is the return code that PHYLIB has
				 * standardized on to indicate that bus
				 * scanning should continue.
				 */
323
				rc = of_mdiobus_register_phy(mdio, child, addr);
324 325 326
				if (!rc)
					break;
				if (rc != -ENODEV)
327 328
					goto unregister;
			}
329 330 331
		}
	}

332
	return 0;
333 334 335 336

unregister:
	mdiobus_unregister(mdio);
	return rc;
337 338 339
}
EXPORT_SYMBOL(of_mdiobus_register);

R
Russell King 已提交
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
/**
 * of_mdio_find_device - Given a device tree node, find the mdio_device
 * @np: pointer to the mdio_device's device tree node
 *
 * If successful, returns a pointer to the mdio_device with the embedded
 * struct device refcount incremented by one, or NULL on failure.
 * The caller should call put_device() on the mdio_device after its use
 */
struct mdio_device *of_mdio_find_device(struct device_node *np)
{
	struct device *d;

	if (!np)
		return NULL;

	d = bus_find_device_by_of_node(&mdio_bus_type, np);
	if (!d)
		return NULL;

	return to_mdio_device(d);
}
EXPORT_SYMBOL(of_mdio_find_device);

363 364 365 366
/**
 * of_phy_find_device - Give a PHY node, find the phy_device
 * @phy_np: Pointer to the phy's device tree node
 *
367 368
 * If successful, returns a pointer to the phy_device with the embedded
 * struct device refcount incremented by one, or NULL on failure.
369 370 371
 */
struct phy_device *of_phy_find_device(struct device_node *phy_np)
{
372 373
	struct mdio_device *mdiodev;

R
Russell King 已提交
374 375
	mdiodev = of_mdio_find_device(phy_np);
	if (!mdiodev)
376 377
		return NULL;

R
Russell King 已提交
378 379 380 381
	if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY)
		return to_phy_device(&mdiodev->dev);

	put_device(&mdiodev->dev);
382 383

	return NULL;
384 385 386 387 388 389 390 391
}
EXPORT_SYMBOL(of_phy_find_device);

/**
 * of_phy_connect - Connect to the phy described in the device tree
 * @dev: pointer to net_device claiming the phy
 * @phy_np: Pointer to device tree node for the PHY
 * @hndlr: Link state callback for the network device
392
 * @flags: flags to pass to the PHY
393 394
 * @iface: PHY data interface type
 *
395 396 397
 * If successful, returns a pointer to the phy_device with the embedded
 * struct device refcount incremented by one, or NULL on failure. The
 * refcount must be dropped by calling phy_disconnect() or phy_detach().
398 399 400 401 402 403 404
 */
struct phy_device *of_phy_connect(struct net_device *dev,
				  struct device_node *phy_np,
				  void (*hndlr)(struct net_device *), u32 flags,
				  phy_interface_t iface)
{
	struct phy_device *phy = of_phy_find_device(phy_np);
405
	int ret;
406 407 408 409

	if (!phy)
		return NULL;

410
	phy->dev_flags |= flags;
411

412 413 414
	ret = phy_connect_direct(dev, phy, hndlr, iface);

	/* refcount is held by phy_connect_direct() on success */
A
Andrew Lunn 已提交
415
	put_device(&phy->mdio.dev);
416 417

	return ret ? NULL : phy;
418 419
}
EXPORT_SYMBOL(of_phy_connect);
420

421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
/**
 * of_phy_get_and_connect
 * - Get phy node and connect to the phy described in the device tree
 * @dev: pointer to net_device claiming the phy
 * @np: Pointer to device tree node for the net_device claiming the phy
 * @hndlr: Link state callback for the network device
 *
 * If successful, returns a pointer to the phy_device with the embedded
 * struct device refcount incremented by one, or NULL on failure. The
 * refcount must be dropped by calling phy_disconnect() or phy_detach().
 */
struct phy_device *of_phy_get_and_connect(struct net_device *dev,
					  struct device_node *np,
					  void (*hndlr)(struct net_device *))
{
	phy_interface_t iface;
	struct device_node *phy_np;
	struct phy_device *phy;
439
	int ret;
440

441 442
	ret = of_get_phy_mode(np, &iface);
	if (ret)
443
		return NULL;
444 445 446 447 448 449 450 451 452 453 454 455
	if (of_phy_is_fixed_link(np)) {
		ret = of_phy_register_fixed_link(np);
		if (ret < 0) {
			netdev_err(dev, "broken fixed-link specification\n");
			return NULL;
		}
		phy_np = of_node_get(np);
	} else {
		phy_np = of_parse_phandle(np, "phy-handle", 0);
		if (!phy_np)
			return NULL;
	}
456 457 458 459 460 461 462 463 464

	phy = of_phy_connect(dev, phy_np, hndlr, 0, iface);

	of_node_put(phy_np);

	return phy;
}
EXPORT_SYMBOL(of_phy_get_and_connect);

A
Andy Fleming 已提交
465 466 467 468 469 470
/**
 * of_phy_attach - Attach to a PHY without starting the state machine
 * @dev: pointer to net_device claiming the phy
 * @phy_np: Node pointer for the PHY
 * @flags: flags to pass to the PHY
 * @iface: PHY data interface type
471 472 473 474
 *
 * If successful, returns a pointer to the phy_device with the embedded
 * struct device refcount incremented by one, or NULL on failure. The
 * refcount must be dropped by calling phy_disconnect() or phy_detach().
A
Andy Fleming 已提交
475 476 477 478 479 480
 */
struct phy_device *of_phy_attach(struct net_device *dev,
				 struct device_node *phy_np, u32 flags,
				 phy_interface_t iface)
{
	struct phy_device *phy = of_phy_find_device(phy_np);
481
	int ret;
A
Andy Fleming 已提交
482 483 484 485

	if (!phy)
		return NULL;

486 487 488
	ret = phy_attach_direct(dev, phy, flags, iface);

	/* refcount is held by phy_attach_direct() on success */
A
Andrew Lunn 已提交
489
	put_device(&phy->mdio.dev);
490 491

	return ret ? NULL : phy;
A
Andy Fleming 已提交
492 493
}
EXPORT_SYMBOL(of_phy_attach);
494 495 496 497 498 499 500 501 502 503 504 505

/*
 * of_phy_is_fixed_link() and of_phy_register_fixed_link() must
 * support two DT bindings:
 * - the old DT binding, where 'fixed-link' was a property with 5
 *   cells encoding various informations about the fixed PHY
 * - the new DT binding, where 'fixed-link' is a sub-node of the
 *   Ethernet device.
 */
bool of_phy_is_fixed_link(struct device_node *np)
{
	struct device_node *dn;
506 507
	int len, err;
	const char *managed;
508 509 510 511 512 513 514 515

	/* New binding */
	dn = of_get_child_by_name(np, "fixed-link");
	if (dn) {
		of_node_put(dn);
		return true;
	}

516 517 518 519
	err = of_property_read_string(np, "managed", &managed);
	if (err == 0 && strcmp(managed, "auto") != 0)
		return true;

520 521 522 523 524 525 526 527 528 529 530 531 532
	/* Old binding */
	if (of_get_property(np, "fixed-link", &len) &&
	    len == (5 * sizeof(__be32)))
		return true;

	return false;
}
EXPORT_SYMBOL(of_phy_is_fixed_link);

int of_phy_register_fixed_link(struct device_node *np)
{
	struct fixed_phy_status status = {};
	struct device_node *fixed_link_node;
533
	u32 fixed_link_prop[5];
534 535
	const char *managed;

536 537 538 539
	if (of_property_read_string(np, "managed", &managed) == 0 &&
	    strcmp(managed, "in-band-status") == 0) {
		/* status is zeroed, namely its .link member */
		goto register_phy;
540
	}
541 542 543 544 545

	/* New binding */
	fixed_link_node = of_get_child_by_name(np, "fixed-link");
	if (fixed_link_node) {
		status.link = 1;
546 547
		status.duplex = of_property_read_bool(fixed_link_node,
						      "full-duplex");
548 549 550
		if (of_property_read_u32(fixed_link_node, "speed",
					 &status.speed)) {
			of_node_put(fixed_link_node);
551
			return -EINVAL;
552
		}
553 554 555
		status.pause = of_property_read_bool(fixed_link_node, "pause");
		status.asym_pause = of_property_read_bool(fixed_link_node,
							  "asym-pause");
556
		of_node_put(fixed_link_node);
557

558
		goto register_phy;
559 560 561
	}

	/* Old binding */
562 563
	if (of_property_read_u32_array(np, "fixed-link", fixed_link_prop,
				       ARRAY_SIZE(fixed_link_prop)) == 0) {
564
		status.link = 1;
565 566 567 568
		status.duplex = fixed_link_prop[1];
		status.speed  = fixed_link_prop[2];
		status.pause  = fixed_link_prop[3];
		status.asym_pause = fixed_link_prop[4];
569
		goto register_phy;
570 571 572
	}

	return -ENODEV;
573 574

register_phy:
575
	return PTR_ERR_OR_ZERO(fixed_phy_register(PHY_POLL, &status, np));
576 577
}
EXPORT_SYMBOL(of_phy_register_fixed_link);
578 579 580 581 582 583 584 585 586 587 588 589 590 591 592

void of_phy_deregister_fixed_link(struct device_node *np)
{
	struct phy_device *phydev;

	phydev = of_phy_find_device(np);
	if (!phydev)
		return;

	fixed_phy_unregister(phydev);

	put_device(&phydev->mdio.dev);	/* of_phy_find_device() */
	phy_device_free(phydev);	/* fixed_phy_register() */
}
EXPORT_SYMBOL(of_phy_deregister_fixed_link);