linux/drivers/gpio/gpiolib-legacy.c
<<
>>
Prefs
   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
   9void gpio_free(unsigned gpio)
  10{
  11        gpiod_free(gpio_to_desc(gpio));
  12}
  13EXPORT_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 */
  21int 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}
  66EXPORT_SYMBOL_GPL(gpio_request_one);
  67
  68int 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}
  78EXPORT_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 */
  85int 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
  96err_free:
  97        while (i--)
  98                gpio_free((--array)->gpio);
  99        return err;
 100}
 101EXPORT_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 */
 108void gpio_free_array(const struct gpio *array, size_t num)
 109{
 110        while (num--)
 111                gpio_free((array++)->gpio);
 112}
 113EXPORT_SYMBOL_GPL(gpio_free_array);
 114