All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] regulator: core: Correct type of mode in regulator_mode_constrain
@ 2016-11-29 11:50 Charles Keepax
  2016-11-29 11:50 ` [PATCH v2 2/2] regulator: core: Allow enable GPIO to be specified using GPIOD Charles Keepax
  0 siblings, 1 reply; 2+ messages in thread
From: Charles Keepax @ 2016-11-29 11:50 UTC (permalink / raw)
  To: broonie; +Cc: lgirdwood, linux-kernel, patches

Every function handling the mode within the regulator core uses an unsigned
int for mode, except for regulator_mode_constrain. This patch changes the
type of mode within regulator_mode_constrain which fixes several instances
where we are passing pointers to unsigned ints then treating them as an int
within this function.

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
---

No change since v1.

Thanks,
Charles

 drivers/regulator/core.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index cd864a7..b3417ac 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -293,7 +293,8 @@ static int regulator_check_current_limit(struct regulator_dev *rdev,
 }
 
 /* operating mode constraint check */
-static int regulator_mode_constrain(struct regulator_dev *rdev, int *mode)
+static int regulator_mode_constrain(struct regulator_dev *rdev,
+				    unsigned int *mode)
 {
 	switch (*mode) {
 	case REGULATOR_MODE_FAST:
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [PATCH v2 2/2] regulator: core: Allow enable GPIO to be specified using GPIOD
  2016-11-29 11:50 [PATCH v2 1/2] regulator: core: Correct type of mode in regulator_mode_constrain Charles Keepax
@ 2016-11-29 11:50 ` Charles Keepax
  0 siblings, 0 replies; 2+ messages in thread
From: Charles Keepax @ 2016-11-29 11:50 UTC (permalink / raw)
  To: broonie; +Cc: lgirdwood, linux-kernel, patches

The regulator subsystem has used GPIOs internally for a while, however,
end drivers must still specify their enable GPIO using a GPIO number. This
patch allows the end drivers to specify the enable GPIO using GPIOD
directly.

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
---

Changes since v1:
 - Make a small correction to the error path, where we were calling
   desc_to_gpio on something that might not be zero.

Thanks,
Charles

 drivers/regulator/core.c         | 43 ++++++++++++++++++++++++++--------------
 include/linux/regulator/driver.h | 14 ++++++++-----
 2 files changed, 37 insertions(+), 20 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index b3417ac..9e8def2 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1929,6 +1929,16 @@ void regulator_bulk_unregister_supply_alias(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(regulator_bulk_unregister_supply_alias);
 
+static bool regulator_ena_gpio_valid(const struct regulator_config *config)
+{
+	if (config->ena_gpiod)
+		return true;
+
+	if (config->ena_gpio || config->ena_gpio_initialized)
+		return gpio_is_valid(config->ena_gpio);
+
+	return false;
+}
 
 /* Manage enable GPIO list. Same GPIO pin can be shared among regulators */
 static int regulator_ena_gpio_request(struct regulator_dev *rdev,
@@ -1938,7 +1948,10 @@ static int regulator_ena_gpio_request(struct regulator_dev *rdev,
 	struct gpio_desc *gpiod;
 	int ret;
 
-	gpiod = gpio_to_desc(config->ena_gpio);
+	if (config->ena_gpiod)
+		gpiod = config->ena_gpiod;
+	else
+		gpiod = gpio_to_desc(config->ena_gpio);
 
 	list_for_each_entry(pin, &regulator_ena_gpio_list, list) {
 		if (pin->gpiod == gpiod) {
@@ -1948,16 +1961,20 @@ static int regulator_ena_gpio_request(struct regulator_dev *rdev,
 		}
 	}
 
-	ret = gpio_request_one(config->ena_gpio,
-				GPIOF_DIR_OUT | config->ena_gpio_flags,
-				rdev_get_name(rdev));
-	if (ret)
-		return ret;
-
 	pin = kzalloc(sizeof(struct regulator_enable_gpio), GFP_KERNEL);
-	if (pin == NULL) {
-		gpio_free(config->ena_gpio);
+	if (!pin)
 		return -ENOMEM;
+
+	if (!config->ena_gpiod) {
+		ret = gpio_request_one(config->ena_gpio,
+				       GPIOF_DIR_OUT | config->ena_gpio_flags,
+				       rdev_get_name(rdev));
+		if (ret) {
+			kfree(pin);
+			rdev_err(rdev, "Failed to request enable GPIO%d: %d\n",
+				 config->ena_gpio, ret);
+			return ret;
+		}
 	}
 
 	pin->gpiod = gpiod;
@@ -4027,16 +4044,12 @@ regulator_register(const struct regulator_desc *regulator_desc,
 			goto clean;
 	}
 
-	if ((config->ena_gpio || config->ena_gpio_initialized) &&
-	    gpio_is_valid(config->ena_gpio)) {
+	if (regulator_ena_gpio_valid(config)) {
 		mutex_lock(&regulator_list_mutex);
 		ret = regulator_ena_gpio_request(rdev, config);
 		mutex_unlock(&regulator_list_mutex);
-		if (ret != 0) {
-			rdev_err(rdev, "Failed to request enable GPIO%d: %d\n",
-				 config->ena_gpio, ret);
+		if (ret != 0)
 			goto clean;
-		}
 	}
 
 	/* register with sysfs */
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h
index dac8e7b1..0a3f3a0 100644
--- a/include/linux/regulator/driver.h
+++ b/include/linux/regulator/driver.h
@@ -367,11 +367,13 @@ struct regulator_desc {
  *           NULL).
  * @regmap: regmap to use for core regmap helpers if dev_get_regmap() is
  *          insufficient.
- * @ena_gpio_initialized: GPIO controlling regulator enable was properly
- *                        initialized, meaning that >= 0 is a valid gpio
- *                        identifier and < 0 is a non existent gpio.
- * @ena_gpio: GPIO controlling regulator enable.
+ * @ena_gpiod: GPIO controlling regulator enable.
  * @ena_gpio_invert: Sense for GPIO enable control.
+ * @ena_gpio_initialized: ena_gpio enable was properly initialized,
+ *                        meaning that >= 0 is a valid gpio identifier
+ *                        and < 0 is a non existent gpio.
+ * @ena_gpio: GPIO controlling regulator enable, deprecated in favour of
+ *            ena_gpiod.
  * @ena_gpio_flags: Flags to use when calling gpio_request_one()
  */
 struct regulator_config {
@@ -381,9 +383,11 @@ struct regulator_config {
 	struct device_node *of_node;
 	struct regmap *regmap;
 
+	struct gpio_desc *ena_gpiod;
+	unsigned int ena_gpio_invert:1;
+
 	bool ena_gpio_initialized;
 	int ena_gpio;
-	unsigned int ena_gpio_invert:1;
 	unsigned int ena_gpio_flags;
 };
 
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-11-29 11:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-29 11:50 [PATCH v2 1/2] regulator: core: Correct type of mode in regulator_mode_constrain Charles Keepax
2016-11-29 11:50 ` [PATCH v2 2/2] regulator: core: Allow enable GPIO to be specified using GPIOD Charles Keepax

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.