regulator: Add regulator_bulk_set_voltage
Add a convenience API to set the voltage on multiple consumers
stored in a struct regulator_bulk_data[] in one API call.
Signed-off-by: Justin Paupore <jpaupore@codeaurora.org>
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index d4d055d..5b2328d 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -2433,6 +2433,42 @@
EXPORT_SYMBOL_GPL(regulator_bulk_enable);
/**
+ * regulator_bulk_set_voltage - set voltage for multiple regulator consumers
+ *
+ * @num_consumers: Number of consumers
+ * @consumers: Consumer data; clients are stored here.
+ * @return 0 on success, an errno on failure
+ *
+ * This convenience API allows the voted voltage ranges of multiple regulator
+ * clients to be set in a single API call. If any consumers cannot have their
+ * voltages set, this function returns WITHOUT withdrawing votes for any
+ * consumers that have already been set.
+ */
+int regulator_bulk_set_voltage(int num_consumers,
+ struct regulator_bulk_data *consumers)
+{
+ int i;
+ int rc;
+
+ for (i = 0; i < num_consumers; i++) {
+ if (!consumers[i].min_uV && !consumers[i].max_uV)
+ continue;
+ rc = regulator_set_voltage(consumers[i].consumer,
+ consumers[i].min_uV,
+ consumers[i].max_uV);
+ if (rc)
+ goto err;
+ }
+
+ return 0;
+
+err:
+ pr_err("Failed to set voltage for %s: %d\n", consumers[i].supply, rc);
+ return rc;
+}
+EXPORT_SYMBOL_GPL(regulator_bulk_set_voltage);
+
+/**
* regulator_bulk_disable - disable multiple regulator consumers
*
* @num_consumers: Number of consumers
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
index d210407..fb5d4e4 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -114,6 +114,10 @@
* using the bulk regulator APIs.
* @consumer: The regulator consumer for the supply. This will be managed
* by the bulk API.
+ * @min_uV: The minimum requested voltage for the regulator (in microvolts),
+ * or 0 to not set a voltage.
+ * @max_uV: The maximum requested voltage for the regulator (in microvolts),
+ * or 0 to use @min_uV.
*
* The regulator APIs provide a series of regulator_bulk_() API calls as
* a convenience to consumers which require multiple supplies. This
@@ -122,6 +126,8 @@
struct regulator_bulk_data {
const char *supply;
struct regulator *consumer;
+ int min_uV;
+ int max_uV;
};
#if defined(CONFIG_REGULATOR)
@@ -143,6 +149,8 @@
struct regulator_bulk_data *consumers);
int regulator_bulk_enable(int num_consumers,
struct regulator_bulk_data *consumers);
+int regulator_bulk_set_voltage(int num_consumers,
+ struct regulator_bulk_data *consumers);
int regulator_bulk_disable(int num_consumers,
struct regulator_bulk_data *consumers);
void regulator_bulk_free(int num_consumers,