gpiolib: add devm_gpiod_get_array and devm_gpiod_put_array functions
Subsystems (2)
PATCH v4 3/4 gpiolib: add devm_gpiod_get_array and devm_gpiod_put_array functions
Add device managed variants of gpiod_get_array() / gpiod_put_array() functions for conveniently obtaining and disposing of an entire array of GPIOs with one function call.
Signed-off-by Rojhalat Ibrahim <[email protected]>
Reviewed-by Alexandre Courbot <[email protected]>
---
Change log:
v4: no change
v3: make the flags argument mandatory for the new functions
v2: add this patch to the set
Documentation/gpio/consumer.txt | 14 ++++++- drivers/gpio/devres.c | 89 +++++++++++++++++++++++++++++++++++++++++ include/linux/gpio/consumer.h | 30 ++++++++++++++ 3 files changed, 131 insertions(+), 2 deletions(-)
Documentation/gpio/consumer.txt +12 -2
@@ -102,11 +102,19 @@ Device-managed variants of these functions are also defined: const char *con_id, enum gpiod_flags flags) - struct gpio_desc * devm_gpiod_get_index_optional(struct device *dev, + struct gpio_desc *devm_gpiod_get_index_optional(struct device *dev, const char *con_id, unsigned int index, enum gpiod_flags flags) + struct gpio_descs *devm_gpiod_get_array(struct device *dev, + const char *con_id, + enum gpiod_flags flags) + + struct gpio_descs *devm_gpiod_get_array_optional(struct device *dev, + const char *con_id, + enum gpiod_flags flags) + A GPIO descriptor can be disposed of using the gpiod_put() function: void gpiod_put(struct gpio_desc *desc)
@@ -119,10 +127,12 @@ It is strictly forbidden to use a descriptor after calling these functions. It is also not allowed to individually release descriptors (using gpiod_put()) from an array acquired with gpiod_get_array(). -The device-managed variant is, unsurprisingly: +The device-managed variants are, unsurprisingly: void devm_gpiod_put(struct device *dev, struct gpio_desc *desc) + void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs) + Using GPIOs ===========
drivers/gpio/devres.c +89 -0
107 lines not on this page · raw message
include/linux/gpio/consumer.h +30 -0
@@ -83,7 +83,14 @@ struct gpio_desc *__must_check __devm_gpiod_get_optional(struct device *dev,struct gpio_desc *__must_check __devm_gpiod_get_index_optional (struct device *dev,const char *con_id,unsigned int index,enum gpiod_flags flags); +struct gpio_descs *__must_check devm_gpiod_get_array (struct device *dev, +const char *con_id, +enum gpiod_flags flags); +struct gpio_descs *__must_check +devm_gpiod_get_array_optional (struct device *dev,const char *con_id, +enum gpiod_flags flags);void devm_gpiod_put (struct device *dev,struct gpio_desc *desc); +void devm_gpiod_put_array (struct device *dev,struct gpio_descs *descs);int gpiod_get_direction (struct gpio_desc *desc);int gpiod_direction_input (struct gpio_desc *desc);
@@ -227,6 +234,20 @@ __devm_gpiod_get_index_optional(struct device *dev, const char *con_id,return ERR_PTR (-ENOSYS ); } +static inline struct gpio_descs *__must_check +devm_gpiod_get_array (struct device *dev,const char *con_id, +enum gpiod_flags flags) +{ +return ERR_PTR (-ENOSYS ); +} + +static inline struct gpio_descs *__must_check +devm_gpiod_get_array_optional (struct device *dev,const char *con_id, +enum gpiod_flags flags) +{ +return ERR_PTR (-ENOSYS ); +} +static inline void devm_gpiod_put (struct device *dev,struct gpio_desc *desc) {might_sleep ();
@@ -235,6 +256,15 @@ static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)WARN_ON (1 ); } +static inline void devm_gpiod_put_array (struct device *dev, +struct gpio_descs *descs) +{ +might_sleep (); + +/* GPIO can never have been requested */ +WARN_ON (1 ); +} +static inline int gpiod_get_direction (const struct gpio_desc *desc) {
Signature · 1 line
2.0.5