1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/bitops.h> 3 #include <linux/device.h> 4 #include <linux/errno.h> 5 #include <linux/export.h> 6 #include <linux/gfp.h> 7 8 #include <linux/gpio/consumer.h> 9 #include <linux/gpio/driver.h> 10 11 #include <linux/gpio.h> 12 13 #include "gpiolib.h" 14 15 /* 16 * **DEPRECATED** This function is deprecated and must not be used in new code. 17 */ 18 void gpio_free(unsigned gpio) 19 { 20 gpiod_free(gpio_to_desc(gpio)); 21 } 22 EXPORT_SYMBOL_GPL(gpio_free); 23 24 /** 25 * gpio_request_one - request a single GPIO with initial configuration 26 * @gpio: the GPIO number 27 * @flags: GPIO configuration as specified by GPIOF_* 28 * @label: a literal description string of this GPIO 29 * 30 * **DEPRECATED** This function is deprecated and must not be used in new code. 31 * 32 * Returns: 33 * 0 on success, or negative errno on failure. 34 */ 35 int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) 36 { 37 struct gpio_desc *desc; 38 int err; 39 40 /* Compatibility: assume unavailable "valid" GPIOs will appear later */ 41 desc = gpio_to_desc(gpio); 42 if (!desc) 43 return -EPROBE_DEFER; 44 45 err = gpiod_request(desc, label); 46 if (err) 47 return err; 48 49 if (flags & GPIOF_IN) 50 err = gpiod_direction_input(desc); 51 else 52 err = gpiod_direction_output_raw(desc, !!(flags & GPIOF_OUT_INIT_HIGH)); 53 54 if (err) 55 goto free_gpio; 56 57 return 0; 58 59 free_gpio: 60 gpiod_free(desc); 61 return err; 62 } 63 EXPORT_SYMBOL_GPL(gpio_request_one); 64 65 /* 66 * **DEPRECATED** This function is deprecated and must not be used in new code. 67 */ 68 int gpio_request(unsigned gpio, const char *label) 69 { 70 struct gpio_desc *desc; 71 72 /* Compatibility: assume unavailable "valid" GPIOs will appear later */ 73 desc = gpio_to_desc(gpio); 74 if (!desc) 75 return -EPROBE_DEFER; 76 77 return gpiod_request(desc, label); 78 } 79 EXPORT_SYMBOL_GPL(gpio_request); 80 81 static void devm_gpio_release(struct device *dev, void *res) 82 { 83 unsigned *gpio = res; 84 85 gpio_free(*gpio); 86 } 87 88 /** 89 * devm_gpio_request - request a GPIO for a managed device 90 * @dev: device to request the GPIO for 91 * @gpio: GPIO to allocate 92 * @label: the name of the requested GPIO 93 * 94 * Except for the extra @dev argument, this function takes the 95 * same arguments and performs the same function as gpio_request(). 96 * GPIOs requested with this function will be automatically freed 97 * on driver detach. 98 * 99 * **DEPRECATED** This function is deprecated and must not be used in new code. 100 * 101 * Returns: 102 * 0 on success, or negative errno on failure. 103 */ 104 int devm_gpio_request(struct device *dev, unsigned gpio, const char *label) 105 { 106 unsigned *dr; 107 int rc; 108 109 dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL); 110 if (!dr) 111 return -ENOMEM; 112 113 rc = gpio_request(gpio, label); 114 if (rc) { 115 devres_free(dr); 116 return rc; 117 } 118 119 *dr = gpio; 120 devres_add(dev, dr); 121 122 return 0; 123 } 124 EXPORT_SYMBOL_GPL(devm_gpio_request); 125 126 /** 127 * devm_gpio_request_one - request a single GPIO with initial setup 128 * @dev: device to request for 129 * @gpio: the GPIO number 130 * @flags: GPIO configuration as specified by GPIOF_* 131 * @label: a literal description string of this GPIO 132 * 133 * **DEPRECATED** This function is deprecated and must not be used in new code. 134 * 135 * Returns: 136 * 0 on success, or negative errno on failure. 137 */ 138 int devm_gpio_request_one(struct device *dev, unsigned gpio, 139 unsigned long flags, const char *label) 140 { 141 unsigned *dr; 142 int rc; 143 144 dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL); 145 if (!dr) 146 return -ENOMEM; 147 148 rc = gpio_request_one(gpio, flags, label); 149 if (rc) { 150 devres_free(dr); 151 return rc; 152 } 153 154 *dr = gpio; 155 devres_add(dev, dr); 156 157 return 0; 158 } 159 EXPORT_SYMBOL_GPL(devm_gpio_request_one); 160