1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/gpio/consumer.h> 3 #include <linux/gpio/driver.h> 4 5 #include <linux/gpio.h> 6 7 #include "gpiolib.h" 8 9 void gpio_free(unsigned gpio) 10 { 11 gpiod_free(gpio_to_desc(gpio)); 12 } 13 EXPORT_SYMBOL_GPL(gpio_free); 14 15 /** 16 * gpio_request_one - request a single GPIO with initial configuration 17 * @gpio: the GPIO number 18 * @flags: GPIO configuration as specified by GPIOF_* 19 * @label: a literal description string of this GPIO 20 */ 21 int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) 22 { 23 struct gpio_desc *desc; 24 int err; 25 26 desc = gpio_to_desc(gpio); 27 28 /* Compatibility: assume unavailable "valid" GPIOs will appear later */ 29 if (!desc && gpio_is_valid(gpio)) 30 return -EPROBE_DEFER; 31 32 err = gpiod_request(desc, label); 33 if (err) 34 return err; 35 36 if (flags & GPIOF_OPEN_DRAIN) 37 set_bit(FLAG_OPEN_DRAIN, &desc->flags); 38 39 if (flags & GPIOF_OPEN_SOURCE) 40 set_bit(FLAG_OPEN_SOURCE, &desc->flags); 41 42 if (flags & GPIOF_ACTIVE_LOW) 43 set_bit(FLAG_ACTIVE_LOW, &desc->flags); 44 45 if (flags & GPIOF_DIR_IN) 46 err = gpiod_direction_input(desc); 47 else 48 err = gpiod_direction_output_raw(desc, 49 (flags & GPIOF_INIT_HIGH) ? 1 : 0); 50 51 if (err) 52 goto free_gpio; 53 54 if (flags & GPIOF_EXPORT) { 55 err = gpiod_export(desc, flags & GPIOF_EXPORT_CHANGEABLE); 56 if (err) 57 goto free_gpio; 58 } 59 60 return 0; 61 62 free_gpio: 63 gpiod_free(desc); 64 return err; 65 } 66 EXPORT_SYMBOL_GPL(gpio_request_one); 67 68 int gpio_request(unsigned gpio, const char *label) 69 { 70 struct gpio_desc *desc = gpio_to_desc(gpio); 71 72 /* Compatibility: assume unavailable "valid" GPIOs will appear later */ 73 if (!desc && gpio_is_valid(gpio)) 74 return -EPROBE_DEFER; 75 76 return gpiod_request(desc, label); 77 } 78 EXPORT_SYMBOL_GPL(gpio_request); 79 80 /** 81 * gpio_request_array - request multiple GPIOs in a single call 82 * @array: array of the 'struct gpio' 83 * @num: how many GPIOs in the array 84 */ 85 int gpio_request_array(const struct gpio *array, size_t num) 86 { 87 int i, err; 88 89 for (i = 0; i < num; i++, array++) { 90 err = gpio_request_one(array->gpio, array->flags, array->label); 91 if (err) 92 goto err_free; 93 } 94 return 0; 95 96 err_free: 97 while (i--) 98 gpio_free((--array)->gpio); 99 return err; 100 } 101 EXPORT_SYMBOL_GPL(gpio_request_array); 102 103 /** 104 * gpio_free_array - release multiple GPIOs in a single call 105 * @array: array of the 'struct gpio' 106 * @num: how many GPIOs in the array 107 */ 108 void gpio_free_array(const struct gpio *array, size_t num) 109 { 110 while (num--) 111 gpio_free((array++)->gpio); 112 } 113 EXPORT_SYMBOL_GPL(gpio_free_array); 114