Commit 3eaeb475 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Mark Brown

regulator: core: optimize devm_regulator_bulk_get()

When performing this bulk operation, there is no need to track every supply
individually. It is more efficient to treat entire group as a single
managed resource.
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b8c77ff6
...@@ -120,6 +120,18 @@ void devm_regulator_put(struct regulator *regulator) ...@@ -120,6 +120,18 @@ void devm_regulator_put(struct regulator *regulator)
} }
EXPORT_SYMBOL_GPL(devm_regulator_put); EXPORT_SYMBOL_GPL(devm_regulator_put);
struct regulator_bulk_devres {
struct regulator_bulk_data *consumers;
int num_consumers;
};
static void devm_regulator_bulk_release(struct device *dev, void *res)
{
struct regulator_bulk_devres *devres = res;
regulator_bulk_free(devres->num_consumers, devres->consumers);
}
/** /**
* devm_regulator_bulk_get - managed get multiple regulator consumers * devm_regulator_bulk_get - managed get multiple regulator consumers
* *
...@@ -138,29 +150,22 @@ EXPORT_SYMBOL_GPL(devm_regulator_put); ...@@ -138,29 +150,22 @@ EXPORT_SYMBOL_GPL(devm_regulator_put);
int devm_regulator_bulk_get(struct device *dev, int num_consumers, int devm_regulator_bulk_get(struct device *dev, int num_consumers,
struct regulator_bulk_data *consumers) struct regulator_bulk_data *consumers)
{ {
int i; struct regulator_bulk_devres *devres;
int ret; int ret;
for (i = 0; i < num_consumers; i++) devres = devres_alloc(devm_regulator_bulk_release,
consumers[i].consumer = NULL; sizeof(*devres), GFP_KERNEL);
if (!devres)
for (i = 0; i < num_consumers; i++) { return -ENOMEM;
consumers[i].consumer = devm_regulator_get(dev,
consumers[i].supply);
if (IS_ERR(consumers[i].consumer)) {
ret = PTR_ERR(consumers[i].consumer);
dev_err(dev, "Failed to get supply '%s': %d\n",
consumers[i].supply, ret);
consumers[i].consumer = NULL;
goto err;
}
}
return 0;
err: ret = regulator_bulk_get(dev, num_consumers, consumers);
for (i = 0; i < num_consumers && consumers[i].consumer; i++) if (!ret) {
devm_regulator_put(consumers[i].consumer); devres->consumers = consumers;
devres->num_consumers = num_consumers;
devres_add(dev, devres);
} else {
devres_free(devres);
}
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment