root/drivers/gpio/gpiolib-legacy.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. gpio_free
  2. gpio_request_one
  3. gpio_request
  4. gpio_request_array
  5. gpio_free_array

   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);

/* [<][>][^][v][top][bottom][index][help] */