• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
gpio_free(unsigned gpio)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  */
gpio_request_one(unsigned gpio,unsigned long flags,const char * label)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 
gpio_request(unsigned gpio,const char * label)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  */
gpio_request_array(const struct gpio * array,size_t num)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  */
gpio_free_array(const struct gpio * array,size_t num)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);
114