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