|
@@ -425,6 +425,27 @@ struct phy *phy_get(struct device *dev, const char *string)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(phy_get);
|
|
|
|
|
|
+/**
|
|
|
+ * phy_optional_get() - lookup and obtain a reference to an optional phy.
|
|
|
+ * @dev: device that requests this phy
|
|
|
+ * @string: the phy name as given in the dt data or the name of the controller
|
|
|
+ * port for non-dt case
|
|
|
+ *
|
|
|
+ * Returns the phy driver, after getting a refcount to it; or
|
|
|
+ * NULL if there is no such phy. The caller is responsible for
|
|
|
+ * calling phy_put() to release that count.
|
|
|
+ */
|
|
|
+struct phy *phy_optional_get(struct device *dev, const char *string)
|
|
|
+{
|
|
|
+ struct phy *phy = phy_get(dev, string);
|
|
|
+
|
|
|
+ if (PTR_ERR(phy) == -ENODEV)
|
|
|
+ phy = NULL;
|
|
|
+
|
|
|
+ return phy;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(phy_optional_get);
|
|
|
+
|
|
|
/**
|
|
|
* devm_phy_get() - lookup and obtain a reference to a phy.
|
|
|
* @dev: device that requests this phy
|
|
@@ -455,6 +476,30 @@ struct phy *devm_phy_get(struct device *dev, const char *string)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(devm_phy_get);
|
|
|
|
|
|
+/**
|
|
|
+ * devm_phy_optional_get() - lookup and obtain a reference to an optional phy.
|
|
|
+ * @dev: device that requests this phy
|
|
|
+ * @string: the phy name as given in the dt data or phy device name
|
|
|
+ * for non-dt case
|
|
|
+ *
|
|
|
+ * Gets the phy using 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_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_phy_optional_get(struct device *dev, const char *string)
|
|
|
+{
|
|
|
+ struct phy *phy = devm_phy_get(dev, string);
|
|
|
+
|
|
|
+ if (PTR_ERR(phy) == -ENODEV)
|
|
|
+ phy = NULL;
|
|
|
+
|
|
|
+ return phy;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(devm_phy_optional_get);
|
|
|
+
|
|
|
/**
|
|
|
* phy_create() - create a new phy
|
|
|
* @dev: device that is creating the new phy
|