|
@@ -525,6 +525,37 @@ struct phy *devm_phy_optional_get(struct device *dev, const char *string)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(devm_phy_optional_get);
|
|
|
|
|
|
+/**
|
|
|
+ * devm_of_phy_get() - lookup and obtain a reference to a 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.
|
|
|
+ */
|
|
|
+struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
|
|
|
+ const char *con_id)
|
|
|
+{
|
|
|
+ struct phy **ptr, *phy;
|
|
|
+
|
|
|
+ ptr = devres_alloc(devm_phy_release, sizeof(*ptr), GFP_KERNEL);
|
|
|
+ if (!ptr)
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
+
|
|
|
+ phy = of_phy_get(np, con_id);
|
|
|
+ if (!IS_ERR(phy)) {
|
|
|
+ *ptr = phy;
|
|
|
+ devres_add(dev, ptr);
|
|
|
+ } else {
|
|
|
+ devres_free(ptr);
|
|
|
+ }
|
|
|
+
|
|
|
+ return phy;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(devm_of_phy_get);
|
|
|
+
|
|
|
/**
|
|
|
* phy_create() - create a new phy
|
|
|
* @dev: device that is creating the new phy
|