Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 989a7241df87526bfef0396567e71ebe53a84ae4 123 lines 4.0 kB view raw
1#ifndef _ASM_GENERIC_GPIO_H 2#define _ASM_GENERIC_GPIO_H 3 4#ifdef CONFIG_HAVE_GPIO_LIB 5 6/* Platforms may implement their GPIO interface with library code, 7 * at a small performance cost for non-inlined operations and some 8 * extra memory (for code and for per-GPIO table entries). 9 * 10 * While the GPIO programming interface defines valid GPIO numbers 11 * to be in the range 0..MAX_INT, this library restricts them to the 12 * smaller range 0..ARCH_NR_GPIOS. 13 */ 14 15#ifndef ARCH_NR_GPIOS 16#define ARCH_NR_GPIOS 256 17#endif 18 19struct seq_file; 20 21/** 22 * struct gpio_chip - abstract a GPIO controller 23 * @label: for diagnostics 24 * @direction_input: configures signal "offset" as input, or returns error 25 * @get: returns value for signal "offset"; for output signals this 26 * returns either the value actually sensed, or zero 27 * @direction_output: configures signal "offset" as output, or returns error 28 * @set: assigns output value for signal "offset" 29 * @dbg_show: optional routine to show contents in debugfs; default code 30 * will be used when this is omitted, but custom code can show extra 31 * state (such as pullup/pulldown configuration). 32 * @base: identifies the first GPIO number handled by this chip; or, if 33 * negative during registration, requests dynamic ID allocation. 34 * @ngpio: the number of GPIOs handled by this controller; the last GPIO 35 * handled is (base + ngpio - 1). 36 * @can_sleep: flag must be set iff get()/set() methods sleep, as they 37 * must while accessing GPIO expander chips over I2C or SPI 38 * 39 * A gpio_chip can help platforms abstract various sources of GPIOs so 40 * they can all be accessed through a common programing interface. 41 * Example sources would be SOC controllers, FPGAs, multifunction 42 * chips, dedicated GPIO expanders, and so on. 43 * 44 * Each chip controls a number of signals, identified in method calls 45 * by "offset" values in the range 0..(@ngpio - 1). When those signals 46 * are referenced through calls like gpio_get_value(gpio), the offset 47 * is calculated by subtracting @base from the gpio number. 48 */ 49struct gpio_chip { 50 char *label; 51 52 int (*direction_input)(struct gpio_chip *chip, 53 unsigned offset); 54 int (*get)(struct gpio_chip *chip, 55 unsigned offset); 56 int (*direction_output)(struct gpio_chip *chip, 57 unsigned offset, int value); 58 void (*set)(struct gpio_chip *chip, 59 unsigned offset, int value); 60 void (*dbg_show)(struct seq_file *s, 61 struct gpio_chip *chip); 62 int base; 63 u16 ngpio; 64 unsigned can_sleep:1; 65}; 66 67extern const char *gpiochip_is_requested(struct gpio_chip *chip, 68 unsigned offset); 69 70/* add/remove chips */ 71extern int gpiochip_add(struct gpio_chip *chip); 72extern int __must_check gpiochip_remove(struct gpio_chip *chip); 73 74 75/* Always use the library code for GPIO management calls, 76 * or when sleeping may be involved. 77 */ 78extern int gpio_request(unsigned gpio, const char *label); 79extern void gpio_free(unsigned gpio); 80 81extern int gpio_direction_input(unsigned gpio); 82extern int gpio_direction_output(unsigned gpio, int value); 83 84extern int gpio_get_value_cansleep(unsigned gpio); 85extern void gpio_set_value_cansleep(unsigned gpio, int value); 86 87 88/* A platform's <asm/gpio.h> code may want to inline the I/O calls when 89 * the GPIO is constant and refers to some always-present controller, 90 * giving direct access to chip registers and tight bitbanging loops. 91 */ 92extern int __gpio_get_value(unsigned gpio); 93extern void __gpio_set_value(unsigned gpio, int value); 94 95extern int __gpio_cansleep(unsigned gpio); 96 97 98#else 99 100/* platforms that don't directly support access to GPIOs through I2C, SPI, 101 * or other blocking infrastructure can use these wrappers. 102 */ 103 104static inline int gpio_cansleep(unsigned gpio) 105{ 106 return 0; 107} 108 109static inline int gpio_get_value_cansleep(unsigned gpio) 110{ 111 might_sleep(); 112 return gpio_get_value(gpio); 113} 114 115static inline void gpio_set_value_cansleep(unsigned gpio, int value) 116{ 117 might_sleep(); 118 gpio_set_value(gpio, value); 119} 120 121#endif 122 123#endif /* _ASM_GENERIC_GPIO_H */