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 err = gpiod_request(desc, label); 28 if (err) 29 return err; 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_DIR_IN) 38 err = gpiod_direction_input(desc); 39 else 40 err = gpiod_direction_output_raw(desc, 41 (flags & GPIOF_INIT_HIGH) ? 1 : 0); 42 43 if (err) 44 goto free_gpio; 45 46 if (flags & GPIOF_EXPORT) { 47 err = gpiod_export(desc, flags & GPIOF_EXPORT_CHANGEABLE); 48 if (err) 49 goto free_gpio; 50 } 51 52 return 0; 53 54 free_gpio: 55 gpiod_free(desc); 56 return err; 57 } 58 EXPORT_SYMBOL_GPL(gpio_request_one); 59 60 int gpio_request(unsigned gpio, const char *label) 61 { 62 return gpiod_request(gpio_to_desc(gpio), label); 63 } 64 EXPORT_SYMBOL_GPL(gpio_request); 65 66 /** 67 * gpio_request_array - request multiple GPIOs in a single call 68 * @array: array of the 'struct gpio' 69 * @num: how many GPIOs in the array 70 */ 71 int gpio_request_array(const struct gpio *array, size_t num) 72 { 73 int i, err; 74 75 for (i = 0; i < num; i++, array++) { 76 err = gpio_request_one(array->gpio, array->flags, array->label); 77 if (err) 78 goto err_free; 79 } 80 return 0; 81 82 err_free: 83 while (i--) 84 gpio_free((--array)->gpio); 85 return err; 86 } 87 EXPORT_SYMBOL_GPL(gpio_request_array); 88 89 /** 90 * gpio_free_array - release multiple GPIOs in a single call 91 * @array: array of the 'struct gpio' 92 * @num: how many GPIOs in the array 93 */ 94 void gpio_free_array(const struct gpio *array, size_t num) 95 { 96 while (num--) 97 gpio_free((array++)->gpio); 98 } 99 EXPORT_SYMBOL_GPL(gpio_free_array); 100 101 int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset) 102 { 103 return gpiod_lock_as_irq(gpiochip_get_desc(chip, offset)); 104 } 105 EXPORT_SYMBOL_GPL(gpio_lock_as_irq); 106 107 void gpio_unlock_as_irq(struct gpio_chip *chip, unsigned int offset) 108 { 109 return gpiod_unlock_as_irq(gpiochip_get_desc(chip, offset)); 110 } 111 EXPORT_SYMBOL_GPL(gpio_unlock_as_irq); 112