|
@@ -35,6 +35,20 @@ static int devm_gpiod_match(struct device *dev, void *res, void *data)
|
|
|
return *this == *gpio;
|
|
|
}
|
|
|
|
|
|
+static void devm_gpiod_release_array(struct device *dev, void *res)
|
|
|
+{
|
|
|
+ struct gpio_descs **descs = res;
|
|
|
+
|
|
|
+ gpiod_put_array(*descs);
|
|
|
+}
|
|
|
+
|
|
|
+static int devm_gpiod_match_array(struct device *dev, void *res, void *data)
|
|
|
+{
|
|
|
+ struct gpio_descs **this = res, **gpios = data;
|
|
|
+
|
|
|
+ return *this == *gpios;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* devm_gpiod_get - Resource-managed gpiod_get()
|
|
|
* @dev: GPIO consumer
|
|
@@ -185,6 +199,66 @@ struct gpio_desc *__must_check __devm_gpiod_get_index_optional(struct device *de
|
|
|
}
|
|
|
EXPORT_SYMBOL(__devm_gpiod_get_index_optional);
|
|
|
|
|
|
+/**
|
|
|
+ * devm_gpiod_get_array - Resource-managed gpiod_get_array()
|
|
|
+ * @dev: GPIO consumer
|
|
|
+ * @con_id: function within the GPIO consumer
|
|
|
+ * @flags: optional GPIO initialization flags
|
|
|
+ *
|
|
|
+ * Managed gpiod_get_array(). GPIO descriptors returned from this function are
|
|
|
+ * automatically disposed on driver detach. See gpiod_get_array() for detailed
|
|
|
+ * information about behavior and return values.
|
|
|
+ */
|
|
|
+struct gpio_descs *__must_check devm_gpiod_get_array(struct device *dev,
|
|
|
+ const char *con_id,
|
|
|
+ enum gpiod_flags flags)
|
|
|
+{
|
|
|
+ struct gpio_descs **dr;
|
|
|
+ struct gpio_descs *descs;
|
|
|
+
|
|
|
+ dr = devres_alloc(devm_gpiod_release_array,
|
|
|
+ sizeof(struct gpio_descs *), GFP_KERNEL);
|
|
|
+ if (!dr)
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
+
|
|
|
+ descs = gpiod_get_array(dev, con_id, flags);
|
|
|
+ if (IS_ERR(descs)) {
|
|
|
+ devres_free(dr);
|
|
|
+ return descs;
|
|
|
+ }
|
|
|
+
|
|
|
+ *dr = descs;
|
|
|
+ devres_add(dev, dr);
|
|
|
+
|
|
|
+ return descs;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(devm_gpiod_get_array);
|
|
|
+
|
|
|
+/**
|
|
|
+ * devm_gpiod_get_array_optional - Resource-managed gpiod_get_array_optional()
|
|
|
+ * @dev: GPIO consumer
|
|
|
+ * @con_id: function within the GPIO consumer
|
|
|
+ * @flags: optional GPIO initialization flags
|
|
|
+ *
|
|
|
+ * Managed gpiod_get_array_optional(). GPIO descriptors returned from this
|
|
|
+ * function are automatically disposed on driver detach.
|
|
|
+ * See gpiod_get_array_optional() for detailed information about behavior and
|
|
|
+ * return values.
|
|
|
+ */
|
|
|
+struct gpio_descs *__must_check
|
|
|
+devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
|
|
|
+ enum gpiod_flags flags)
|
|
|
+{
|
|
|
+ struct gpio_descs *descs;
|
|
|
+
|
|
|
+ descs = devm_gpiod_get_array(dev, con_id, flags);
|
|
|
+ if (IS_ERR(descs) && (PTR_ERR(descs) == -ENOENT))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ return descs;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(devm_gpiod_get_array_optional);
|
|
|
+
|
|
|
/**
|
|
|
* devm_gpiod_put - Resource-managed gpiod_put()
|
|
|
* @desc: GPIO descriptor to dispose of
|
|
@@ -200,6 +274,21 @@ void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
|
|
|
}
|
|
|
EXPORT_SYMBOL(devm_gpiod_put);
|
|
|
|
|
|
+/**
|
|
|
+ * devm_gpiod_put_array - Resource-managed gpiod_put_array()
|
|
|
+ * @descs: GPIO descriptor array to dispose of
|
|
|
+ *
|
|
|
+ * Dispose of an array of GPIO descriptors obtained with devm_gpiod_get_array().
|
|
|
+ * Normally this function will not be called as the GPIOs will be disposed of
|
|
|
+ * by the resource management code.
|
|
|
+ */
|
|
|
+void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs)
|
|
|
+{
|
|
|
+ WARN_ON(devres_release(dev, devm_gpiod_release_array,
|
|
|
+ devm_gpiod_match_array, &descs));
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(devm_gpiod_put_array);
|
|
|
+
|
|
|
|
|
|
|
|
|
|