These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / include / linux / gpio / driver.h
index f1b3659..d1baebf 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/irq.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/irqdomain.h>
+#include <linux/lockdep.h>
 #include <linux/pinctrl/pinctrl.h>
 
 struct device;
@@ -20,6 +21,7 @@ struct seq_file;
  * struct gpio_chip - abstract a GPIO controller
  * @label: for diagnostics
  * @dev: optional device providing the GPIOs
+ * @cdev: class device used by sysfs interface (may be NULL)
  * @owner: helps prevent removal of modules exporting active GPIOs
  * @list: links gpio_chips together for traversal
  * @request: optional hook for chip-specific activation, such as
@@ -41,8 +43,12 @@ struct seq_file;
  * @dbg_show: optional routine to show contents in debugfs; default code
  *     will be used when this is omitted, but custom code can show extra
  *     state (such as pullup/pulldown configuration).
- * @base: identifies the first GPIO number handled by this chip; or, if
- *     negative during registration, requests dynamic ID allocation.
+ * @base: identifies the first GPIO number handled by this chip;
+ *     or, if negative during registration, requests dynamic ID allocation.
+ *     DEPRECATION: providing anything non-negative and nailing the base
+ *     offset of GPIO chips is deprecated. Please pass -1 as base to
+ *     let gpiolib select the chip base in all possible cases. We want to
+ *     get rid of the static GPIO number space in the long run.
  * @ngpio: the number of GPIOs handled by this controller; the last GPIO
  *     handled is (base + ngpio - 1).
  * @desc: array of ngpio descriptors. Private.
@@ -57,9 +63,19 @@ struct seq_file;
  *     implies that if the chip supports IRQs, these IRQs need to be threaded
  *     as the chip access may sleep when e.g. reading out the IRQ status
  *     registers.
- * @exported: flags if the gpiochip is exported for use from sysfs. Private.
  * @irq_not_threaded: flag must be set if @can_sleep is set but the
  *     IRQs don't need to be threaded
+ * @irqchip: GPIO IRQ chip impl, provided by GPIO driver
+ * @irqdomain: Interrupt translation domain; responsible for mapping
+ *     between GPIO hwirq number and linux irq number
+ * @irq_base: first linux IRQ number assigned to GPIO IRQ chip (deprecated)
+ * @irq_handler: the irq handler to use (often a predefined irq core function)
+ *     for GPIO IRQs, provided by GPIO driver
+ * @irq_default_type: default IRQ triggering type applied during GPIO driver
+ *     initialization, provided by GPIO driver
+ * @irq_parent: GPIO IRQ chip parent/bank linux irq number,
+ *     provided by GPIO driver
+ * @lock_key: per GPIO IRQ chip lockdep class
  *
  * A gpio_chip can help platforms abstract various sources of GPIOs so
  * they can all be accessed through a common programing interface.
@@ -74,6 +90,7 @@ struct seq_file;
 struct gpio_chip {
        const char              *label;
        struct device           *dev;
+       struct device           *cdev;
        struct module           *owner;
        struct list_head        list;
 
@@ -109,7 +126,6 @@ struct gpio_chip {
        const char              *const *names;
        bool                    can_sleep;
        bool                    irq_not_threaded;
-       bool                    exported;
 
 #ifdef CONFIG_GPIOLIB_IRQCHIP
        /*
@@ -121,6 +137,8 @@ struct gpio_chip {
        unsigned int            irq_base;
        irq_flow_handler_t      irq_handler;
        unsigned int            irq_default_type;
+       int                     irq_parent;
+       struct lock_class_key   *lock_key;
 #endif
 
 #if defined(CONFIG_OF_GPIO)
@@ -166,14 +184,31 @@ void gpiochip_set_chained_irqchip(struct gpio_chip *gpiochip,
                int parent_irq,
                irq_flow_handler_t parent_handler);
 
-int gpiochip_irqchip_add(struct gpio_chip *gpiochip,
-               struct irq_chip *irqchip,
-               unsigned int first_irq,
-               irq_flow_handler_t handler,
-               unsigned int type);
+int _gpiochip_irqchip_add(struct gpio_chip *gpiochip,
+                         struct irq_chip *irqchip,
+                         unsigned int first_irq,
+                         irq_flow_handler_t handler,
+                         unsigned int type,
+                         struct lock_class_key *lock_key);
+
+#ifdef CONFIG_LOCKDEP
+#define gpiochip_irqchip_add(...)                              \
+(                                                              \
+       ({                                                      \
+               static struct lock_class_key _key;              \
+               _gpiochip_irqchip_add(__VA_ARGS__, &_key);      \
+       })                                                      \
+)
+#else
+#define gpiochip_irqchip_add(...)                              \
+       _gpiochip_irqchip_add(__VA_ARGS__, NULL)
+#endif
 
 #endif /* CONFIG_GPIOLIB_IRQCHIP */
 
+int gpiochip_generic_request(struct gpio_chip *chip, unsigned offset);
+void gpiochip_generic_free(struct gpio_chip *chip, unsigned offset);
+
 #ifdef CONFIG_PINCTRL
 
 /**