All of lore.kernel.org
 help / color / mirror / Atom feed
From: Krzysztof Kozlowski <krzk@kernel.org>
To: Linus Walleij <linus.walleij@linaro.org>,
	Bartosz Golaszewski <bgolaszewski@baylibre.com>,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Hans de Goede <hdegoede@redhat.com>,
	Bastien Nocera <hadess@hadess.net>,
	Sangwon Jee <jeesw@melfas.com>,
	Eugen Hristev <eugen.hristev@microchip.com>,
	Andy Shevchenko <andy.shevchenko@gmail.com>,
	linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-input@vger.kernel.org, platform-driver-x86@vger.kernel.org,
	clang-built-linux@googlegroups.com
Cc: Krzysztof Kozlowski <krzk@kernel.org>
Subject: [PATCH v3 24/27] gpio: Add devm_fwnode_gpiod_get_optional() helpers
Date: Thu, 27 Aug 2020 20:58:26 +0200	[thread overview]
Message-ID: <20200827185829.30096-25-krzk@kernel.org> (raw)
In-Reply-To: <20200827185829.30096-1-krzk@kernel.org>

Add devm_fwnode_gpiod_get_optional() and
devm_fwnode_gpiod_get_index_optional() helpers, similar to regular
devm_gpiod optional versions.  Drivers getting GPIOs from a firmware
node might use it to remove some boilerplate code.

Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>

---

Changes since v2:
1. Return NULL

Changes since v1:
1. New patch
---
 drivers/gpio/gpiolib-devres.c | 71 +++++++++++++++++++++++++++++++++++
 include/linux/gpio/consumer.h | 30 +++++++++++++++
 2 files changed, 101 insertions(+)

diff --git a/drivers/gpio/gpiolib-devres.c b/drivers/gpio/gpiolib-devres.c
index 7dbce4c4ebdf..f8476f6a65cc 100644
--- a/drivers/gpio/gpiolib-devres.c
+++ b/drivers/gpio/gpiolib-devres.c
@@ -184,6 +184,37 @@ struct gpio_desc *devm_gpiod_get_from_of_node(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_gpiod_get_from_of_node);
 
+/**
+ * devm_fwnode_gpiod_get_optional - Resource-managed fwnode_gpiod_get_index()
+ *                                  for optional GPIO
+ * @dev:	GPIO consumer
+ * @fwnode:	firmware node containing GPIO reference
+ * @con_id:	function within the GPIO consumer
+ * @flags:	GPIO initialization flags
+ * @label:	label to attach to the requested GPIO
+ *
+ * GPIO descriptors returned from this function are automatically disposed on
+ * driver detach.
+ *
+ * This is equivalent to devm_fwnode_gpiod_get_index(), except that when no
+ * GPIO with the specified index was assigned to the requested function it will
+ * return NULL.  This is convenient for drivers that need to handle optional
+ * GPIOs.
+ *
+ * On successful request the GPIO pin is configured in accordance with
+ * provided @flags.
+ */
+struct gpio_desc *devm_fwnode_gpiod_get_optional(struct device *dev,
+						 struct fwnode_handle *fwnode,
+						 const char *con_id,
+						 enum gpiod_flags flags,
+						 const char *label)
+{
+	return devm_fwnode_gpiod_get_index_optional(dev, fwnode, con_id, 0,
+						    flags, label);
+}
+EXPORT_SYMBOL_GPL(devm_fwnode_gpiod_get_optional);
+
 /**
  * devm_fwnode_gpiod_get_index - get a GPIO descriptor from a given node
  * @dev:	GPIO consumer
@@ -226,6 +257,46 @@ struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_fwnode_gpiod_get_index);
 
+/**
+ * devm_fwnode_gpiod_get_index_optional - Resource-managed fwnode_gpiod_get_index()
+ *                                        for optional GPIO
+ * @dev:	GPIO consumer
+ * @fwnode:	firmware node containing GPIO reference
+ * @con_id:	function within the GPIO consumer
+ * @index:	index of the GPIO to obtain in the consumer
+ * @flags:	GPIO initialization flags
+ * @label:	label to attach to the requested GPIO
+ *
+ * GPIO descriptors returned from this function are automatically disposed on
+ * driver detach.
+ *
+ * This is equivalent to devm_fwnode_gpiod_get_index(), except that when no
+ * GPIO with the specified index was assigned to the requested function it will
+ * return NULL.  This is convenient for drivers that need to handle optional
+ * GPIOs.
+ *
+ * On successful request the GPIO pin is configured in accordance with
+ * provided @flags.
+ */
+struct gpio_desc *devm_fwnode_gpiod_get_index_optional(struct device *dev,
+						       struct fwnode_handle *fwnode,
+						       const char *con_id, int index,
+						       enum gpiod_flags flags,
+						       const char *label)
+{
+	struct gpio_desc *desc;
+
+	desc = devm_fwnode_gpiod_get_index(dev, fwnode, con_id, index, flags,
+					   label);
+	if (IS_ERR(desc)) {
+		if (PTR_ERR(desc) == -ENOENT)
+			return NULL;
+	}
+
+	return desc;
+}
+EXPORT_SYMBOL_GPL(devm_fwnode_gpiod_get_index_optional);
+
 /**
  * devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional()
  * @dev: GPIO consumer
diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h
index 901aab89d025..7854d80b1e9a 100644
--- a/include/linux/gpio/consumer.h
+++ b/include/linux/gpio/consumer.h
@@ -183,11 +183,21 @@ struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
 					 const char *con_id, int index,
 					 enum gpiod_flags flags,
 					 const char *label);
+struct gpio_desc *devm_fwnode_gpiod_get_optional(struct device *dev,
+						 struct fwnode_handle *fwnode,
+						 const char *con_id,
+						 enum gpiod_flags flags,
+						 const char *label);
 struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 					      struct fwnode_handle *child,
 					      const char *con_id, int index,
 					      enum gpiod_flags flags,
 					      const char *label);
+struct gpio_desc *devm_fwnode_gpiod_get_index_optional(struct device *dev,
+						       struct fwnode_handle *fwnode,
+						       const char *con_id, int index,
+						       enum gpiod_flags flags,
+						       const char *label);
 
 #else /* CONFIG_GPIOLIB */
 
