diff options
Diffstat (limited to 'include/asm-generic/gpio.h')
| -rw-r--r-- | include/asm-generic/gpio.h | 52 | 
1 files changed, 51 insertions, 1 deletions
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index a9432fc6b8b..20ca7663975 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h @@ -5,6 +5,7 @@  #include <linux/types.h>  #include <linux/errno.h>  #include <linux/of.h> +#include <linux/pinctrl/pinctrl.h>  #ifdef CONFIG_GPIOLIB @@ -56,6 +57,8 @@ struct device_node;   *	enabling module power and clock; may sleep   * @free: optional hook for chip-specific deactivation, such as   *	disabling module power and clock; may sleep + * @get_direction: returns direction for signal "offset", 0=out, 1=in, + *	(same as GPIOF_DIR_XXX), or negative error   * @direction_input: configures signal "offset" as input, or returns error   * @get: returns value for signal "offset"; for output signals this   *	returns either the value actually sensed, or zero @@ -100,7 +103,8 @@ struct gpio_chip {  						unsigned offset);  	void			(*free)(struct gpio_chip *chip,  						unsigned offset); - +	int			(*get_direction)(struct gpio_chip *chip, +						unsigned offset);  	int			(*direction_input)(struct gpio_chip *chip,  						unsigned offset);  	int			(*get)(struct gpio_chip *chip, @@ -134,6 +138,15 @@ struct gpio_chip {  	int (*of_xlate)(struct gpio_chip *gc,  		        const struct of_phandle_args *gpiospec, u32 *flags);  #endif +#ifdef CONFIG_PINCTRL +	/* +	 * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally +	 * describe the actual pin range which they serve in an SoC. This +	 * information would be used by pinctrl subsystem to configure +	 * corresponding pins for gpio usage. +	 */ +	struct list_head pin_ranges; +#endif  };  extern const char *gpiochip_is_requested(struct gpio_chip *chip, @@ -257,4 +270,41 @@ static inline void gpio_unexport(unsigned gpio)  }  #endif	/* CONFIG_GPIO_SYSFS */ +#ifdef CONFIG_PINCTRL + +/** + * struct gpio_pin_range - pin range controlled by a gpio chip + * @head: list for maintaining set of pin ranges, used internally + * @pctldev: pinctrl device which handles corresponding pins + * @range: actual range of pins controlled by a gpio controller + */ + +struct gpio_pin_range { +	struct list_head node; +	struct pinctrl_dev *pctldev; +	struct pinctrl_gpio_range range; +}; + +int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, +			   unsigned int gpio_offset, unsigned int pin_offset, +			   unsigned int npins); +void gpiochip_remove_pin_ranges(struct gpio_chip *chip); + +#else + +static inline int +gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, +		       unsigned int gpio_offset, unsigned int pin_offset, +		       unsigned int npins) +{ +	return 0; +} + +static inline void +gpiochip_remove_pin_ranges(struct gpio_chip *chip) +{ +} + +#endif /* CONFIG_PINCTRL */ +  #endif /* _ASM_GENERIC_GPIO_H */  |