aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArun Ramamurthy <arun.ramamurthy@broadcom.com>2015-04-22 19:04:11 -0400
committerKishon Vijay Abraham I <kishon@ti.com>2015-05-11 12:12:23 -0400
commit6be109b31ccdb9c98e7be12687171f6602527a5d (patch)
tree8c2ad5df0fea49ca066cc18c7edff9087d4befeb
parent2decb2682f80759f631c8332f9a2a34a02150a03 (diff)
phy: core: Add devm_of_phy_get_by_index to phy-core
Some generic drivers, such as ehci, may use multiple phys and for such drivers referencing phy(s) by name(s) does not make sense. Instead of inventing new naming schemes and using custom code to iterate through them, such drivers are better of using nameless phy bindings and using this newly introduced API to iterate through them. Signed-off-by: Arun Ramamurthy <arun.ramamurthy@broadcom.com> Reviewed-by: Ray Jui <rjui@broadcom.com> Reviewed-by: Scott Branden <sbranden@broadcom.com> [kishon@ti.com: fix compilation errors] Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
-rw-r--r--Documentation/phy.txt7
-rw-r--r--drivers/phy/phy-core.c32
-rw-r--r--include/linux/phy/phy.h9
3 files changed, 47 insertions, 1 deletions
diff --git a/Documentation/phy.txt b/Documentation/phy.txt
index 371361c69a4b..b388c5af9e72 100644
--- a/Documentation/phy.txt
+++ b/Documentation/phy.txt
@@ -76,6 +76,8 @@ struct phy *phy_get(struct device *dev, const char *string);
76struct phy *phy_optional_get(struct device *dev, const char *string); 76struct phy *phy_optional_get(struct device *dev, const char *string);
77struct phy *devm_phy_get(struct device *dev, const char *string); 77struct phy *devm_phy_get(struct device *dev, const char *string);
78struct phy *devm_phy_optional_get(struct device *dev, const char *string); 78struct phy *devm_phy_optional_get(struct device *dev, const char *string);
79struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
80 int index);
79 81
80phy_get, phy_optional_get, devm_phy_get and devm_phy_optional_get can 82phy_get, phy_optional_get, devm_phy_get and devm_phy_optional_get can
81be used to get the PHY. In the case of dt boot, the string arguments 83be used to get the PHY. In the case of dt boot, the string arguments
@@ -86,7 +88,10 @@ successful PHY get. On driver detach, release function is invoked on
86the the devres data and devres data is freed. phy_optional_get and 88the the devres data and devres data is freed. phy_optional_get and
87devm_phy_optional_get should be used when the phy is optional. These 89devm_phy_optional_get should be used when the phy is optional. These
88two functions will never return -ENODEV, but instead returns NULL when 90two functions will never return -ENODEV, but instead returns NULL when
89the phy cannot be found. 91the phy cannot be found.Some generic drivers, such as ehci, may use multiple
92phys and for such drivers referencing phy(s) by name(s) does not make sense. In
93this case, devm_of_phy_get_by_index can be used to get a phy reference based on
94the index.
90 95
91It should be noted that NULL is a valid phy reference. All phy 96It should be noted that NULL is a valid phy reference. All phy
92consumer calls on the NULL phy become NOPs. That is the release calls, 97consumer calls on the NULL phy become NOPs. That is the release calls,
diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c
index 3791838f4bd4..964a84d5a580 100644
--- a/drivers/phy/phy-core.c
+++ b/drivers/phy/phy-core.c
@@ -623,6 +623,38 @@ struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
623EXPORT_SYMBOL_GPL(devm_of_phy_get); 623EXPORT_SYMBOL_GPL(devm_of_phy_get);
624 624
625/** 625/**
626 * devm_of_phy_get_by_index() - lookup and obtain a reference to a phy by index.
627 * @dev: device that requests this phy
628 * @np: node containing the phy
629 * @index: index of the phy
630 *
631 * Gets the phy using _of_phy_get(), and associates a device with it using
632 * devres. On driver detach, release function is invoked on the devres data,
633 * then, devres data is freed.
634 *
635 */
636struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
637 int index)
638{
639 struct phy **ptr, *phy;
640
641 ptr = devres_alloc(devm_phy_release, sizeof(*ptr), GFP_KERNEL);
642 if (!ptr)
643 return ERR_PTR(-ENOMEM);
644
645 phy = _of_phy_get(np, index);
646 if (!IS_ERR(phy)) {
647 *ptr = phy;
648 devres_add(dev, ptr);
649 } else {
650 devres_free(ptr);
651 }
652
653 return phy;
654}
655EXPORT_SYMBOL_GPL(devm_of_phy_get_by_index);
656
657/**
626 * phy_create() - create a new phy 658 * phy_create() - create a new phy
627 * @dev: device that is creating the new phy 659 * @dev: device that is creating the new phy
628 * @node: device node of the phy 660 * @node: device node of the phy
diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h
index a0197fa1b116..8cf05e341cff 100644
--- a/include/linux/phy/phy.h
+++ b/include/linux/phy/phy.h
@@ -133,6 +133,8 @@ struct phy *devm_phy_get(struct device *dev, const char *string);
133struct phy *devm_phy_optional_get(struct device *dev, const char *string); 133struct phy *devm_phy_optional_get(struct device *dev, const char *string);
134struct phy *devm_of_phy_get(struct device *dev, struct device_node *np, 134struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
135 const char *con_id); 135 const char *con_id);
136struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
137 int index);
136void phy_put(struct phy *phy); 138void phy_put(struct phy *phy);
137void devm_phy_put(struct device *dev, struct phy *phy); 139void devm_phy_put(struct device *dev, struct phy *phy);
138struct phy *of_phy_get(struct device_node *np, const char *con_id); 140struct phy *of_phy_get(struct device_node *np, const char *con_id);
@@ -261,6 +263,13 @@ static inline struct phy *devm_of_phy_get(struct device *dev,
261 return ERR_PTR(-ENOSYS); 263 return ERR_PTR(-ENOSYS);
262} 264}
263 265
266static inline struct phy *devm_of_phy_get_by_index(struct device *dev,
267 struct device_node *np,
268 int index)
269{
270 return ERR_PTR(-ENOSYS);
271}
272
264static inline void phy_put(struct phy *phy) 273static inline void phy_put(struct phy *phy)
265{ 274{
266} 275}