|
@@ -1421,6 +1421,34 @@ void regulator_put(struct regulator *regulator)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(regulator_put);
|
|
|
|
|
|
+static int devm_regulator_match(struct device *dev, void *res, void *data)
|
|
|
+{
|
|
|
+ struct regulator **r = res;
|
|
|
+ if (!r || !*r) {
|
|
|
+ WARN_ON(!r || !*r);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return *r == data;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * devm_regulator_put - Resource managed regulator_put()
|
|
|
+ * @regulator: regulator to free
|
|
|
+ *
|
|
|
+ * Deallocate a regulator allocated with devm_regulator_get(). Normally
|
|
|
+ * this function will not need to be called and the resource management
|
|
|
+ * code will ensure that the resource is freed.
|
|
|
+ */
|
|
|
+void devm_regulator_put(struct regulator *regulator)
|
|
|
+{
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ rc = devres_destroy(regulator->dev, devm_regulator_release,
|
|
|
+ devm_regulator_match, regulator);
|
|
|
+ WARN_ON(rc);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(devm_regulator_put);
|
|
|
+
|
|
|
static int _regulator_can_change_status(struct regulator_dev *rdev)
|
|
|
{
|
|
|
if (!rdev->constraints)
|