1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
279a9becdSAlexandre Courbot #ifndef __LINUX_GPIO_CONSUMER_H
379a9becdSAlexandre Courbot #define __LINUX_GPIO_CONSUMER_H
479a9becdSAlexandre Courbot
5046e14afSAndy Shevchenko #include <linux/bits.h>
691931af1SDavid Lechner #include <linux/err.h>
7380c7ba3SAndy Shevchenko #include <linux/types.h>
879a9becdSAlexandre Courbot
95b191197SAndy Shevchenko struct acpi_device;
1079a9becdSAlexandre Courbot struct device;
1191e5ae95SAndy Shevchenko struct fwnode_handle;
12380c7ba3SAndy Shevchenko
13bf9346f5SJanusz Krzysztofik struct gpio_array;
14380c7ba3SAndy Shevchenko struct gpio_desc;
15bf9346f5SJanusz Krzysztofik
16bf9346f5SJanusz Krzysztofik /**
174398693aSBartosz Golaszewski * struct gpio_descs - Struct containing an array of descriptors that can be
184398693aSBartosz Golaszewski * obtained using gpiod_get_array()
194398693aSBartosz Golaszewski *
204398693aSBartosz Golaszewski * @info: Pointer to the opaque gpio_array structure
214398693aSBartosz Golaszewski * @ndescs: Number of held descriptors
224398693aSBartosz Golaszewski * @desc: Array of pointers to GPIO descriptors
2366858527SRojhalat Ibrahim */
2466858527SRojhalat Ibrahim struct gpio_descs {
25bf9346f5SJanusz Krzysztofik struct gpio_array *info;
2666858527SRojhalat Ibrahim unsigned int ndescs;
2766858527SRojhalat Ibrahim struct gpio_desc *desc[];
2866858527SRojhalat Ibrahim };
2966858527SRojhalat Ibrahim
3039b2bbe3SAlexandre Courbot #define GPIOD_FLAGS_BIT_DIR_SET BIT(0)
3139b2bbe3SAlexandre Courbot #define GPIOD_FLAGS_BIT_DIR_OUT BIT(1)
3239b2bbe3SAlexandre Courbot #define GPIOD_FLAGS_BIT_DIR_VAL BIT(2)
33f926dfc1SLinus Walleij #define GPIOD_FLAGS_BIT_OPEN_DRAIN BIT(3)
34*6deb8435SBartosz Golaszewski /* GPIOD_FLAGS_BIT_NONEXCLUSIVE is DEPRECATED, don't use in new code. */
35b0ce7b29SLinus Walleij #define GPIOD_FLAGS_BIT_NONEXCLUSIVE BIT(4)
3639b2bbe3SAlexandre Courbot
3739b2bbe3SAlexandre Courbot /**
384398693aSBartosz Golaszewski * enum gpiod_flags - Optional flags that can be passed to one of gpiod_* to
394398693aSBartosz Golaszewski * configure direction and output value. These values
404398693aSBartosz Golaszewski * cannot be OR'd.
414398693aSBartosz Golaszewski *
424398693aSBartosz Golaszewski * @GPIOD_ASIS: Don't change anything
434398693aSBartosz Golaszewski * @GPIOD_IN: Set lines to input mode
444398693aSBartosz Golaszewski * @GPIOD_OUT_LOW: Set lines to output and drive them low
454398693aSBartosz Golaszewski * @GPIOD_OUT_HIGH: Set lines to output and drive them high
464398693aSBartosz Golaszewski * @GPIOD_OUT_LOW_OPEN_DRAIN: Set lines to open-drain output and drive them low
474398693aSBartosz Golaszewski * @GPIOD_OUT_HIGH_OPEN_DRAIN: Set lines to open-drain output and drive them high
4839b2bbe3SAlexandre Courbot */
4939b2bbe3SAlexandre Courbot enum gpiod_flags {
5039b2bbe3SAlexandre Courbot GPIOD_ASIS = 0,
5139b2bbe3SAlexandre Courbot GPIOD_IN = GPIOD_FLAGS_BIT_DIR_SET,
5239b2bbe3SAlexandre Courbot GPIOD_OUT_LOW = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT,
5339b2bbe3SAlexandre Courbot GPIOD_OUT_HIGH = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT |
5439b2bbe3SAlexandre Courbot GPIOD_FLAGS_BIT_DIR_VAL,
550969a204SAndy Shevchenko GPIOD_OUT_LOW_OPEN_DRAIN = GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_OPEN_DRAIN,
560969a204SAndy Shevchenko GPIOD_OUT_HIGH_OPEN_DRAIN = GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_OPEN_DRAIN,
5739b2bbe3SAlexandre Courbot };
5839b2bbe3SAlexandre Courbot
5958b84f6aSLinus Walleij #ifdef CONFIG_GPIOLIB
6058b84f6aSLinus Walleij
6166858527SRojhalat Ibrahim /* Return the number of GPIOs associated with a device / function */
6266858527SRojhalat Ibrahim int gpiod_count(struct device *dev, const char *con_id);
6366858527SRojhalat Ibrahim
64bae48da2SAlexandre Courbot /* Acquire and dispose GPIOs */
65b17d1bf1SUwe Kleine-König struct gpio_desc *__must_check gpiod_get(struct device *dev,
66bae48da2SAlexandre Courbot const char *con_id,
6739b2bbe3SAlexandre Courbot enum gpiod_flags flags);
68b17d1bf1SUwe Kleine-König struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
6929a1f233SThierry Reding const char *con_id,
7039b2bbe3SAlexandre Courbot unsigned int idx,
7139b2bbe3SAlexandre Courbot enum gpiod_flags flags);
72b17d1bf1SUwe Kleine-König struct gpio_desc *__must_check gpiod_get_optional(struct device *dev,
7339b2bbe3SAlexandre Courbot const char *con_id,
7439b2bbe3SAlexandre Courbot enum gpiod_flags flags);
75b17d1bf1SUwe Kleine-König struct gpio_desc *__must_check gpiod_get_index_optional(struct device *dev,
7639b2bbe3SAlexandre Courbot const char *con_id,
7739b2bbe3SAlexandre Courbot unsigned int index,
7839b2bbe3SAlexandre Courbot enum gpiod_flags flags);
7966858527SRojhalat Ibrahim struct gpio_descs *__must_check gpiod_get_array(struct device *dev,
8066858527SRojhalat Ibrahim const char *con_id,
8166858527SRojhalat Ibrahim enum gpiod_flags flags);
8266858527SRojhalat Ibrahim struct gpio_descs *__must_check gpiod_get_array_optional(struct device *dev,
8366858527SRojhalat Ibrahim const char *con_id,
8466858527SRojhalat Ibrahim enum gpiod_flags flags);
85bae48da2SAlexandre Courbot void gpiod_put(struct gpio_desc *desc);
8666858527SRojhalat Ibrahim void gpiod_put_array(struct gpio_descs *descs);
87bae48da2SAlexandre Courbot
88b17d1bf1SUwe Kleine-König struct gpio_desc *__must_check devm_gpiod_get(struct device *dev,
89bae48da2SAlexandre Courbot const char *con_id,
9039b2bbe3SAlexandre Courbot enum gpiod_flags flags);
91b17d1bf1SUwe Kleine-König struct gpio_desc *__must_check devm_gpiod_get_index(struct device *dev,
9239b2bbe3SAlexandre Courbot const char *con_id,
9339b2bbe3SAlexandre Courbot unsigned int idx,
9439b2bbe3SAlexandre Courbot enum gpiod_flags flags);
95b17d1bf1SUwe Kleine-König struct gpio_desc *__must_check devm_gpiod_get_optional(struct device *dev,
9639b2bbe3SAlexandre Courbot const char *con_id,
9739b2bbe3SAlexandre Courbot enum gpiod_flags flags);
9829a1f233SThierry Reding struct gpio_desc *__must_check
99b17d1bf1SUwe Kleine-König devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
10039b2bbe3SAlexandre Courbot unsigned int index, enum gpiod_flags flags);
101331758eeSRojhalat Ibrahim struct gpio_descs *__must_check devm_gpiod_get_array(struct device *dev,
102331758eeSRojhalat Ibrahim const char *con_id,
103331758eeSRojhalat Ibrahim enum gpiod_flags flags);
104331758eeSRojhalat Ibrahim struct gpio_descs *__must_check
105331758eeSRojhalat Ibrahim devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
106331758eeSRojhalat Ibrahim enum gpiod_flags flags);
107bae48da2SAlexandre Courbot void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
108891ddbc7SLinus Walleij void devm_gpiod_unhinge(struct device *dev, struct gpio_desc *desc);
109331758eeSRojhalat Ibrahim void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs);
110bae48da2SAlexandre Courbot
1118e53b0f1SAlexandre Courbot int gpiod_get_direction(struct gpio_desc *desc);
11279a9becdSAlexandre Courbot int gpiod_direction_input(struct gpio_desc *desc);
11379a9becdSAlexandre Courbot int gpiod_direction_output(struct gpio_desc *desc, int value);
114ef70bbe1SPhilipp Zabel int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
11579a9becdSAlexandre Courbot
11679a9becdSAlexandre Courbot /* Value get/set from non-sleeping context */
11779a9becdSAlexandre Courbot int gpiod_get_value(const struct gpio_desc *desc);
118eec1d566SLukas Wunner int gpiod_get_array_value(unsigned int array_size,
119b9762bebSJanusz Krzysztofik struct gpio_desc **desc_array,
12077588c14SJanusz Krzysztofik struct gpio_array *array_info,
121b9762bebSJanusz Krzysztofik unsigned long *value_bitmap);
1228ce258f6SBartosz Golaszewski int gpiod_set_value(struct gpio_desc *desc, int value);
123cf9af0d5SGeert Uytterhoeven int gpiod_set_array_value(unsigned int array_size,
124b9762bebSJanusz Krzysztofik struct gpio_desc **desc_array,
12577588c14SJanusz Krzysztofik struct gpio_array *array_info,
126b9762bebSJanusz Krzysztofik unsigned long *value_bitmap);
12779a9becdSAlexandre Courbot int gpiod_get_raw_value(const struct gpio_desc *desc);
128eec1d566SLukas Wunner int gpiod_get_raw_array_value(unsigned int array_size,
129eec1d566SLukas Wunner struct gpio_desc **desc_array,
13077588c14SJanusz Krzysztofik struct gpio_array *array_info,
131b9762bebSJanusz Krzysztofik unsigned long *value_bitmap);
1328ce258f6SBartosz Golaszewski int gpiod_set_raw_value(struct gpio_desc *desc, int value);
1333027743fSLaura Abbott int gpiod_set_raw_array_value(unsigned int array_size,
1343fff99bcSRojhalat Ibrahim struct gpio_desc **desc_array,
13577588c14SJanusz Krzysztofik struct gpio_array *array_info,
136b9762bebSJanusz Krzysztofik unsigned long *value_bitmap);
13779a9becdSAlexandre Courbot
13879a9becdSAlexandre Courbot /* Value get/set from sleeping context */
13979a9becdSAlexandre Courbot int gpiod_get_value_cansleep(const struct gpio_desc *desc);
140eec1d566SLukas Wunner int gpiod_get_array_value_cansleep(unsigned int array_size,
141eec1d566SLukas Wunner struct gpio_desc **desc_array,
14277588c14SJanusz Krzysztofik struct gpio_array *array_info,
143b9762bebSJanusz Krzysztofik unsigned long *value_bitmap);
1448ce258f6SBartosz Golaszewski int gpiod_set_value_cansleep(struct gpio_desc *desc, int value);
145cf9af0d5SGeert Uytterhoeven int gpiod_set_array_value_cansleep(unsigned int array_size,
1465f424243SRojhalat Ibrahim struct gpio_desc **desc_array,
14777588c14SJanusz Krzysztofik struct gpio_array *array_info,
148b9762bebSJanusz Krzysztofik unsigned long *value_bitmap);
14979a9becdSAlexandre Courbot int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc);
150eec1d566SLukas Wunner int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
151eec1d566SLukas Wunner struct gpio_desc **desc_array,
15277588c14SJanusz Krzysztofik struct gpio_array *array_info,
153b9762bebSJanusz Krzysztofik unsigned long *value_bitmap);
1548ce258f6SBartosz Golaszewski int gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value);
1553027743fSLaura Abbott int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
1565f424243SRojhalat Ibrahim struct gpio_desc **desc_array,
15777588c14SJanusz Krzysztofik struct gpio_array *array_info,
158b9762bebSJanusz Krzysztofik unsigned long *value_bitmap);
15979a9becdSAlexandre Courbot
1608ced32ffSGeert Uytterhoeven int gpiod_set_config(struct gpio_desc *desc, unsigned long config);
16113daf489SAndy Shevchenko int gpiod_set_debounce(struct gpio_desc *desc, unsigned int debounce);
162d3a5bcb4SMichał Mirosław void gpiod_toggle_active_low(struct gpio_desc *desc);
16379a9becdSAlexandre Courbot
16479a9becdSAlexandre Courbot int gpiod_is_active_low(const struct gpio_desc *desc);
16579a9becdSAlexandre Courbot int gpiod_cansleep(const struct gpio_desc *desc);
16679a9becdSAlexandre Courbot
16779a9becdSAlexandre Courbot int gpiod_to_irq(const struct gpio_desc *desc);
16818534df4SMuchun Song int gpiod_set_consumer_name(struct gpio_desc *desc, const char *name);
16979a9becdSAlexandre Courbot
17079a9becdSAlexandre Courbot /* Convert between the old gpio_ and new gpiod_ interfaces */
17179a9becdSAlexandre Courbot struct gpio_desc *gpio_to_desc(unsigned gpio);
17279a9becdSAlexandre Courbot int desc_to_gpio(const struct gpio_desc *desc);
17379a9becdSAlexandre Courbot
17413949fa9SDmitry Torokhov struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
17513949fa9SDmitry Torokhov const char *con_id, int index,
17613949fa9SDmitry Torokhov enum gpiod_flags flags,
17713949fa9SDmitry Torokhov const char *label);
1782d2f116dSDmitry Torokhov struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
179a264d10fSAndy Shevchenko struct fwnode_handle *child,
1802d2f116dSDmitry Torokhov const char *con_id, int index,
181b2987d74SAlexander Stein enum gpiod_flags flags,
182b2987d74SAlexander Stein const char *label);
1833498d869SLinus Walleij
18479a9becdSAlexandre Courbot #else /* CONFIG_GPIOLIB */
18579a9becdSAlexandre Courbot
186007094c8SBartosz Golaszewski #include <linux/bug.h>
187007094c8SBartosz Golaszewski #include <linux/kernel.h>
188007094c8SBartosz Golaszewski
gpiod_count(struct device * dev,const char * con_id)18966858527SRojhalat Ibrahim static inline int gpiod_count(struct device *dev, const char *con_id)
19066858527SRojhalat Ibrahim {
19166858527SRojhalat Ibrahim return 0;
19266858527SRojhalat Ibrahim }
19366858527SRojhalat Ibrahim
gpiod_get(struct device * dev,const char * con_id,enum gpiod_flags flags)194b17d1bf1SUwe Kleine-König static inline struct gpio_desc *__must_check gpiod_get(struct device *dev,
19579a9becdSAlexandre Courbot const char *con_id,
1960dbc8b7aSLinus Walleij enum gpiod_flags flags)
1970dbc8b7aSLinus Walleij {
1980dbc8b7aSLinus Walleij return ERR_PTR(-ENOSYS);
1990dbc8b7aSLinus Walleij }
2000dbc8b7aSLinus Walleij static inline struct gpio_desc *__must_check
gpiod_get_index(struct device * dev,const char * con_id,unsigned int idx,enum gpiod_flags flags)201b17d1bf1SUwe Kleine-König gpiod_get_index(struct device *dev,
2020dbc8b7aSLinus Walleij const char *con_id,
2030dbc8b7aSLinus Walleij unsigned int idx,
2040dbc8b7aSLinus Walleij enum gpiod_flags flags)
20579a9becdSAlexandre Courbot {
20679a9becdSAlexandre Courbot return ERR_PTR(-ENOSYS);
20779a9becdSAlexandre Courbot }
20829a1f233SThierry Reding
20929a1f233SThierry Reding static inline struct gpio_desc *__must_check
gpiod_get_optional(struct device * dev,const char * con_id,enum gpiod_flags flags)210b17d1bf1SUwe Kleine-König gpiod_get_optional(struct device *dev, const char *con_id,
2110dbc8b7aSLinus Walleij enum gpiod_flags flags)
21229a1f233SThierry Reding {
21322c40367SDmitry Torokhov return NULL;
21429a1f233SThierry Reding }
21529a1f233SThierry Reding
21629a1f233SThierry Reding static inline struct gpio_desc *__must_check
gpiod_get_index_optional(struct device * dev,const char * con_id,unsigned int index,enum gpiod_flags flags)217b17d1bf1SUwe Kleine-König gpiod_get_index_optional(struct device *dev, const char *con_id,
2180dbc8b7aSLinus Walleij unsigned int index, enum gpiod_flags flags)
21929a1f233SThierry Reding {
22022c40367SDmitry Torokhov return NULL;
22129a1f233SThierry Reding }
22229a1f233SThierry Reding
22366858527SRojhalat Ibrahim static inline struct gpio_descs *__must_check
gpiod_get_array(struct device * dev,const char * con_id,enum gpiod_flags flags)22466858527SRojhalat Ibrahim gpiod_get_array(struct device *dev, const char *con_id,
22566858527SRojhalat Ibrahim enum gpiod_flags flags)
22666858527SRojhalat Ibrahim {
22766858527SRojhalat Ibrahim return ERR_PTR(-ENOSYS);
22866858527SRojhalat Ibrahim }
22966858527SRojhalat Ibrahim
23066858527SRojhalat Ibrahim static inline struct gpio_descs *__must_check
gpiod_get_array_optional(struct device * dev,const char * con_id,enum gpiod_flags flags)23166858527SRojhalat Ibrahim gpiod_get_array_optional(struct device *dev, const char *con_id,
23266858527SRojhalat Ibrahim enum gpiod_flags flags)
23366858527SRojhalat Ibrahim {
23422c40367SDmitry Torokhov return NULL;
23566858527SRojhalat Ibrahim }
23666858527SRojhalat Ibrahim
gpiod_put(struct gpio_desc * desc)23779a9becdSAlexandre Courbot static inline void gpiod_put(struct gpio_desc *desc)
23879a9becdSAlexandre Courbot {
23979a9becdSAlexandre Courbot might_sleep();
24079a9becdSAlexandre Courbot
24179a9becdSAlexandre Courbot /* GPIO can never have been requested */
242ffe0bbabSBartosz Golaszewski WARN_ON(desc);
24379a9becdSAlexandre Courbot }
24479a9becdSAlexandre Courbot
devm_gpiod_unhinge(struct device * dev,struct gpio_desc * desc)245891ddbc7SLinus Walleij static inline void devm_gpiod_unhinge(struct device *dev,
246891ddbc7SLinus Walleij struct gpio_desc *desc)
247891ddbc7SLinus Walleij {
248891ddbc7SLinus Walleij might_sleep();
249891ddbc7SLinus Walleij
250891ddbc7SLinus Walleij /* GPIO can never have been requested */
251ffe0bbabSBartosz Golaszewski WARN_ON(desc);
252891ddbc7SLinus Walleij }
253891ddbc7SLinus Walleij
gpiod_put_array(struct gpio_descs * descs)25466858527SRojhalat Ibrahim static inline void gpiod_put_array(struct gpio_descs *descs)
25566858527SRojhalat Ibrahim {
25666858527SRojhalat Ibrahim might_sleep();
25766858527SRojhalat Ibrahim
25866858527SRojhalat Ibrahim /* GPIO can never have been requested */
259ffe0bbabSBartosz Golaszewski WARN_ON(descs);
26066858527SRojhalat Ibrahim }
26166858527SRojhalat Ibrahim
2620dbc8b7aSLinus Walleij static inline struct gpio_desc *__must_check
devm_gpiod_get(struct device * dev,const char * con_id,enum gpiod_flags flags)263b17d1bf1SUwe Kleine-König devm_gpiod_get(struct device *dev,
2640dbc8b7aSLinus Walleij const char *con_id,
2650dbc8b7aSLinus Walleij enum gpiod_flags flags)
26679a9becdSAlexandre Courbot {
26779a9becdSAlexandre Courbot return ERR_PTR(-ENOSYS);
26879a9becdSAlexandre Courbot }
26979a9becdSAlexandre Courbot static inline
2700dbc8b7aSLinus Walleij struct gpio_desc *__must_check
devm_gpiod_get_index(struct device * dev,const char * con_id,unsigned int idx,enum gpiod_flags flags)271b17d1bf1SUwe Kleine-König devm_gpiod_get_index(struct device *dev,
27279a9becdSAlexandre Courbot const char *con_id,
2730dbc8b7aSLinus Walleij unsigned int idx,
2740dbc8b7aSLinus Walleij enum gpiod_flags flags)
27579a9becdSAlexandre Courbot {
27679a9becdSAlexandre Courbot return ERR_PTR(-ENOSYS);
27779a9becdSAlexandre Courbot }
27829a1f233SThierry Reding
27929a1f233SThierry Reding static inline struct gpio_desc *__must_check
devm_gpiod_get_optional(struct device * dev,const char * con_id,enum gpiod_flags flags)280b17d1bf1SUwe Kleine-König devm_gpiod_get_optional(struct device *dev, const char *con_id,
2810dbc8b7aSLinus Walleij enum gpiod_flags flags)
28229a1f233SThierry Reding {
28322c40367SDmitry Torokhov return NULL;
28429a1f233SThierry Reding }
28529a1f233SThierry Reding
28629a1f233SThierry Reding static inline struct gpio_desc *__must_check
devm_gpiod_get_index_optional(struct device * dev,const char * con_id,unsigned int index,enum gpiod_flags flags)287b17d1bf1SUwe Kleine-König devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
2880dbc8b7aSLinus Walleij unsigned int index, enum gpiod_flags flags)
28929a1f233SThierry Reding {
29022c40367SDmitry Torokhov return NULL;
29129a1f233SThierry Reding }
29229a1f233SThierry Reding
293331758eeSRojhalat Ibrahim static inline struct gpio_descs *__must_check
devm_gpiod_get_array(struct device * dev,const char * con_id,enum gpiod_flags flags)294331758eeSRojhalat Ibrahim devm_gpiod_get_array(struct device *dev, const char *con_id,
295331758eeSRojhalat Ibrahim enum gpiod_flags flags)
296331758eeSRojhalat Ibrahim {
297331758eeSRojhalat Ibrahim return ERR_PTR(-ENOSYS);
298331758eeSRojhalat Ibrahim }
299331758eeSRojhalat Ibrahim
300331758eeSRojhalat Ibrahim static inline struct gpio_descs *__must_check
devm_gpiod_get_array_optional(struct device * dev,const char * con_id,enum gpiod_flags flags)301331758eeSRojhalat Ibrahim devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
302331758eeSRojhalat Ibrahim enum gpiod_flags flags)
303331758eeSRojhalat Ibrahim {
30422c40367SDmitry Torokhov return NULL;
305331758eeSRojhalat Ibrahim }
306331758eeSRojhalat Ibrahim
devm_gpiod_put(struct device * dev,struct gpio_desc * desc)30779a9becdSAlexandre Courbot static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
30879a9becdSAlexandre Courbot {
30979a9becdSAlexandre Courbot might_sleep();
31079a9becdSAlexandre Courbot
31179a9becdSAlexandre Courbot /* GPIO can never have been requested */
312ffe0bbabSBartosz Golaszewski WARN_ON(desc);
31379a9becdSAlexandre Courbot }
31479a9becdSAlexandre Courbot
devm_gpiod_put_array(struct device * dev,struct gpio_descs * descs)315331758eeSRojhalat Ibrahim static inline void devm_gpiod_put_array(struct device *dev,
316331758eeSRojhalat Ibrahim struct gpio_descs *descs)
317331758eeSRojhalat Ibrahim {
318331758eeSRojhalat Ibrahim might_sleep();
319331758eeSRojhalat Ibrahim
320331758eeSRojhalat Ibrahim /* GPIO can never have been requested */
321ffe0bbabSBartosz Golaszewski WARN_ON(descs);
322331758eeSRojhalat Ibrahim }
323331758eeSRojhalat Ibrahim
32479a9becdSAlexandre Courbot
gpiod_get_direction(const struct gpio_desc * desc)32579a9becdSAlexandre Courbot static inline int gpiod_get_direction(const struct gpio_desc *desc)
32679a9becdSAlexandre Courbot {
32779a9becdSAlexandre Courbot /* GPIO can never have been requested */
328ffe0bbabSBartosz Golaszewski WARN_ON(desc);
32979a9becdSAlexandre Courbot return -ENOSYS;
33079a9becdSAlexandre Courbot }
gpiod_direction_input(struct gpio_desc * desc)33179a9becdSAlexandre Courbot static inline int gpiod_direction_input(struct gpio_desc *desc)
33279a9becdSAlexandre Courbot {
33379a9becdSAlexandre Courbot /* GPIO can never have been requested */
334ffe0bbabSBartosz Golaszewski WARN_ON(desc);
33579a9becdSAlexandre Courbot return -ENOSYS;
33679a9becdSAlexandre Courbot }
gpiod_direction_output(struct gpio_desc * desc,int value)33779a9becdSAlexandre Courbot static inline int gpiod_direction_output(struct gpio_desc *desc, int value)
33879a9becdSAlexandre Courbot {
33979a9becdSAlexandre Courbot /* GPIO can never have been requested */
340ffe0bbabSBartosz Golaszewski WARN_ON(desc);
34179a9becdSAlexandre Courbot return -ENOSYS;
34279a9becdSAlexandre Courbot }
gpiod_direction_output_raw(struct gpio_desc * desc,int value)343ef70bbe1SPhilipp Zabel static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
344ef70bbe1SPhilipp Zabel {
345ef70bbe1SPhilipp Zabel /* GPIO can never have been requested */
346ffe0bbabSBartosz Golaszewski WARN_ON(desc);
347ef70bbe1SPhilipp Zabel return -ENOSYS;
348ef70bbe1SPhilipp Zabel }
gpiod_get_value(const struct gpio_desc * desc)34979a9becdSAlexandre Courbot static inline int gpiod_get_value(const struct gpio_desc *desc)
35079a9becdSAlexandre Courbot {
35179a9becdSAlexandre Courbot /* GPIO can never have been requested */
352ffe0bbabSBartosz Golaszewski WARN_ON(desc);
35379a9becdSAlexandre Courbot return 0;
35479a9becdSAlexandre Courbot }
gpiod_get_array_value(unsigned int array_size,struct gpio_desc ** desc_array,struct gpio_array * array_info,unsigned long * value_bitmap)355eec1d566SLukas Wunner static inline int gpiod_get_array_value(unsigned int array_size,
356eec1d566SLukas Wunner struct gpio_desc **desc_array,
35777588c14SJanusz Krzysztofik struct gpio_array *array_info,
358b9762bebSJanusz Krzysztofik unsigned long *value_bitmap)
359eec1d566SLukas Wunner {
360eec1d566SLukas Wunner /* GPIO can never have been requested */
361ffe0bbabSBartosz Golaszewski WARN_ON(desc_array);
362eec1d566SLukas Wunner return 0;
363eec1d566SLukas Wunner }
gpiod_set_value(struct gpio_desc * desc,int value)3648ce258f6SBartosz Golaszewski static inline int gpiod_set_value(struct gpio_desc *desc, int value)
36579a9becdSAlexandre Courbot {
36679a9becdSAlexandre Courbot /* GPIO can never have been requested */
367ffe0bbabSBartosz Golaszewski WARN_ON(desc);
3688ce258f6SBartosz Golaszewski return 0;
36979a9becdSAlexandre Courbot }
gpiod_set_array_value(unsigned int array_size,struct gpio_desc ** desc_array,struct gpio_array * array_info,unsigned long * value_bitmap)370cf9af0d5SGeert Uytterhoeven static inline int gpiod_set_array_value(unsigned int array_size,
3715f424243SRojhalat Ibrahim struct gpio_desc **desc_array,
37277588c14SJanusz Krzysztofik struct gpio_array *array_info,
373b9762bebSJanusz Krzysztofik unsigned long *value_bitmap)
3745f424243SRojhalat Ibrahim {
3755f424243SRojhalat Ibrahim /* GPIO can never have been requested */
376ffe0bbabSBartosz Golaszewski WARN_ON(desc_array);
377cf9af0d5SGeert Uytterhoeven return 0;
3785f424243SRojhalat Ibrahim }
gpiod_get_raw_value(const struct gpio_desc * desc)37979a9becdSAlexandre Courbot static inline int gpiod_get_raw_value(const struct gpio_desc *desc)
38079a9becdSAlexandre Courbot {
38179a9becdSAlexandre Courbot /* GPIO can never have been requested */
382ffe0bbabSBartosz Golaszewski WARN_ON(desc);
38379a9becdSAlexandre Courbot return 0;
38479a9becdSAlexandre Courbot }
gpiod_get_raw_array_value(unsigned int array_size,struct gpio_desc ** desc_array,struct gpio_array * array_info,unsigned long * value_bitmap)385eec1d566SLukas Wunner static inline int gpiod_get_raw_array_value(unsigned int array_size,
386eec1d566SLukas Wunner struct gpio_desc **desc_array,
38777588c14SJanusz Krzysztofik struct gpio_array *array_info,
388b9762bebSJanusz Krzysztofik unsigned long *value_bitmap)
389eec1d566SLukas Wunner {
390eec1d566SLukas Wunner /* GPIO can never have been requested */
391ffe0bbabSBartosz Golaszewski WARN_ON(desc_array);
392eec1d566SLukas Wunner return 0;
393eec1d566SLukas Wunner }
gpiod_set_raw_value(struct gpio_desc * desc,int value)3948ce258f6SBartosz Golaszewski static inline int gpiod_set_raw_value(struct gpio_desc *desc, int value)
39579a9becdSAlexandre Courbot {
39679a9becdSAlexandre Courbot /* GPIO can never have been requested */
397ffe0bbabSBartosz Golaszewski WARN_ON(desc);
3988ce258f6SBartosz Golaszewski return 0;
39979a9becdSAlexandre Courbot }
gpiod_set_raw_array_value(unsigned int array_size,struct gpio_desc ** desc_array,struct gpio_array * array_info,unsigned long * value_bitmap)4003027743fSLaura Abbott static inline int gpiod_set_raw_array_value(unsigned int array_size,
4015f424243SRojhalat Ibrahim struct gpio_desc **desc_array,
40277588c14SJanusz Krzysztofik struct gpio_array *array_info,
403b9762bebSJanusz Krzysztofik unsigned long *value_bitmap)
4045f424243SRojhalat Ibrahim {
4055f424243SRojhalat Ibrahim /* GPIO can never have been requested */
406ffe0bbabSBartosz Golaszewski WARN_ON(desc_array);
4073027743fSLaura Abbott return 0;
4085f424243SRojhalat Ibrahim }
40979a9becdSAlexandre Courbot
gpiod_get_value_cansleep(const struct gpio_desc * desc)41079a9becdSAlexandre Courbot static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc)
41179a9becdSAlexandre Courbot {
41279a9becdSAlexandre Courbot /* GPIO can never have been requested */
413ffe0bbabSBartosz Golaszewski WARN_ON(desc);
41479a9becdSAlexandre Courbot return 0;
41579a9becdSAlexandre Courbot }
gpiod_get_array_value_cansleep(unsigned int array_size,struct gpio_desc ** desc_array,struct gpio_array * array_info,unsigned long * value_bitmap)416eec1d566SLukas Wunner static inline int gpiod_get_array_value_cansleep(unsigned int array_size,
417eec1d566SLukas Wunner struct gpio_desc **desc_array,
41877588c14SJanusz Krzysztofik struct gpio_array *array_info,
419b9762bebSJanusz Krzysztofik unsigned long *value_bitmap)
420eec1d566SLukas Wunner {
421eec1d566SLukas Wunner /* GPIO can never have been requested */
422ffe0bbabSBartosz Golaszewski WARN_ON(desc_array);
423eec1d566SLukas Wunner return 0;
424eec1d566SLukas Wunner }
gpiod_set_value_cansleep(struct gpio_desc * desc,int value)4258ce258f6SBartosz Golaszewski static inline int gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
42679a9becdSAlexandre Courbot {
42779a9becdSAlexandre Courbot /* GPIO can never have been requested */
428ffe0bbabSBartosz Golaszewski WARN_ON(desc);
4298ce258f6SBartosz Golaszewski return 0;
43079a9becdSAlexandre Courbot }
gpiod_set_array_value_cansleep(unsigned int array_size,struct gpio_desc ** desc_array,struct gpio_array * array_info,unsigned long * value_bitmap)431cf9af0d5SGeert Uytterhoeven static inline int gpiod_set_array_value_cansleep(unsigned int array_size,
4325f424243SRojhalat Ibrahim struct gpio_desc **desc_array,
43377588c14SJanusz Krzysztofik struct gpio_array *array_info,
434b9762bebSJanusz Krzysztofik unsigned long *value_bitmap)
4355f424243SRojhalat Ibrahim {
4365f424243SRojhalat Ibrahim /* GPIO can never have been requested */
437ffe0bbabSBartosz Golaszewski WARN_ON(desc_array);
438cf9af0d5SGeert Uytterhoeven return 0;
4395f424243SRojhalat Ibrahim }
gpiod_get_raw_value_cansleep(const struct gpio_desc * desc)44079a9becdSAlexandre Courbot static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
44179a9becdSAlexandre Courbot {
44279a9becdSAlexandre Courbot /* GPIO can never have been requested */
443ffe0bbabSBartosz Golaszewski WARN_ON(desc);
44479a9becdSAlexandre Courbot return 0;
44579a9becdSAlexandre Courbot }
gpiod_get_raw_array_value_cansleep(unsigned int array_size,struct gpio_desc ** desc_array,struct gpio_array * array_info,unsigned long * value_bitmap)446eec1d566SLukas Wunner static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
447eec1d566SLukas Wunner struct gpio_desc **desc_array,
44877588c14SJanusz Krzysztofik struct gpio_array *array_info,
449b9762bebSJanusz Krzysztofik unsigned long *value_bitmap)
450eec1d566SLukas Wunner {
451eec1d566SLukas Wunner /* GPIO can never have been requested */
452ffe0bbabSBartosz Golaszewski WARN_ON(desc_array);
453eec1d566SLukas Wunner return 0;
454eec1d566SLukas Wunner }
gpiod_set_raw_value_cansleep(struct gpio_desc * desc,int value)4558ce258f6SBartosz Golaszewski static inline int gpiod_set_raw_value_cansleep(struct gpio_desc *desc,
45679a9becdSAlexandre Courbot int value)
45779a9becdSAlexandre Courbot {
45879a9becdSAlexandre Courbot /* GPIO can never have been requested */
459ffe0bbabSBartosz Golaszewski WARN_ON(desc);
4608ce258f6SBartosz Golaszewski return 0;
46179a9becdSAlexandre Courbot }
gpiod_set_raw_array_value_cansleep(unsigned int array_size,struct gpio_desc ** desc_array,struct gpio_array * array_info,unsigned long * value_bitmap)4623027743fSLaura Abbott static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
4635f424243SRojhalat Ibrahim struct gpio_desc **desc_array,
46477588c14SJanusz Krzysztofik struct gpio_array *array_info,
465b9762bebSJanusz Krzysztofik unsigned long *value_bitmap)
4665f424243SRojhalat Ibrahim {
4675f424243SRojhalat Ibrahim /* GPIO can never have been requested */
468ffe0bbabSBartosz Golaszewski WARN_ON(desc_array);
4693027743fSLaura Abbott return 0;
4705f424243SRojhalat Ibrahim }
47179a9becdSAlexandre Courbot
gpiod_set_config(struct gpio_desc * desc,unsigned long config)4728ced32ffSGeert Uytterhoeven static inline int gpiod_set_config(struct gpio_desc *desc, unsigned long config)
4738ced32ffSGeert Uytterhoeven {
4748ced32ffSGeert Uytterhoeven /* GPIO can never have been requested */
4758ced32ffSGeert Uytterhoeven WARN_ON(desc);
4768ced32ffSGeert Uytterhoeven return -ENOSYS;
4778ced32ffSGeert Uytterhoeven }
4788ced32ffSGeert Uytterhoeven
gpiod_set_debounce(struct gpio_desc * desc,unsigned int debounce)47913daf489SAndy Shevchenko static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned int debounce)
48079a9becdSAlexandre Courbot {
48179a9becdSAlexandre Courbot /* GPIO can never have been requested */
482ffe0bbabSBartosz Golaszewski WARN_ON(desc);
48379a9becdSAlexandre Courbot return -ENOSYS;
48479a9becdSAlexandre Courbot }
48579a9becdSAlexandre Courbot
gpiod_toggle_active_low(struct gpio_desc * desc)486d3a5bcb4SMichał Mirosław static inline void gpiod_toggle_active_low(struct gpio_desc *desc)
487d3a5bcb4SMichał Mirosław {
488d3a5bcb4SMichał Mirosław /* GPIO can never have been requested */
489d3a5bcb4SMichał Mirosław WARN_ON(desc);
490d3a5bcb4SMichał Mirosław }
491d3a5bcb4SMichał Mirosław
gpiod_is_active_low(const struct gpio_desc * desc)49279a9becdSAlexandre Courbot static inline int gpiod_is_active_low(const struct gpio_desc *desc)
49379a9becdSAlexandre Courbot {
49479a9becdSAlexandre Courbot /* GPIO can never have been requested */
495ffe0bbabSBartosz Golaszewski WARN_ON(desc);
49679a9becdSAlexandre Courbot return 0;
49779a9becdSAlexandre Courbot }
gpiod_cansleep(const struct gpio_desc * desc)49879a9becdSAlexandre Courbot static inline int gpiod_cansleep(const struct gpio_desc *desc)
49979a9becdSAlexandre Courbot {
50079a9becdSAlexandre Courbot /* GPIO can never have been requested */
501ffe0bbabSBartosz Golaszewski WARN_ON(desc);
50279a9becdSAlexandre Courbot return 0;
50379a9becdSAlexandre Courbot }
50479a9becdSAlexandre Courbot
gpiod_to_irq(const struct gpio_desc * desc)50579a9becdSAlexandre Courbot static inline int gpiod_to_irq(const struct gpio_desc *desc)
50679a9becdSAlexandre Courbot {
50779a9becdSAlexandre Courbot /* GPIO can never have been requested */
508ffe0bbabSBartosz Golaszewski WARN_ON(desc);
50979a9becdSAlexandre Courbot return -EINVAL;
51079a9becdSAlexandre Courbot }
51179a9becdSAlexandre Courbot
gpiod_set_consumer_name(struct gpio_desc * desc,const char * name)51218534df4SMuchun Song static inline int gpiod_set_consumer_name(struct gpio_desc *desc,
51318534df4SMuchun Song const char *name)
51490b39402SLinus Walleij {
51590b39402SLinus Walleij /* GPIO can never have been requested */
516ffe0bbabSBartosz Golaszewski WARN_ON(desc);
51718534df4SMuchun Song return -EINVAL;
51890b39402SLinus Walleij }
51990b39402SLinus Walleij
gpio_to_desc(unsigned gpio)52079a9becdSAlexandre Courbot static inline struct gpio_desc *gpio_to_desc(unsigned gpio)
52179a9becdSAlexandre Courbot {
522c5510b8dSKrzysztof Kozlowski return NULL;
52379a9becdSAlexandre Courbot }
524c0017ed7SMarkus Pargmann
desc_to_gpio(const struct gpio_desc * desc)52579a9becdSAlexandre Courbot static inline int desc_to_gpio(const struct gpio_desc *desc)
52679a9becdSAlexandre Courbot {
52779a9becdSAlexandre Courbot /* GPIO can never have been requested */
528ffe0bbabSBartosz Golaszewski WARN_ON(desc);
52979a9becdSAlexandre Courbot return -EINVAL;
53079a9becdSAlexandre Courbot }
53179a9becdSAlexandre Courbot
532a264d10fSAndy Shevchenko static inline
fwnode_gpiod_get_index(struct fwnode_handle * fwnode,const char * con_id,int index,enum gpiod_flags flags,const char * label)53313949fa9SDmitry Torokhov struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
53413949fa9SDmitry Torokhov const char *con_id, int index,
53513949fa9SDmitry Torokhov enum gpiod_flags flags,
53613949fa9SDmitry Torokhov const char *label)
53713949fa9SDmitry Torokhov {
53813949fa9SDmitry Torokhov return ERR_PTR(-ENOSYS);
53913949fa9SDmitry Torokhov }
54013949fa9SDmitry Torokhov
54113949fa9SDmitry Torokhov static inline
devm_fwnode_gpiod_get_index(struct device * dev,struct fwnode_handle * fwnode,const char * con_id,int index,enum gpiod_flags flags,const char * label)5422d2f116dSDmitry Torokhov struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
5432d2f116dSDmitry Torokhov struct fwnode_handle *fwnode,
544537b94daSBoris Brezillon const char *con_id, int index,
545b2987d74SAlexander Stein enum gpiod_flags flags,
546b2987d74SAlexander Stein const char *label)
547496e7ce2SGeert Uytterhoeven {
548496e7ce2SGeert Uytterhoeven return ERR_PTR(-ENOSYS);
549496e7ce2SGeert Uytterhoeven }
550496e7ce2SGeert Uytterhoeven
55179a9becdSAlexandre Courbot #endif /* CONFIG_GPIOLIB */
55279a9becdSAlexandre Courbot
55363cdf624SBartosz Golaszewski #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_HTE)
55463cdf624SBartosz Golaszewski int gpiod_enable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags);
55563cdf624SBartosz Golaszewski int gpiod_disable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags);
55663cdf624SBartosz Golaszewski #else
557007094c8SBartosz Golaszewski
558007094c8SBartosz Golaszewski #include <linux/bug.h>
559007094c8SBartosz Golaszewski
gpiod_enable_hw_timestamp_ns(struct gpio_desc * desc,unsigned long flags)56063cdf624SBartosz Golaszewski static inline int gpiod_enable_hw_timestamp_ns(struct gpio_desc *desc,
56163cdf624SBartosz Golaszewski unsigned long flags)
56263cdf624SBartosz Golaszewski {
56363cdf624SBartosz Golaszewski if (!IS_ENABLED(CONFIG_GPIOLIB))
56463cdf624SBartosz Golaszewski WARN_ON(desc);
56563cdf624SBartosz Golaszewski
56663cdf624SBartosz Golaszewski return -ENOSYS;
56763cdf624SBartosz Golaszewski }
gpiod_disable_hw_timestamp_ns(struct gpio_desc * desc,unsigned long flags)56863cdf624SBartosz Golaszewski static inline int gpiod_disable_hw_timestamp_ns(struct gpio_desc *desc,
56963cdf624SBartosz Golaszewski unsigned long flags)
57063cdf624SBartosz Golaszewski {
57163cdf624SBartosz Golaszewski if (!IS_ENABLED(CONFIG_GPIOLIB))
57263cdf624SBartosz Golaszewski WARN_ON(desc);
57363cdf624SBartosz Golaszewski
57463cdf624SBartosz Golaszewski return -ENOSYS;
57563cdf624SBartosz Golaszewski }
57663cdf624SBartosz Golaszewski #endif /* CONFIG_GPIOLIB && CONFIG_HTE */
57763cdf624SBartosz Golaszewski
578537b94daSBoris Brezillon static inline
devm_fwnode_gpiod_get(struct device * dev,struct fwnode_handle * fwnode,const char * con_id,enum gpiod_flags flags,const char * label)5792d2f116dSDmitry Torokhov struct gpio_desc *devm_fwnode_gpiod_get(struct device *dev,
5802d2f116dSDmitry Torokhov struct fwnode_handle *fwnode,
5812d2f116dSDmitry Torokhov const char *con_id,
5822d2f116dSDmitry Torokhov enum gpiod_flags flags,
5832d2f116dSDmitry Torokhov const char *label)
5842d2f116dSDmitry Torokhov {
5852d2f116dSDmitry Torokhov return devm_fwnode_gpiod_get_index(dev, fwnode, con_id, 0,
5862d2f116dSDmitry Torokhov flags, label);
5872d2f116dSDmitry Torokhov }
5882d2f116dSDmitry Torokhov
5892838bf94SAndy Shevchenko struct acpi_gpio_params {
5902838bf94SAndy Shevchenko unsigned int crs_entry_index;
5912838bf94SAndy Shevchenko unsigned int line_index;
5922838bf94SAndy Shevchenko bool active_low;
5932838bf94SAndy Shevchenko };
5942838bf94SAndy Shevchenko
5952838bf94SAndy Shevchenko struct acpi_gpio_mapping {
5962838bf94SAndy Shevchenko const char *name;
5972838bf94SAndy Shevchenko const struct acpi_gpio_params *data;
5982838bf94SAndy Shevchenko unsigned int size;
5992838bf94SAndy Shevchenko
6002838bf94SAndy Shevchenko /* Ignore IoRestriction field */
6012838bf94SAndy Shevchenko #define ACPI_GPIO_QUIRK_NO_IO_RESTRICTION BIT(0)
6022838bf94SAndy Shevchenko /*
6032838bf94SAndy Shevchenko * When ACPI GPIO mapping table is in use the index parameter inside it
6042838bf94SAndy Shevchenko * refers to the GPIO resource in _CRS method. That index has no
6052838bf94SAndy Shevchenko * distinction of actual type of the resource. When consumer wants to
6062838bf94SAndy Shevchenko * get GpioIo type explicitly, this quirk may be used.
6072838bf94SAndy Shevchenko */
6082838bf94SAndy Shevchenko #define ACPI_GPIO_QUIRK_ONLY_GPIOIO BIT(1)
60962d5247dSAndy Shevchenko /* Use given pin as an absolute GPIO number in the system */
61062d5247dSAndy Shevchenko #define ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER BIT(2)
6112838bf94SAndy Shevchenko
6122838bf94SAndy Shevchenko unsigned int quirks;
6132838bf94SAndy Shevchenko };
6142838bf94SAndy Shevchenko
615b3907521SAndy Shevchenko #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_ACPI)
616b3907521SAndy Shevchenko
6172838bf94SAndy Shevchenko int acpi_dev_add_driver_gpios(struct acpi_device *adev,
6182838bf94SAndy Shevchenko const struct acpi_gpio_mapping *gpios);
6192838bf94SAndy Shevchenko void acpi_dev_remove_driver_gpios(struct acpi_device *adev);
6202838bf94SAndy Shevchenko
6212838bf94SAndy Shevchenko int devm_acpi_dev_add_driver_gpios(struct device *dev,
6222838bf94SAndy Shevchenko const struct acpi_gpio_mapping *gpios);
6232838bf94SAndy Shevchenko
6242838bf94SAndy Shevchenko #else /* CONFIG_GPIOLIB && CONFIG_ACPI */
6252838bf94SAndy Shevchenko
acpi_dev_add_driver_gpios(struct acpi_device * adev,const struct acpi_gpio_mapping * gpios)6262838bf94SAndy Shevchenko static inline int acpi_dev_add_driver_gpios(struct acpi_device *adev,
6272838bf94SAndy Shevchenko const struct acpi_gpio_mapping *gpios)
6282838bf94SAndy Shevchenko {
6292838bf94SAndy Shevchenko return -ENXIO;
6302838bf94SAndy Shevchenko }
acpi_dev_remove_driver_gpios(struct acpi_device * adev)6312838bf94SAndy Shevchenko static inline void acpi_dev_remove_driver_gpios(struct acpi_device *adev) {}
6322838bf94SAndy Shevchenko
devm_acpi_dev_add_driver_gpios(struct device * dev,const struct acpi_gpio_mapping * gpios)6332838bf94SAndy Shevchenko static inline int devm_acpi_dev_add_driver_gpios(struct device *dev,
6342838bf94SAndy Shevchenko const struct acpi_gpio_mapping *gpios)
6352838bf94SAndy Shevchenko {
6362838bf94SAndy Shevchenko return -ENXIO;
6372838bf94SAndy Shevchenko }
6382838bf94SAndy Shevchenko
6392838bf94SAndy Shevchenko #endif /* CONFIG_GPIOLIB && CONFIG_ACPI */
6402838bf94SAndy Shevchenko
6412838bf94SAndy Shevchenko
64279a9becdSAlexandre Courbot #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
64379a9becdSAlexandre Courbot
64479a9becdSAlexandre Courbot int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
64579a9becdSAlexandre Courbot int gpiod_export_link(struct device *dev, const char *name,
64679a9becdSAlexandre Courbot struct gpio_desc *desc);
64779a9becdSAlexandre Courbot void gpiod_unexport(struct gpio_desc *desc);
64879a9becdSAlexandre Courbot
64979a9becdSAlexandre Courbot #else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
65079a9becdSAlexandre Courbot
gpiod_export(struct gpio_desc * desc,bool direction_may_change)65179a9becdSAlexandre Courbot static inline int gpiod_export(struct gpio_desc *desc,
65279a9becdSAlexandre Courbot bool direction_may_change)
65379a9becdSAlexandre Courbot {
65479a9becdSAlexandre Courbot return -ENOSYS;
65579a9becdSAlexandre Courbot }
65679a9becdSAlexandre Courbot
gpiod_export_link(struct device * dev,const char * name,struct gpio_desc * desc)65779a9becdSAlexandre Courbot static inline int gpiod_export_link(struct device *dev, const char *name,
65879a9becdSAlexandre Courbot struct gpio_desc *desc)
65979a9becdSAlexandre Courbot {
66079a9becdSAlexandre Courbot return -ENOSYS;
66179a9becdSAlexandre Courbot }
66279a9becdSAlexandre Courbot
gpiod_unexport(struct gpio_desc * desc)66379a9becdSAlexandre Courbot static inline void gpiod_unexport(struct gpio_desc *desc)
66479a9becdSAlexandre Courbot {
66579a9becdSAlexandre Courbot }
66679a9becdSAlexandre Courbot
66779a9becdSAlexandre Courbot #endif /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
66879a9becdSAlexandre Courbot
gpiod_multi_set_value_cansleep(struct gpio_descs * descs,unsigned long * value_bitmap)66991931af1SDavid Lechner static inline int gpiod_multi_set_value_cansleep(struct gpio_descs *descs,
67091931af1SDavid Lechner unsigned long *value_bitmap)
67191931af1SDavid Lechner {
67291931af1SDavid Lechner if (IS_ERR_OR_NULL(descs))
67391931af1SDavid Lechner return PTR_ERR_OR_ZERO(descs);
67491931af1SDavid Lechner
67591931af1SDavid Lechner return gpiod_set_array_value_cansleep(descs->ndescs, descs->desc,
67691931af1SDavid Lechner descs->info, value_bitmap);
67791931af1SDavid Lechner }
67891931af1SDavid Lechner
67979a9becdSAlexandre Courbot #endif
680