Merge tag 'gpio-v4.20-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[sfrench/cifs-2.6.git] / include / linux / gpio / consumer.h
index 21ddbe4400308ee51e8b29fe85acfe08022879ec..f2f887795d43e9ae2cbe8b15be896547dbebbb43 100644 (file)
@@ -17,11 +17,20 @@ struct device;
  */
 struct gpio_desc;
 
+/**
+ * Opaque descriptor for a structure of GPIO array attributes.  This structure
+ * is attached to struct gpiod_descs obtained from gpiod_get_array() and can be
+ * passed back to get/set array functions in order to activate fast processing
+ * path if applicable.
+ */
+struct gpio_array;
+
 /**
  * Struct containing an array of descriptors that can be obtained using
  * gpiod_get_array().
  */
 struct gpio_descs {
+       struct gpio_array *info;
        unsigned int ndescs;
        struct gpio_desc *desc[];
 };
@@ -30,6 +39,7 @@ struct gpio_descs {
 #define GPIOD_FLAGS_BIT_DIR_OUT                BIT(1)
 #define GPIOD_FLAGS_BIT_DIR_VAL                BIT(2)
 #define GPIOD_FLAGS_BIT_OPEN_DRAIN     BIT(3)
+#define GPIOD_FLAGS_BIT_NONEXCLUSIVE   BIT(4)
 
 /**
  * Optional flags that can be passed to one of gpiod_* to configure direction
@@ -104,36 +114,46 @@ int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
 /* Value get/set from non-sleeping context */
 int gpiod_get_value(const struct gpio_desc *desc);
 int gpiod_get_array_value(unsigned int array_size,
-                         struct gpio_desc **desc_array, int *value_array);
+                         struct gpio_desc **desc_array,
+                         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, int *value_array);
+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,
-                             int *value_array);
+                             struct gpio_array *array_info,
+                             unsigned long *value_bitmap);
 void gpiod_set_raw_value(struct gpio_desc *desc, int value);
 int gpiod_set_raw_array_value(unsigned int array_size,
-                              struct gpio_desc **desc_array,
-                              int *value_array);
+                             struct gpio_desc **desc_array,
+                             struct gpio_array *array_info,
+                             unsigned long *value_bitmap);
 
 /* Value get/set from sleeping context */
 int gpiod_get_value_cansleep(const struct gpio_desc *desc);
 int gpiod_get_array_value_cansleep(unsigned int array_size,
                                   struct gpio_desc **desc_array,
-                                  int *value_array);
+                                  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,
-                                   int *value_array);
+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,
-                                      int *value_array);
+                                      struct gpio_array *array_info,
+                                      unsigned long *value_bitmap);
 void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value);
 int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
-                                       struct gpio_desc **desc_array,
-                                       int *value_array);
+                                      struct gpio_desc **desc_array,
+                                      struct gpio_array *array_info,
+                                      unsigned long *value_bitmap);
 
 int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
 int gpiod_set_transitory(struct gpio_desc *desc, bool transitory);
@@ -330,7 +350,8 @@ static inline int gpiod_get_value(const struct gpio_desc *desc)
 }
 static inline int gpiod_get_array_value(unsigned int array_size,
                                        struct gpio_desc **desc_array,
-                                       int *value_array)
+                                       struct gpio_array *array_info,
+                                       unsigned long *value_bitmap)
 {
        /* GPIO can never have been requested */
        WARN_ON(1);
@@ -341,12 +362,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,
-                                        int *value_array)
+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)
 {
@@ -356,7 +379,8 @@ static inline int gpiod_get_raw_value(const struct gpio_desc *desc)
 }
 static inline int gpiod_get_raw_array_value(unsigned int array_size,
                                            struct gpio_desc **desc_array,
-                                           int *value_array)
+                                           struct gpio_array *array_info,
+                                           unsigned long *value_bitmap)
 {
        /* GPIO can never have been requested */
        WARN_ON(1);
@@ -368,8 +392,9 @@ static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value)
        WARN_ON(1);
 }
 static inline int gpiod_set_raw_array_value(unsigned int array_size,
-                                            struct gpio_desc **desc_array,
-                                            int *value_array)
+                                           struct gpio_desc **desc_array,
+                                           struct gpio_array *array_info,
+                                           unsigned long *value_bitmap)
 {
        /* GPIO can never have been requested */
        WARN_ON(1);
@@ -384,7 +409,8 @@ static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc)
 }
 static inline int gpiod_get_array_value_cansleep(unsigned int array_size,
                                     struct gpio_desc **desc_array,
-                                    int *value_array)
+                                    struct gpio_array *array_info,
+                                    unsigned long *value_bitmap)
 {
        /* GPIO can never have been requested */
        WARN_ON(1);
@@ -395,12 +421,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,
-                                           int *value_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)
 {
@@ -410,7 +438,8 @@ static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
 }
 static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
                                               struct gpio_desc **desc_array,
-                                              int *value_array)
+                                              struct gpio_array *array_info,
+                                              unsigned long *value_bitmap)
 {
        /* GPIO can never have been requested */
        WARN_ON(1);
@@ -424,7 +453,8 @@ static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc,
 }
 static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
                                                struct gpio_desc **desc_array,
-                                               int *value_array)
+                                               struct gpio_array *array_info,
+                                               unsigned long *value_bitmap)
 {
        /* GPIO can never have been requested */
        WARN_ON(1);