phy: Add devm_of_phy_optional_get() helper
[linux-2.6-microblaze.git] / drivers / phy / phy-core.c
index 672f5c8..9951efc 100644 (file)
@@ -858,6 +858,36 @@ struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
 }
 EXPORT_SYMBOL_GPL(devm_of_phy_get);
 
+/**
+ * devm_of_phy_optional_get() - lookup and obtain a reference to an optional
+ * phy.
+ * @dev: device that requests this phy
+ * @np: node containing the phy
+ * @con_id: name of the phy from device's point of view
+ *
+ * Gets the phy using of_phy_get(), and associates a device with it using
+ * devres. On driver detach, release function is invoked on the devres data,
+ * then, devres data is freed.  This differs to devm_of_phy_get() in
+ * that if the phy does not exist, it is not considered an error and
+ * -ENODEV will not be returned. Instead the NULL phy is returned,
+ * which can be passed to all other phy consumer calls.
+ */
+struct phy *devm_of_phy_optional_get(struct device *dev, struct device_node *np,
+                                    const char *con_id)
+{
+       struct phy *phy = devm_of_phy_get(dev, np, con_id);
+
+       if (PTR_ERR(phy) == -ENODEV)
+               phy = NULL;
+
+       if (IS_ERR(phy))
+               dev_err_probe(dev, PTR_ERR(phy), "failed to get PHY %pOF:%s",
+                             np, con_id);
+
+       return phy;
+}
+EXPORT_SYMBOL_GPL(devm_of_phy_optional_get);
+
 /**
  * devm_of_phy_get_by_index() - lookup and obtain a reference to a phy by index.
  * @dev: device that requests this phy