summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2012-01-20 20:09:18 +0000
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-01-22 16:15:38 +0000
commitd5ad34f7cb8b23ab165cabef69577a2a20d53195 (patch)
treee0eae78454ba62185c8732e256469bc186ae6438 /drivers
parent070b9079226d4f3e3e7c9f4eb81f2e02e7d99572 (diff)
downloadlinux-stable-d5ad34f7cb8b23ab165cabef69577a2a20d53195.tar.gz
linux-stable-d5ad34f7cb8b23ab165cabef69577a2a20d53195.tar.bz2
linux-stable-d5ad34f7cb8b23ab165cabef69577a2a20d53195.zip
regulator: Implement devm_regulator_free()
Allow consumers to free regulators allocated using devm_regulator_get() if they need to. This will not normally be required. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/regulator/core.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 214640db084b..88bcb111ca68 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -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)