gpio: Propagate errors from gpiod_set_array_value_complex()
authorGeert Uytterhoeven <geert+renesas@glider.be>
Thu, 27 Sep 2018 11:38:09 +0000 (13:38 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 1 Oct 2018 10:22:15 +0000 (12:22 +0200)
Internal helper function gpiod_set_array_value_complex() was changed to
return an error value, but not all gpiolib callers were updated to
propagate the new error up.

Fixes: 3027743f83f867d8 ("gpio: Remove VLA from gpiolib")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Documentation/driver-api/gpio/consumer.rst
drivers/gpio/gpiolib.c
include/linux/gpio/consumer.h

index ba49738..5e4d8aa 100644 (file)
@@ -340,18 +340,18 @@ The following functions get or set the values of an array of GPIOs::
                                           struct gpio_array *array_info,
                                           unsigned long *value_bitmap);
 
-       void gpiod_set_array_value(unsigned int array_size,
-                                  struct gpio_desc **desc_array,
-                                  struct gpio_array *array_info,
-                                  unsigned long *value_bitmap)
+       int gpiod_set_array_value(unsigned int array_size,
+                                 struct gpio_desc **desc_array,
+                                 struct gpio_array *array_info,
+                                 unsigned long *value_bitmap)
        int gpiod_set_raw_array_value(unsigned int array_size,
                                      struct gpio_desc **desc_array,
                                      struct gpio_array *array_info,
                                      unsigned long *value_bitmap)
-       void gpiod_set_array_value_cansleep(unsigned int array_size,
-                                           struct gpio_desc **desc_array,
-                                           struct gpio_array *array_info,
-                                           unsigned long *value_bitmap)
+       int gpiod_set_array_value_cansleep(unsigned int array_size,
+                                          struct gpio_desc **desc_array,
+                                          struct gpio_array *array_info,
+                                          unsigned long *value_bitmap)
        int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
                                               struct gpio_desc **desc_array,
                                               struct gpio_array *array_info,
index a293f14..51dd9d6 100644 (file)
@@ -3346,15 +3346,16 @@ EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value);
  * This function should be called from contexts where we cannot sleep, and will
  * complain if the GPIO chip functions potentially sleep.
  */
-void gpiod_set_array_value(unsigned int array_size,
-                          struct gpio_desc **desc_array,
-                          struct gpio_array *array_info,
-                          unsigned long *value_bitmap)
+int gpiod_set_array_value(unsigned int array_size,
+                         struct gpio_desc **desc_array,
+                         struct gpio_array *array_info,
+                         unsigned long *value_bitmap)
 {
        if (!desc_array)
-               return;
-       gpiod_set_array_value_complex(false, false, array_size, desc_array,
-                                     array_info, value_bitmap);
+               return -EINVAL;
+       return gpiod_set_array_value_complex(false, false, array_size,
+                                            desc_array, array_info,
+                                            value_bitmap);
 }
 EXPORT_SYMBOL_GPL(gpiod_set_array_value);
 
@@ -3763,16 +3764,17 @@ void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n)
  *
  * This function is to be called from contexts that can sleep.
  */
-void gpiod_set_array_value_cansleep(unsigned int array_size,
-                                   struct gpio_desc **desc_array,
-                                   struct gpio_array *array_info,
-                                   unsigned long *value_bitmap)
+int gpiod_set_array_value_cansleep(unsigned int array_size,
+                                  struct gpio_desc **desc_array,
+                                  struct gpio_array *array_info,
+                                  unsigned long *value_bitmap)
 {
        might_sleep_if(extra_checks);
        if (!desc_array)
-               return;
-       gpiod_set_array_value_complex(false, true, array_size, desc_array,
-                                     array_info, value_bitmap);
+               return -EINVAL;
+       return gpiod_set_array_value_complex(false, true, array_size,
+                                            desc_array, array_info,
+                                            value_bitmap);
 }
 EXPORT_SYMBOL_GPL(gpiod_set_array_value_cansleep);
 
index d7fbe30..136aeca 100644 (file)
@@ -117,10 +117,10 @@ int gpiod_get_array_value(unsigned int array_size,
                          struct gpio_array *array_info,
                          unsigned long *value_bitmap);
 void gpiod_set_value(struct gpio_desc *desc, int value);
-void gpiod_set_array_value(unsigned int array_size,
-                          struct gpio_desc **desc_array,
-                          struct gpio_array *array_info,
-                          unsigned long *value_bitmap);
+int gpiod_set_array_value(unsigned int array_size,
+                         struct gpio_desc **desc_array,
+                         struct gpio_array *array_info,
+                         unsigned long *value_bitmap);
 int gpiod_get_raw_value(const struct gpio_desc *desc);
 int gpiod_get_raw_array_value(unsigned int array_size,
                              struct gpio_desc **desc_array,
@@ -139,10 +139,10 @@ int gpiod_get_array_value_cansleep(unsigned int array_size,
                                   struct gpio_array *array_info,
                                   unsigned long *value_bitmap);
 void gpiod_set_value_cansleep(struct gpio_desc *desc, int value);
-void gpiod_set_array_value_cansleep(unsigned int array_size,
-                                   struct gpio_desc **desc_array,
-                                   struct gpio_array *array_info,
-                                   unsigned long *value_bitmap);
+int gpiod_set_array_value_cansleep(unsigned int array_size,
+                                  struct gpio_desc **desc_array,
+                                  struct gpio_array *array_info,
+                                  unsigned long *value_bitmap);
 int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc);
 int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
                                       struct gpio_desc **desc_array,
@@ -361,13 +361,14 @@ static inline void gpiod_set_value(struct gpio_desc *desc, int value)
        /* GPIO can never have been requested */
        WARN_ON(1);
 }
-static inline void gpiod_set_array_value(unsigned int array_size,
-                                        struct gpio_desc **desc_array,
-                                        struct gpio_array *array_info,
-                                        unsigned long *value_bitmap)
+static inline int gpiod_set_array_value(unsigned int array_size,
+                                       struct gpio_desc **desc_array,
+                                       struct gpio_array *array_info,
+                                       unsigned long *value_bitmap)
 {
        /* GPIO can never have been requested */
        WARN_ON(1);
+       return 0;
 }
 static inline int gpiod_get_raw_value(const struct gpio_desc *desc)
 {
@@ -419,13 +420,14 @@ static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
        /* GPIO can never have been requested */
        WARN_ON(1);
 }
-static inline void gpiod_set_array_value_cansleep(unsigned int array_size,
+static inline int gpiod_set_array_value_cansleep(unsigned int array_size,
                                            struct gpio_desc **desc_array,
                                            struct gpio_array *array_info,
                                            unsigned long *value_bitmap)
 {
        /* GPIO can never have been requested */
        WARN_ON(1);
+       return 0;
 }
 static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
 {