Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _ASM_GENERIC_GPIO_H 3 : : #define _ASM_GENERIC_GPIO_H 4 : : 5 : : #include <linux/kernel.h> 6 : : #include <linux/types.h> 7 : : #include <linux/errno.h> 8 : : #include <linux/of.h> 9 : : 10 : : #ifdef CONFIG_GPIOLIB 11 : : 12 : : #include <linux/compiler.h> 13 : : #include <linux/gpio/driver.h> 14 : : #include <linux/gpio/consumer.h> 15 : : 16 : : /* Platforms may implement their GPIO interface with library code, 17 : : * at a small performance cost for non-inlined operations and some 18 : : * extra memory (for code and for per-GPIO table entries). 19 : : * 20 : : * While the GPIO programming interface defines valid GPIO numbers 21 : : * to be in the range 0..MAX_INT, this library restricts them to the 22 : : * smaller range 0..ARCH_NR_GPIOS-1. 23 : : * 24 : : * ARCH_NR_GPIOS is somewhat arbitrary; it usually reflects the sum of 25 : : * builtin/SoC GPIOs plus a number of GPIOs on expanders; the latter is 26 : : * actually an estimate of a board-specific value. 27 : : */ 28 : : 29 : : #ifndef ARCH_NR_GPIOS 30 : : #if defined(CONFIG_ARCH_NR_GPIO) && CONFIG_ARCH_NR_GPIO > 0 31 : : #define ARCH_NR_GPIOS CONFIG_ARCH_NR_GPIO 32 : : #else 33 : : #define ARCH_NR_GPIOS 512 34 : : #endif 35 : : #endif 36 : : 37 : : /* 38 : : * "valid" GPIO numbers are nonnegative and may be passed to 39 : : * setup routines like gpio_request(). only some valid numbers 40 : : * can successfully be requested and used. 41 : : * 42 : : * Invalid GPIO numbers are useful for indicating no-such-GPIO in 43 : : * platform data and other tables. 44 : : */ 45 : : 46 : : static inline bool gpio_is_valid(int number) 47 : : { 48 : 0 : return number >= 0 && number < ARCH_NR_GPIOS; 49 : : } 50 : : 51 : : struct device; 52 : : struct gpio; 53 : : struct seq_file; 54 : : struct module; 55 : : struct device_node; 56 : : struct gpio_desc; 57 : : 58 : : /* caller holds gpio_lock *OR* gpio is marked as requested */ 59 : : static inline struct gpio_chip *gpio_to_chip(unsigned gpio) 60 : : { 61 : 0 : return gpiod_to_chip(gpio_to_desc(gpio)); 62 : : } 63 : : 64 : : /* Always use the library code for GPIO management calls, 65 : : * or when sleeping may be involved. 66 : : */ 67 : : extern int gpio_request(unsigned gpio, const char *label); 68 : : extern void gpio_free(unsigned gpio); 69 : : 70 : : static inline int gpio_direction_input(unsigned gpio) 71 : : { 72 : : return gpiod_direction_input(gpio_to_desc(gpio)); 73 : : } 74 : : static inline int gpio_direction_output(unsigned gpio, int value) 75 : : { 76 : : return gpiod_direction_output_raw(gpio_to_desc(gpio), value); 77 : : } 78 : : 79 : : static inline int gpio_set_debounce(unsigned gpio, unsigned debounce) 80 : : { 81 : : return gpiod_set_debounce(gpio_to_desc(gpio), debounce); 82 : : } 83 : : 84 : : static inline int gpio_get_value_cansleep(unsigned gpio) 85 : : { 86 : 0 : return gpiod_get_raw_value_cansleep(gpio_to_desc(gpio)); 87 : : } 88 : : static inline void gpio_set_value_cansleep(unsigned gpio, int value) 89 : : { 90 : 0 : return gpiod_set_raw_value_cansleep(gpio_to_desc(gpio), value); 91 : : } 92 : : 93 : : 94 : : /* A platform's <asm/gpio.h> code may want to inline the I/O calls when 95 : : * the GPIO is constant and refers to some always-present controller, 96 : : * giving direct access to chip registers and tight bitbanging loops. 97 : : */ 98 : : static inline int __gpio_get_value(unsigned gpio) 99 : : { 100 : : return gpiod_get_raw_value(gpio_to_desc(gpio)); 101 : : } 102 : : static inline void __gpio_set_value(unsigned gpio, int value) 103 : : { 104 : : return gpiod_set_raw_value(gpio_to_desc(gpio), value); 105 : : } 106 : : 107 : : static inline int __gpio_cansleep(unsigned gpio) 108 : : { 109 : : return gpiod_cansleep(gpio_to_desc(gpio)); 110 : : } 111 : : 112 : : static inline int __gpio_to_irq(unsigned gpio) 113 : : { 114 : 0 : return gpiod_to_irq(gpio_to_desc(gpio)); 115 : : } 116 : : 117 : : extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label); 118 : : extern int gpio_request_array(const struct gpio *array, size_t num); 119 : : extern void gpio_free_array(const struct gpio *array, size_t num); 120 : : 121 : : /* 122 : : * A sysfs interface can be exported by individual drivers if they want, 123 : : * but more typically is configured entirely from userspace. 124 : : */ 125 : : static inline int gpio_export(unsigned gpio, bool direction_may_change) 126 : : { 127 : : return gpiod_export(gpio_to_desc(gpio), direction_may_change); 128 : : } 129 : : 130 : : static inline int gpio_export_link(struct device *dev, const char *name, 131 : : unsigned gpio) 132 : : { 133 : : return gpiod_export_link(dev, name, gpio_to_desc(gpio)); 134 : : } 135 : : 136 : : static inline void gpio_unexport(unsigned gpio) 137 : : { 138 : : gpiod_unexport(gpio_to_desc(gpio)); 139 : : } 140 : : 141 : : #else /* !CONFIG_GPIOLIB */ 142 : : 143 : : static inline bool gpio_is_valid(int number) 144 : : { 145 : : /* only non-negative numbers are valid */ 146 : : return number >= 0; 147 : : } 148 : : 149 : : /* platforms that don't directly support access to GPIOs through I2C, SPI, 150 : : * or other blocking infrastructure can use these wrappers. 151 : : */ 152 : : 153 : : static inline int gpio_cansleep(unsigned gpio) 154 : : { 155 : : return 0; 156 : : } 157 : : 158 : : static inline int gpio_get_value_cansleep(unsigned gpio) 159 : : { 160 : : might_sleep(); 161 : : return __gpio_get_value(gpio); 162 : : } 163 : : 164 : : static inline void gpio_set_value_cansleep(unsigned gpio, int value) 165 : : { 166 : : might_sleep(); 167 : : __gpio_set_value(gpio, value); 168 : : } 169 : : 170 : : #endif /* !CONFIG_GPIOLIB */ 171 : : 172 : : #endif /* _ASM_GENERIC_GPIO_H */