xref: /openbmc/linux/drivers/gpio/gpiolib-legacy.c (revision c4c3c32d)
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_ACTIVE_LOW)
37 		set_bit(FLAG_ACTIVE_LOW, &desc->flags);
38 
39 	if (flags & GPIOF_DIR_IN)
40 		err = gpiod_direction_input(desc);
41 	else
42 		err = gpiod_direction_output_raw(desc,
43 				(flags & GPIOF_INIT_HIGH) ? 1 : 0);
44 
45 	if (err)
46 		goto free_gpio;
47 
48 	return 0;
49 
50  free_gpio:
51 	gpiod_free(desc);
52 	return err;
53 }
54 EXPORT_SYMBOL_GPL(gpio_request_one);
55 
56 int gpio_request(unsigned gpio, const char *label)
57 {
58 	struct gpio_desc *desc = gpio_to_desc(gpio);
59 
60 	/* Compatibility: assume unavailable "valid" GPIOs will appear later */
61 	if (!desc && gpio_is_valid(gpio))
62 		return -EPROBE_DEFER;
63 
64 	return gpiod_request(desc, label);
65 }
66 EXPORT_SYMBOL_GPL(gpio_request);
67 
68 /**
69  * gpio_request_array - request multiple GPIOs in a single call
70  * @array:	array of the 'struct gpio'
71  * @num:	how many GPIOs in the array
72  */
73 int gpio_request_array(const struct gpio *array, size_t num)
74 {
75 	int i, err;
76 
77 	for (i = 0; i < num; i++, array++) {
78 		err = gpio_request_one(array->gpio, array->flags, array->label);
79 		if (err)
80 			goto err_free;
81 	}
82 	return 0;
83 
84 err_free:
85 	while (i--)
86 		gpio_free((--array)->gpio);
87 	return err;
88 }
89 EXPORT_SYMBOL_GPL(gpio_request_array);
90 
91 /**
92  * gpio_free_array - release multiple GPIOs in a single call
93  * @array:	array of the 'struct gpio'
94  * @num:	how many GPIOs in the array
95  */
96 void gpio_free_array(const struct gpio *array, size_t num)
97 {
98 	while (num--)
99 		gpio_free((array++)->gpio);
100 }
101 EXPORT_SYMBOL_GPL(gpio_free_array);
102