of_mdio.c 14.4 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);

465 466 467 468 469 470 471 472 473 474 475
/*
 * 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;
476 477
	int len, err;
	const char *managed;
478 479 480 481 482 483 484 485

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

486 487 488 489
	err = of_property_read_string(np, "managed", &managed);
	if (err == 0 && strcmp(managed, "auto") != 0)
		return true;

490 491 492 493 494 495 496 497 498 499 500 501 502
	/* 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;
503
	u32 fixed_link_prop[5];
504 505
	const char *managed;

506 507 508 509
	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;
510
	}
511 512 513 514 515

	/* New binding */
	fixed_link_node = of_get_child_by_name(np, "fixed-link");
	if (fixed_link_node) {
		status.link = 1;
516 517
		status.duplex = of_property_read_bool(fixed_link_node,
						      "full-duplex");
518 519 520
		if (of_property_read_u32(fixed_link_node, "speed",
					 &status.speed)) {
			of_node_put(fixed_link_node);
521
			return -EINVAL;
522
		}
523 524 525
		status.pause = of_property_read_bool(fixed_link_node, "pause");
		status.asym_pause = of_property_read_bool(fixed_link_node,
							  "asym-pause");
526
		of_node_put(fixed_link_node);
527

528
		goto register_phy;
529 530 531
	}

	/* Old binding */
532 533
	if (of_property_read_u32_array(np, "fixed-link", fixed_link_prop,
				       ARRAY_SIZE(fixed_link_prop)) == 0) {
534
		status.link = 1;
535 536 537 538
		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];
539
		goto register_phy;
540 541 542
	}

	return -ENODEV;
543 544

register_phy:
545
	return PTR_ERR_OR_ZERO(fixed_phy_register(PHY_POLL, &status, np));
546 547
}
EXPORT_SYMBOL(of_phy_register_fixed_link);
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562

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);