diff options
Diffstat (limited to 'include/linux/gpio')
| -rw-r--r-- | include/linux/gpio/consumer.h | 134 | ||||
| -rw-r--r-- | include/linux/gpio/driver.h | 66 | ||||
| -rw-r--r-- | include/linux/gpio/machine.h | 61 | 
3 files changed, 166 insertions, 95 deletions
diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h index 05e53ccb708b..12f146fa6604 100644 --- a/include/linux/gpio/consumer.h +++ b/include/linux/gpio/consumer.h @@ -16,33 +16,54 @@ struct device;   */  struct gpio_desc; +#define GPIOD_FLAGS_BIT_DIR_SET		BIT(0) +#define GPIOD_FLAGS_BIT_DIR_OUT		BIT(1) +#define GPIOD_FLAGS_BIT_DIR_VAL		BIT(2) + +/** + * Optional flags that can be passed to one of gpiod_* to configure direction + * and output value. These values cannot be OR'd. + */ +enum gpiod_flags { +	GPIOD_ASIS	= 0, +	GPIOD_IN	= GPIOD_FLAGS_BIT_DIR_SET, +	GPIOD_OUT_LOW	= GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT, +	GPIOD_OUT_HIGH	= GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT | +			  GPIOD_FLAGS_BIT_DIR_VAL, +}; +  #ifdef CONFIG_GPIOLIB  /* Acquire and dispose GPIOs */ -struct gpio_desc *__must_check gpiod_get(struct device *dev, -					 const char *con_id); -struct gpio_desc *__must_check gpiod_get_index(struct device *dev, +struct gpio_desc *__must_check __gpiod_get(struct device *dev, +					 const char *con_id, +					 enum gpiod_flags flags); +struct gpio_desc *__must_check __gpiod_get_index(struct device *dev,  					       const char *con_id, -					       unsigned int idx); -struct gpio_desc *__must_check gpiod_get_optional(struct device *dev, -						  const char *con_id); -struct gpio_desc *__must_check gpiod_get_index_optional(struct device *dev, +					       unsigned int idx, +					       enum gpiod_flags flags); +struct gpio_desc *__must_check __gpiod_get_optional(struct device *dev, +						  const char *con_id, +						  enum gpiod_flags flags); +struct gpio_desc *__must_check __gpiod_get_index_optional(struct device *dev,  							const char *con_id, -							unsigned int index); - +							unsigned int index, +							enum gpiod_flags flags);  void gpiod_put(struct gpio_desc *desc); -struct gpio_desc *__must_check devm_gpiod_get(struct device *dev, -					      const char *con_id); -struct gpio_desc *__must_check devm_gpiod_get_index(struct device *dev, +struct gpio_desc *__must_check __devm_gpiod_get(struct device *dev, +					      const char *con_id, +					      enum gpiod_flags flags); +struct gpio_desc *__must_check __devm_gpiod_get_index(struct device *dev,  						    const char *con_id, -						    unsigned int idx); -struct gpio_desc *__must_check devm_gpiod_get_optional(struct device *dev, -						       const char *con_id); +						    unsigned int idx, +						    enum gpiod_flags flags); +struct gpio_desc *__must_check __devm_gpiod_get_optional(struct device *dev, +						       const char *con_id, +						       enum gpiod_flags flags);  struct gpio_desc *__must_check -devm_gpiod_get_index_optional(struct device *dev, const char *con_id, -			      unsigned int index); - +__devm_gpiod_get_index_optional(struct device *dev, const char *con_id, +			      unsigned int index, enum gpiod_flags flags);  void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);  int gpiod_get_direction(const struct gpio_desc *desc); @@ -75,27 +96,31 @@ int desc_to_gpio(const struct gpio_desc *desc);  #else /* CONFIG_GPIOLIB */ -static inline struct gpio_desc *__must_check gpiod_get(struct device *dev, -						       const char *con_id) +static inline struct gpio_desc *__must_check __gpiod_get(struct device *dev, +						const char *con_id, +						enum gpiod_flags flags)  {  	return ERR_PTR(-ENOSYS);  } -static inline struct gpio_desc *__must_check gpiod_get_index(struct device *dev, -							     const char *con_id, -							     unsigned int idx) +static inline struct gpio_desc *__must_check +__gpiod_get_index(struct device *dev, +		  const char *con_id, +		  unsigned int idx, +		  enum gpiod_flags flags)  {  	return ERR_PTR(-ENOSYS);  }  static inline struct gpio_desc *__must_check -gpiod_get_optional(struct device *dev, const char *con_id) +__gpiod_get_optional(struct device *dev, const char *con_id, +		     enum gpiod_flags flags)  {  	return ERR_PTR(-ENOSYS);  }  static inline struct gpio_desc *__must_check -gpiod_get_index_optional(struct device *dev, const char *con_id, -			 unsigned int index) +__gpiod_get_index_optional(struct device *dev, const char *con_id, +			   unsigned int index, enum gpiod_flags flags)  {  	return ERR_PTR(-ENOSYS);  } @@ -108,28 +133,33 @@ static inline void gpiod_put(struct gpio_desc *desc)  	WARN_ON(1);  } -static inline struct gpio_desc *__must_check devm_gpiod_get(struct device *dev, -							    const char *con_id) +static inline struct gpio_desc *__must_check +__devm_gpiod_get(struct device *dev, +		 const char *con_id, +		 enum gpiod_flags flags)  {  	return ERR_PTR(-ENOSYS);  }  static inline -struct gpio_desc *__must_check devm_gpiod_get_index(struct device *dev, -						    const char *con_id, -						    unsigned int idx) +struct gpio_desc *__must_check +__devm_gpiod_get_index(struct device *dev, +		       const char *con_id, +		       unsigned int idx, +		       enum gpiod_flags flags)  {  	return ERR_PTR(-ENOSYS);  }  static inline struct gpio_desc *__must_check -devm_gpiod_get_optional(struct device *dev, const char *con_id) +__devm_gpiod_get_optional(struct device *dev, const char *con_id, +			  enum gpiod_flags flags)  {  	return ERR_PTR(-ENOSYS);  }  static inline struct gpio_desc *__must_check -devm_gpiod_get_index_optional(struct device *dev, const char *con_id, -			      unsigned int index) +__devm_gpiod_get_index_optional(struct device *dev, const char *con_id, +				unsigned int index, enum gpiod_flags flags)  {  	return ERR_PTR(-ENOSYS);  } @@ -254,9 +284,43 @@ static inline int desc_to_gpio(const struct gpio_desc *desc)  	return -EINVAL;  } -  #endif /* CONFIG_GPIOLIB */ +/* + * Vararg-hacks! This is done to transition the kernel to always pass + * the options flags argument to the below functions. During a transition + * phase these vararg macros make both old-and-newstyle code compile, + * but when all calls to the elder API are removed, these should go away + * and the __gpiod_get() etc functions above be renamed just gpiod_get() + * etc. + */ +#define __gpiod_get(dev, con_id, flags, ...) __gpiod_get(dev, con_id, flags) +#define gpiod_get(varargs...) __gpiod_get(varargs, 0) +#define __gpiod_get_index(dev, con_id, index, flags, ...)		\ +	__gpiod_get_index(dev, con_id, index, flags) +#define gpiod_get_index(varargs...) __gpiod_get_index(varargs, 0) +#define __gpiod_get_optional(dev, con_id, flags, ...)			\ +	__gpiod_get_optional(dev, con_id, flags) +#define gpiod_get_optional(varargs...) __gpiod_get_optional(varargs, 0) +#define __gpiod_get_index_optional(dev, con_id, index, flags, ...)	\ +	__gpiod_get_index_optional(dev, con_id, index, flags) +#define gpiod_get_index_optional(varargs...)				\ +	__gpiod_get_index_optional(varargs, 0) +#define __devm_gpiod_get(dev, con_id, flags, ...)			\ +	__devm_gpiod_get(dev, con_id, flags) +#define devm_gpiod_get(varargs...) __devm_gpiod_get(varargs, 0) +#define __devm_gpiod_get_index(dev, con_id, index, flags, ...)		\ +	__devm_gpiod_get_index(dev, con_id, index, flags) +#define devm_gpiod_get_index(varargs...) __devm_gpiod_get_index(varargs, 0) +#define __devm_gpiod_get_optional(dev, con_id, flags, ...)		\ +	__devm_gpiod_get_optional(dev, con_id, flags) +#define devm_gpiod_get_optional(varargs...)				\ +	__devm_gpiod_get_optional(varargs, 0) +#define __devm_gpiod_get_index_optional(dev, con_id, index, flags, ...)	\ +	__devm_gpiod_get_index_optional(dev, con_id, index, flags) +#define devm_gpiod_get_index_optional(varargs...)			\ +	__devm_gpiod_get_index_optional(varargs, 0) +  #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)  int gpiod_export(struct gpio_desc *desc, bool direction_may_change); diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index 573e4f3243d0..e78a2373e374 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h @@ -141,73 +141,16 @@ extern const char *gpiochip_is_requested(struct gpio_chip *chip,  /* add/remove chips */  extern int gpiochip_add(struct gpio_chip *chip); -extern int __must_check gpiochip_remove(struct gpio_chip *chip); +extern int gpiochip_remove(struct gpio_chip *chip);  extern struct gpio_chip *gpiochip_find(void *data,  			      int (*match)(struct gpio_chip *chip, void *data));  /* lock/unlock as IRQ */ -int gpiod_lock_as_irq(struct gpio_desc *desc); -void gpiod_unlock_as_irq(struct gpio_desc *desc); +int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset); +void gpio_unlock_as_irq(struct gpio_chip *chip, unsigned int offset);  struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc); -struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, -				    u16 hwnum); - -enum gpio_lookup_flags { -	GPIO_ACTIVE_HIGH = (0 << 0), -	GPIO_ACTIVE_LOW = (1 << 0), -	GPIO_OPEN_DRAIN = (1 << 1), -	GPIO_OPEN_SOURCE = (1 << 2), -}; - -/** - * struct gpiod_lookup - lookup table - * @chip_label: name of the chip the GPIO belongs to - * @chip_hwnum: hardware number (i.e. relative to the chip) of the GPIO - * @con_id: name of the GPIO from the device's point of view - * @idx: index of the GPIO in case several GPIOs share the same name - * @flags: mask of GPIO_* values - * - * gpiod_lookup is a lookup table for associating GPIOs to specific devices and - * functions using platform data. - */ -struct gpiod_lookup { -	const char *chip_label; -	u16 chip_hwnum; -	const char *con_id; -	unsigned int idx; -	enum gpio_lookup_flags flags; -}; - -struct gpiod_lookup_table { -	struct list_head list; -	const char *dev_id; -	struct gpiod_lookup table[]; -}; - -/* - * Simple definition of a single GPIO under a con_id - */ -#define GPIO_LOOKUP(_chip_label, _chip_hwnum, _con_id, _flags) \ -	GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _con_id, 0, _flags) - -/* - * Use this macro if you need to have several GPIOs under the same con_id. - * Each GPIO needs to use a different index and can be accessed using - * gpiod_get_index() - */ -#define GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _con_id, _idx, _flags)  \ -{                                                                         \ -	.chip_label = _chip_label,                                        \ -	.chip_hwnum = _chip_hwnum,                                        \ -	.con_id = _con_id,                                                \ -	.idx = _idx,                                                      \ -	.flags = _flags,                                                  \ -} - -void gpiod_add_lookup_table(struct gpiod_lookup_table *table); -  #ifdef CONFIG_GPIOLIB_IRQCHIP  void gpiochip_set_chained_irqchip(struct gpio_chip *gpiochip, @@ -223,6 +166,9 @@ int gpiochip_irqchip_add(struct gpio_chip *gpiochip,  #endif /* CONFIG_GPIO_IRQCHIP */ +int gpiochip_request_own_desc(struct gpio_desc *desc, const char *label); +void gpiochip_free_own_desc(struct gpio_desc *desc); +  #else /* CONFIG_GPIOLIB */  static inline struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc) diff --git a/include/linux/gpio/machine.h b/include/linux/gpio/machine.h new file mode 100644 index 000000000000..e2706140eaff --- /dev/null +++ b/include/linux/gpio/machine.h @@ -0,0 +1,61 @@ +#ifndef __LINUX_GPIO_MACHINE_H +#define __LINUX_GPIO_MACHINE_H + +#include <linux/types.h> +#include <linux/list.h> + +enum gpio_lookup_flags { +	GPIO_ACTIVE_HIGH = (0 << 0), +	GPIO_ACTIVE_LOW = (1 << 0), +	GPIO_OPEN_DRAIN = (1 << 1), +	GPIO_OPEN_SOURCE = (1 << 2), +}; + +/** + * struct gpiod_lookup - lookup table + * @chip_label: name of the chip the GPIO belongs to + * @chip_hwnum: hardware number (i.e. relative to the chip) of the GPIO + * @con_id: name of the GPIO from the device's point of view + * @idx: index of the GPIO in case several GPIOs share the same name + * @flags: mask of GPIO_* values + * + * gpiod_lookup is a lookup table for associating GPIOs to specific devices and + * functions using platform data. + */ +struct gpiod_lookup { +	const char *chip_label; +	u16 chip_hwnum; +	const char *con_id; +	unsigned int idx; +	enum gpio_lookup_flags flags; +}; + +struct gpiod_lookup_table { +	struct list_head list; +	const char *dev_id; +	struct gpiod_lookup table[]; +}; + +/* + * Simple definition of a single GPIO under a con_id + */ +#define GPIO_LOOKUP(_chip_label, _chip_hwnum, _con_id, _flags) \ +	GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _con_id, 0, _flags) + +/* + * Use this macro if you need to have several GPIOs under the same con_id. + * Each GPIO needs to use a different index and can be accessed using + * gpiod_get_index() + */ +#define GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _con_id, _idx, _flags)  \ +{                                                                         \ +	.chip_label = _chip_label,                                        \ +	.chip_hwnum = _chip_hwnum,                                        \ +	.con_id = _con_id,                                                \ +	.idx = _idx,                                                      \ +	.flags = _flags,                                                  \ +} + +void gpiod_add_lookup_table(struct gpiod_lookup_table *table); + +#endif /* __LINUX_GPIO_MACHINE_H */  |