linux/drivers/gpio/gpiolib-legacy.c
<<
>>
Prefs
   1#include <linux/gpio/consumer.h>
   2#include <linux/gpio/driver.h>
   3
   4#include <linux/gpio.h>
   5
   6#include "gpiolib.h"
   7
   8void gpio_free(unsigned gpio)
   9{
  10        gpiod_free(gpio_to_desc(gpio));
  11}
  12EXPORT_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 */
  20int 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        err = gpiod_request(desc, label);
  32        if (err)
  33                return err;
  34
  35        if (flags & GPIOF_OPEN_DRAIN)
  36                set_bit(FLAG_OPEN_DRAIN, &desc->flags);
  37
  38        if (flags & GPIOF_OPEN_SOURCE)
  39                set_bit(FLAG_OPEN_SOURCE, &desc->flags);
  40
  41        if (flags & GPIOF_ACTIVE_LOW)
  42                set_bit(FLAG_ACTIVE_LOW, &desc->flags);
  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}
  65EXPORT_SYMBOL_GPL(gpio_request_one);
  66
  67int 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}
  77EXPORT_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 */
  84int 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
  95err_free:
  96        while (i--)
  97                gpio_free((--array)->gpio);
  98        return err;
  99}
 100EXPORT_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 */
 107void gpio_free_array(const struct gpio *array, size_t num)
 108{
 109        while (num--)
 110                gpio_free((array++)->gpio);
 111}
 112EXPORT_SYMBOL_GPL(gpio_free_array);
 113