Merge tag 'gpio-updates-for-v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/kernel/linux-rpi.git] / include / linux / gpio / driver.h
index cb68926..0979252 100644 (file)
@@ -3,13 +3,14 @@
 #define __LINUX_GPIO_DRIVER_H
 
 #include <linux/device.h>
-#include <linux/types.h>
 #include <linux/irq.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/irqdomain.h>
 #include <linux/lockdep.h>
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/pinctrl/pinconf-generic.h>
+#include <linux/property.h>
+#include <linux/types.h>
 
 struct gpio_desc;
 struct of_phandle_args;
@@ -445,7 +446,7 @@ struct gpio_chip {
        void __iomem *reg_dir_in;
        bool bgpio_dir_unreadable;
        int bgpio_bits;
-       spinlock_t bgpio_lock;
+       raw_spinlock_t bgpio_lock;
        unsigned long bgpio_data;
        unsigned long bgpio_dir;
 #endif /* CONFIG_GPIO_GENERIC */
@@ -775,4 +776,29 @@ static inline void gpiochip_unlock_as_irq(struct gpio_chip *gc,
 }
 #endif /* CONFIG_GPIOLIB */
 
+#define for_each_gpiochip_node(dev, child)                                     \
+       device_for_each_child_node(dev, child)                                  \
+               if (!fwnode_property_present(child, "gpio-controller")) {} else
+
+static inline unsigned int gpiochip_node_count(struct device *dev)
+{
+       struct fwnode_handle *child;
+       unsigned int count = 0;
+
+       for_each_gpiochip_node(dev, child)
+               count++;
+
+       return count;
+}
+
+static inline struct fwnode_handle *gpiochip_node_get_first(struct device *dev)
+{
+       struct fwnode_handle *fwnode;
+
+       for_each_gpiochip_node(dev, fwnode)
+               return fwnode;
+
+       return NULL;
+}
+
 #endif /* __LINUX_GPIO_DRIVER_H */