aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/phy
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2014-02-04 12:33:12 -0500
committerJason Cooper <jason@lakedaemon.net>2014-02-05 00:48:43 -0500
commit788a4d56ff378bff0b8e685d03a962b36903a149 (patch)
treed22d5b9e750448fb0d7695bf4c9360b326668a95 /drivers/phy
parent04c2facad8fee66c981a51852806d8923336f362 (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.c45
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)
426EXPORT_SYMBOL_GPL(phy_get); 426EXPORT_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 */
438struct 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}
447EXPORT_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)
456EXPORT_SYMBOL_GPL(devm_phy_get); 477EXPORT_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 */
492struct 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}
501EXPORT_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