xref: /linux/drivers/gpio/gpiolib-legacy.c (revision 3fd6c59042dbba50391e30862beac979491145fe)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/bitops.h>
3 #include <linux/device.h>
4 #include <linux/errno.h>
5 #include <linux/export.h>
6 #include <linux/gfp.h>
7 
8 #include <linux/gpio/consumer.h>
9 #include <linux/gpio/driver.h>
10 
11 #include <linux/gpio.h>
12 
13 #include "gpiolib.h"
14 
15 /*
16  * **DEPRECATED** This function is deprecated and must not be used in new code.
17  */
gpio_free(unsigned gpio)18 void gpio_free(unsigned gpio)
19 {
20 	gpiod_free(gpio_to_desc(gpio));
21 }
22 EXPORT_SYMBOL_GPL(gpio_free);
23 
24 /**
25  * gpio_request_one - request a single GPIO with initial configuration
26  * @gpio:	the GPIO number
27  * @flags:	GPIO configuration as specified by GPIOF_*
28  * @label:	a literal description string of this GPIO
29  *
30  * **DEPRECATED** This function is deprecated and must not be used in new code.
31  *
32  * Returns:
33  * 0 on success, or negative errno on failure.
34  */
gpio_request_one(unsigned gpio,unsigned long flags,const char * label)35 int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
36 {
37 	struct gpio_desc *desc;
38 	int err;
39 
40 	/* Compatibility: assume unavailable "valid" GPIOs will appear later */
41 	desc = gpio_to_desc(gpio);
42 	if (!desc)
43 		return -EPROBE_DEFER;
44 
45 	err = gpiod_request(desc, label);
46 	if (err)
47 		return err;
48 
49 	if (flags & GPIOF_IN)
50 		err = gpiod_direction_input(desc);
51 	else
52 		err = gpiod_direction_output_raw(desc, !!(flags & GPIOF_OUT_INIT_HIGH));
53 
54 	if (err)
55 		goto free_gpio;
56 
57 	return 0;
58 
59  free_gpio:
60 	gpiod_free(desc);
61 	return err;
62 }
63 EXPORT_SYMBOL_GPL(gpio_request_one);
64 
65 /*
66  * **DEPRECATED** This function is deprecated and must not be used in new code.
67  */
gpio_request(unsigned gpio,const char * label)68 int gpio_request(unsigned gpio, const char *label)
69 {
70 	struct gpio_desc *desc;
71 
72 	/* Compatibility: assume unavailable "valid" GPIOs will appear later */
73 	desc = gpio_to_desc(gpio);
74 	if (!desc)
75 		return -EPROBE_DEFER;
76 
77 	return gpiod_request(desc, label);
78 }
79 EXPORT_SYMBOL_GPL(gpio_request);
80 
devm_gpio_release(struct device * dev,void * res)81 static void devm_gpio_release(struct device *dev, void *res)
82 {
83 	unsigned *gpio = res;
84 
85 	gpio_free(*gpio);
86 }
87 
88 /**
89  * devm_gpio_request - request a GPIO for a managed device
90  * @dev: device to request the GPIO for
91  * @gpio: GPIO to allocate
92  * @label: the name of the requested GPIO
93  *
94  * Except for the extra @dev argument, this function takes the
95  * same arguments and performs the same function as gpio_request().
96  * GPIOs requested with this function will be automatically freed
97  * on driver detach.
98  *
99  * **DEPRECATED** This function is deprecated and must not be used in new code.
100  *
101  * Returns:
102  * 0 on success, or negative errno on failure.
103  */
devm_gpio_request(struct device * dev,unsigned gpio,const char * label)104 int devm_gpio_request(struct device *dev, unsigned gpio, const char *label)
105 {
106 	unsigned *dr;
107 	int rc;
108 
109 	dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL);
110 	if (!dr)
111 		return -ENOMEM;
112 
113 	rc = gpio_request(gpio, label);
114 	if (rc) {
115 		devres_free(dr);
116 		return rc;
117 	}
118 
119 	*dr = gpio;
120 	devres_add(dev, dr);
121 
122 	return 0;
123 }
124 EXPORT_SYMBOL_GPL(devm_gpio_request);
125 
126 /**
127  * devm_gpio_request_one - request a single GPIO with initial setup
128  * @dev: device to request for
129  * @gpio: the GPIO number
130  * @flags: GPIO configuration as specified by GPIOF_*
131  * @label: a literal description string of this GPIO
132  *
133  * **DEPRECATED** This function is deprecated and must not be used in new code.
134  *
135  * Returns:
136  * 0 on success, or negative errno on failure.
137  */
devm_gpio_request_one(struct device * dev,unsigned gpio,unsigned long flags,const char * label)138 int devm_gpio_request_one(struct device *dev, unsigned gpio,
139 			  unsigned long flags, const char *label)
140 {
141 	unsigned *dr;
142 	int rc;
143 
144 	dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL);
145 	if (!dr)
146 		return -ENOMEM;
147 
148 	rc = gpio_request_one(gpio, flags, label);
149 	if (rc) {
150 		devres_free(dr);
151 		return rc;
152 	}
153 
154 	*dr = gpio;
155 	devres_add(dev, dr);
156 
157 	return 0;
158 }
159 EXPORT_SYMBOL_GPL(devm_gpio_request_one);
160