GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / gpio / gpiolib-legacy.c
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);