All of lore.kernel.org
 help / color / mirror / Atom feed
From: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
To: <broonie@kernel.org>
Cc: <lgirdwood@gmail.com>, <linux-kernel@vger.kernel.org>,
	<patches@opensource.wolfsonmicro.com>
Subject: [PATCH 2/2] regulator: core: Allow enable GPIO to be specified using GPIOD
Date: Tue, 29 Nov 2016 11:30:45 +0000	[thread overview]
Message-ID: <1480419045-2275-2-git-send-email-ckeepax@opensource.wolfsonmicro.com> (raw)
In-Reply-To: <1480419045-2275-1-git-send-email-ckeepax@opensource.wolfsonmicro.com>

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>
---
 drivers/regulator/core.c         | 38 ++++++++++++++++++++++++++------------
 include/linux/regulator/driver.h | 14 +++++++++-----
 2 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index b3417ac..48f2813 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,18 @@ 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);
+			return ret;
+		}
 	}
 
 	pin->gpiod = gpiod;
@@ -4027,14 +4042,13 @@ 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);
+				 desc_to_gpio(config->ena_gpiod), ret);
 			goto clean;
 		}
 	}
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

  reply	other threads:[~2016-11-29 11:30 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-29 11:30 [PATCH 1/2] regulator: core: Correct type of mode in regulator_mode_constrain Charles Keepax
2016-11-29 11:30 ` Charles Keepax [this message]
2016-11-29 11:38   ` [PATCH 2/2] regulator: core: Allow enable GPIO to be specified using GPIOD Charles Keepax
2016-11-29 11:45   ` Mark Brown
2016-11-29 11:53     ` Charles Keepax
2016-11-30 18:07 ` Applied "regulator: core: Correct type of mode in regulator_mode_constrain" to the regulator tree Mark Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1480419045-2275-2-git-send-email-ckeepax@opensource.wolfsonmicro.com \
    --to=ckeepax@opensource.wolfsonmicro.com \
    --cc=broonie@kernel.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=patches@opensource.wolfsonmicro.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.