@@ -562,6 +572,16 @@ struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
 	return ERR_PTR(-ENOSYS);
 }
 
+static inline
+struct gpio_desc *devm_fwnode_gpiod_get_optional(struct device *dev,
+						 struct fwnode_handle *fwnode,
+						 const char *con_id,
+						 enum gpiod_flags flags,
+						 const char *label)
+{
+	return NULL;
+}
+
 static inline
 struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 					      struct fwnode_handle *fwnode,
@@ -572,6 +592,16 @@ struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 	return ERR_PTR(-ENOSYS);
 }
 
+static inline
+struct gpio_desc *devm_fwnode_gpiod_get_index_optional(struct device *dev,
+						       struct fwnode_handle *fwnode,
+						       const char *con_id, int index,
+						       enum gpiod_flags flags,
+						       const char *label)
+{
+	return NULL;
+}
+
 #endif /* CONFIG_GPIOLIB */
 
 static inline
-- 
2.17.1


  parent reply	other threads:[~2020-08-27 19:00 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-27 18:58 [PATCH v3 01/27] Input: Simplify with dev_err_probe() Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 01/27] Input: gpio_keys_polled - " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 02/27] Input: gpio-vibra " Krzysztof Kozlowski
2020-08-27 19:36   ` Andy Shevchenko
2020-08-27 18:58 ` [PATCH v3 03/27] Input: pwm-beeper " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 04/27] Input: pwm-vibra " Krzysztof Kozlowski
2020-08-27 19:39   ` Andy Shevchenko
2020-08-27 18:58 ` [PATCH v3 05/27] Input: rotary_encoder " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 06/27] Input: elan_i2c " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 07/27] Input: bu21013_ts " Krzysztof Kozlowski
2020-08-27 19:39   ` Andy Shevchenko
2020-08-28 14:29   ` Linus Walleij
2020-08-27 18:58 ` [PATCH v3 08/27] Input: bu21029_ts " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 09/27] Input: chipone_icn8318 " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 10/27] Input: cy8ctma140 " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 11/27] Input: edf-ft5x06 " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 12/27] Input: ektf2127 " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 13/27] Input: elants_i2c " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 14/27] Input: goodix " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 15/27] Input: melfas_mip4 " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 16/27] Input: pixcir_i2c_ts " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 17/27] Input: raydium_i2c_ts " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 18/27] Input: resistive-adc-touch " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 19/27] Input: silead " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 20/27] Input: sis_i2c " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 21/27] Input: surface3_spi " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 22/27] Input: sx8643 " Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 23/27] Input: bcm-keypad " Krzysztof Kozlowski
2020-08-27 18:58 ` Krzysztof Kozlowski [this message]
2020-08-28 14:31   ` [PATCH v3 24/27] gpio: Add devm_fwnode_gpiod_get_optional() helpers Linus Walleij
2020-08-28 14:45     ` Krzysztof Kozlowski
2020-08-28 14:56       ` Andy Shevchenko
2020-08-27 18:58 ` [PATCH v3 25/27] Input: gpio_keys - Simplify with dev_err_probe() Krzysztof Kozlowski
2020-08-27 18:58 ` [PATCH v3 26/27] Input: bu21013_ts - Use local 'client->dev' variable in probe() Krzysztof Kozlowski
2020-08-27 19:43   ` Andy Shevchenko
2020-08-27 19:47   ` [PATCH v3.1] " Krzysztof Kozlowski
2020-08-28 14:32   ` [PATCH v3 26/27] " Linus Walleij
2020-08-27 18:58 ` [PATCH v3 27/27] Input: bu21029_ts " Krzysztof Kozlowski
2020-08-27 19:44   ` Andy Shevchenko
2020-10-02 16:23 ` [PATCH v3 01/27] Input: Simplify with dev_err_probe() Krzysztof Kozlowski
2021-09-16 19:40   ` Krzysztof Kozlowski

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=20200827185829.30096-25-krzk@kernel.org \
    --to=krzk@kernel.org \
    --cc=andy.shevchenko@gmail.com \
    --cc=bgolaszewski@baylibre.com \
    --cc=clang-built-linux@googlegroups.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=eugen.hristev@microchip.com \
    --cc=hadess@hadess.net \
    --cc=hdegoede@redhat.com \
    --cc=jeesw@melfas.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=platform-driver-x86@vger.kernel.org \
    /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.