]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpiolib: introduce devm_fwnode_gpiod_get_optional() wrapper
authorStefan Kerkmann <s.kerkmann@pengutronix.de>
Mon, 26 Jan 2026 14:27:47 +0000 (15:27 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Tue, 27 Jan 2026 09:13:37 +0000 (10:13 +0100)
The helper makes it easier to handle optional GPIOs and simplifies the
error handling code.

Signed-off-by: Stefan Kerkmann <s.kerkmann@pengutronix.de>
Signed-off-by: Michael Tretter <m.tretter@pengutronix.de>
Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
Link: https://lore.kernel.org/r/20260126-gpio-devm_fwnode_gpiod_get_optional-v2-1-ec34f8e35077@pengutronix.de
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
include/linux/gpio/consumer.h

index cafeb7a40ad1c25aeb7deaf598410d5f2f004a82..0d8408582918680bfea6a04ccedfc0c75211907a 100644 (file)
@@ -607,6 +607,42 @@ struct gpio_desc *devm_fwnode_gpiod_get(struct device *dev,
                                           flags, label);
 }
 
+/**
+ * devm_fwnode_gpiod_get_optional - obtain an optional GPIO from firmware node
+ * @dev:       GPIO consumer
+ * @fwnode:    handle of the firmware node
+ * @con_id:    function within the GPIO consumer
+ * @flags:     GPIO initialization flags
+ * @label:     label to attach to the requested GPIO
+ *
+ * This function can be used for drivers that get their configuration
+ * from opaque firmware.
+ *
+ * GPIO descriptors returned from this function are automatically disposed on
+ * driver detach.
+ *
+ * Returns:
+ * The GPIO descriptor corresponding to the optional function @con_id of device
+ * dev, NULL if no GPIO has been assigned to the requested function, or
+ * another IS_ERR() code if an error occurred while trying to acquire the GPIO.
+ */
+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)
+{
+       struct gpio_desc *desc;
+
+       desc = devm_fwnode_gpiod_get_index(dev, fwnode, con_id, 0,
+                                          flags, label);
+       if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT)
+               return NULL;
+
+       return desc;
+}
+
 struct acpi_gpio_params {
        unsigned int crs_entry_index;
        unsigned short line_index;