diff options
author | Andrew Lunn <andrew@lunn.ch> | 2014-02-04 12:33:12 -0500 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2014-02-05 00:48:43 -0500 |
commit | 788a4d56ff378bff0b8e685d03a962b36903a149 (patch) | |
tree | d22d5b9e750448fb0d7695bf4c9360b326668a95 /drivers/phy | |
parent | 04c2facad8fee66c981a51852806d8923336f362 (diff) |
drivers: phy: Add support for optional phys
Add devm_phy_optional_get and phy_optional_get, which should be used
when the phy is optional. They does not return an error when the phy
does not exist, rather they returns NULL, which is considered as a valid
phy, but results in NOPs when used with the consumer API.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Acked-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Diffstat (limited to 'drivers/phy')
-rw-r--r-- | drivers/phy/phy-core.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index a9cdeee20d91..5f5b0f4be5be 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c | |||
@@ -426,6 +426,27 @@ struct phy *phy_get(struct device *dev, const char *string) | |||
426 | EXPORT_SYMBOL_GPL(phy_get); | 426 | EXPORT_SYMBOL_GPL(phy_get); |
427 | 427 | ||
428 | /** | 428 | /** |
429 | * phy_optional_get() - lookup and obtain a reference to an optional phy. | ||
430 | * @dev: device that requests this phy | ||
431 | * @string: the phy name as given in the dt data or the name of the controller | ||
432 | * port for non-dt case | ||
433 | * | ||
434 | * Returns the phy driver, after getting a refcount to it; or | ||
435 | * NULL if there is no such phy. The caller is responsible for | ||
436 | * calling phy_put() to release that count. | ||
437 | */ | ||
438 | struct phy *phy_optional_get(struct device *dev, const char *string) | ||
439 | { | ||
440 | struct phy *phy = phy_get(dev, string); | ||
441 | |||
442 | if (PTR_ERR(phy) == -ENODEV) | ||
443 | phy = NULL; | ||
444 | |||
445 | return phy; | ||
446 | } | ||
447 | EXPORT_SYMBOL_GPL(phy_optional_get); | ||
448 | |||
449 | /** | ||
429 | * devm_phy_get() - lookup and obtain a reference to a phy. | 450 | * devm_phy_get() - lookup and obtain a reference to a phy. |
430 | * @dev: device that requests this phy | 451 | * @dev: device that requests this phy |
431 | * @string: the phy name as given in the dt data or phy device name | 452 | * @string: the phy name as given in the dt data or phy device name |
@@ -456,6 +477,30 @@ struct phy *devm_phy_get(struct device *dev, const char *string) | |||
456 | EXPORT_SYMBOL_GPL(devm_phy_get); | 477 | EXPORT_SYMBOL_GPL(devm_phy_get); |
457 | 478 | ||
458 | /** | 479 | /** |
480 | * devm_phy_optional_get() - lookup and obtain a reference to an optional phy. | ||
481 | * @dev: device that requests this phy | ||
482 | * @string: the phy name as given in the dt data or phy device name | ||
483 | * for non-dt case | ||
484 | * | ||
485 | * Gets the phy using phy_get(), and associates a device with it using | ||
486 | * devres. On driver detach, release function is invoked on the devres | ||
487 | * data, then, devres data is freed. This differs to devm_phy_get() in | ||
488 | * that if the phy does not exist, it is not considered an error and | ||
489 | * -ENODEV will not be returned. Instead the NULL phy is returned, | ||
490 | * which can be passed to all other phy consumer calls. | ||
491 | */ | ||
492 | struct phy *devm_phy_optional_get(struct device *dev, const char *string) | ||
493 | { | ||
494 | struct phy *phy = devm_phy_get(dev, string); | ||
495 | |||
496 | if (PTR_ERR(phy) == -ENODEV) | ||
497 | phy = NULL; | ||
498 | |||
499 | return phy; | ||
500 | } | ||
501 | EXPORT_SYMBOL_GPL(devm_phy_optional_get); | ||
502 | |||
503 | /** | ||
459 | * phy_create() - create a new phy | 504 | * phy_create() - create a new phy |
460 | * @dev: device that is creating the new phy | 505 | * @dev: device that is creating the new phy |
461 | * @ops: function pointers for performing phy operations | 506 | * @ops: function pointers for performing phy operations |