179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#ifndef __LINUX_GPIO_CONSUMER_H
279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#define __LINUX_GPIO_CONSUMER_H
379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
4cdf86cd233207ed992a647f0b9d42c60735756e7Arnd Bergmann#include <linux/bug.h>
579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#include <linux/err.h>
679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#include <linux/kernel.h>
779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstruct device;
979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
1079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot/**
1179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot * Opaque descriptor for a GPIO. These are obtained using gpiod_get() and are
1279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot * preferable to the old integer-based handles.
1379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot *
1479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot * Contrary to integers, a pointer to a gpio_desc is guaranteed to be valid
1579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot * until the GPIO is released.
1679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot */
1779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstruct gpio_desc;
1879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
1939b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot#define GPIOD_FLAGS_BIT_DIR_SET		BIT(0)
2039b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot#define GPIOD_FLAGS_BIT_DIR_OUT		BIT(1)
2139b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot#define GPIOD_FLAGS_BIT_DIR_VAL		BIT(2)
2239b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot
2339b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot/**
2439b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot * Optional flags that can be passed to one of gpiod_* to configure direction
2539b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot * and output value. These values cannot be OR'd.
2639b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot */
2739b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbotenum gpiod_flags {
2839b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot	GPIOD_ASIS	= 0,
2939b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot	GPIOD_IN	= GPIOD_FLAGS_BIT_DIR_SET,
3039b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot	GPIOD_OUT_LOW	= GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT,
3139b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot	GPIOD_OUT_HIGH	= GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT |
3239b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot			  GPIOD_FLAGS_BIT_DIR_VAL,
3339b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot};
3439b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot
3558b84f6a97f7f8811e0636836734809ff52cad43Linus Walleij#ifdef CONFIG_GPIOLIB
3658b84f6a97f7f8811e0636836734809ff52cad43Linus Walleij
37bae48da237fcedd7ad09569025483b988635efb7Alexandre Courbot/* Acquire and dispose GPIOs */
3839b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbotstruct gpio_desc *__must_check __gpiod_get(struct device *dev,
3939b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot					 const char *con_id,
4039b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot					 enum gpiod_flags flags);
4139b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbotstruct gpio_desc *__must_check __gpiod_get_index(struct device *dev,
42bae48da237fcedd7ad09569025483b988635efb7Alexandre Courbot					       const char *con_id,
4339b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot					       unsigned int idx,
4439b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot					       enum gpiod_flags flags);
4539b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbotstruct gpio_desc *__must_check __gpiod_get_optional(struct device *dev,
4639b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot						  const char *con_id,
4739b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot						  enum gpiod_flags flags);
4839b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbotstruct gpio_desc *__must_check __gpiod_get_index_optional(struct device *dev,
4929a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding							const char *con_id,
5039b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot							unsigned int index,
5139b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot							enum gpiod_flags flags);
52bae48da237fcedd7ad09569025483b988635efb7Alexandre Courbotvoid gpiod_put(struct gpio_desc *desc);
53bae48da237fcedd7ad09569025483b988635efb7Alexandre Courbot
5439b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbotstruct gpio_desc *__must_check __devm_gpiod_get(struct device *dev,
5539b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot					      const char *con_id,
5639b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot					      enum gpiod_flags flags);
5739b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbotstruct gpio_desc *__must_check __devm_gpiod_get_index(struct device *dev,
58bae48da237fcedd7ad09569025483b988635efb7Alexandre Courbot						    const char *con_id,
5939b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot						    unsigned int idx,
6039b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot						    enum gpiod_flags flags);
6139b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbotstruct gpio_desc *__must_check __devm_gpiod_get_optional(struct device *dev,
6239b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot						       const char *con_id,
6339b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot						       enum gpiod_flags flags);
6429a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Redingstruct gpio_desc *__must_check
6539b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot__devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
6639b2bbe3d715cf5013b5c48695ccdd25bd3bf120Alexandre Courbot			      unsigned int index, enum gpiod_flags flags);
67bae48da237fcedd7ad09569025483b988635efb7Alexandre Courbotvoid devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
68bae48da237fcedd7ad09569025483b988635efb7Alexandre Courbot
6979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_get_direction(const struct gpio_desc *desc);
7079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_direction_input(struct gpio_desc *desc);
7179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_direction_output(struct gpio_desc *desc, int value);
72ef70bbe1aaa612f75360e5df5952fddec50b7ca9Philipp Zabelint gpiod_direction_output_raw(struct gpio_desc *desc, int value);
7379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
7479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot/* Value get/set from non-sleeping context */
7579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_get_value(const struct gpio_desc *desc);
7679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotvoid gpiod_set_value(struct gpio_desc *desc, int value);
7779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_get_raw_value(const struct gpio_desc *desc);
7879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotvoid gpiod_set_raw_value(struct gpio_desc *desc, int value);
7979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
8079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot/* Value get/set from sleeping context */
8179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_get_value_cansleep(const struct gpio_desc *desc);
8279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotvoid gpiod_set_value_cansleep(struct gpio_desc *desc, int value);
8379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_get_raw_value_cansleep(const struct gpio_desc *desc);
8479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotvoid gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value);
8579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
8679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
8779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
8879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_is_active_low(const struct gpio_desc *desc);
8979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_cansleep(const struct gpio_desc *desc);
9079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
9179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_to_irq(const struct gpio_desc *desc);
9279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
9379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot/* Convert between the old gpio_ and new gpiod_ interfaces */
9479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstruct gpio_desc *gpio_to_desc(unsigned gpio);
9579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint desc_to_gpio(const struct gpio_desc *desc);
9679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
9779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#else /* CONFIG_GPIOLIB */
9879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
990dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleijstatic inline struct gpio_desc *__must_check __gpiod_get(struct device *dev,
1000dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij						const char *con_id,
1010dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij						enum gpiod_flags flags)
10279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
10379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return ERR_PTR(-ENOSYS);
10479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
1050dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleijstatic inline struct gpio_desc *__must_check
1060dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij__gpiod_get_index(struct device *dev,
1070dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij		  const char *con_id,
1080dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij		  unsigned int idx,
1090dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij		  enum gpiod_flags flags)
11079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
11179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return ERR_PTR(-ENOSYS);
11279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
11329a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding
11429a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Redingstatic inline struct gpio_desc *__must_check
1150dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij__gpiod_get_optional(struct device *dev, const char *con_id,
1160dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij		     enum gpiod_flags flags)
11729a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding{
11829a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding	return ERR_PTR(-ENOSYS);
11929a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding}
12029a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding
12129a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Redingstatic inline struct gpio_desc *__must_check
1220dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij__gpiod_get_index_optional(struct device *dev, const char *con_id,
1230dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij			   unsigned int index, enum gpiod_flags flags)
12429a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding{
12529a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding	return ERR_PTR(-ENOSYS);
12629a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding}
12729a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding
12879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline void gpiod_put(struct gpio_desc *desc)
12979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
13079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	might_sleep();
13179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
13279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
13379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
13479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
13579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
1360dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleijstatic inline struct gpio_desc *__must_check
1370dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij__devm_gpiod_get(struct device *dev,
1380dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij		 const char *con_id,
1390dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij		 enum gpiod_flags flags)
14079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
14179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return ERR_PTR(-ENOSYS);
14279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
14379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline
1440dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleijstruct gpio_desc *__must_check
1450dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij__devm_gpiod_get_index(struct device *dev,
1460dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij		       const char *con_id,
1470dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij		       unsigned int idx,
1480dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij		       enum gpiod_flags flags)
14979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
15079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return ERR_PTR(-ENOSYS);
15179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
15229a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding
15329a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Redingstatic inline struct gpio_desc *__must_check
1540dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij__devm_gpiod_get_optional(struct device *dev, const char *con_id,
1550dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij			  enum gpiod_flags flags)
15629a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding{
15729a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding	return ERR_PTR(-ENOSYS);
15829a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding}
15929a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding
16029a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Redingstatic inline struct gpio_desc *__must_check
1610dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij__devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
1620dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij				unsigned int index, enum gpiod_flags flags)
16329a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding{
16429a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding	return ERR_PTR(-ENOSYS);
16529a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding}
16629a1f2333e07bbbecb920cc78fd035fe8f53207aThierry Reding
16779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
16879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
16979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	might_sleep();
17079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
17179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
17279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
17379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
17479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
17579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
17679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_get_direction(const struct gpio_desc *desc)
17779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
17879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
17979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
18079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return -ENOSYS;
18179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
18279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_direction_input(struct gpio_desc *desc)
18379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
18479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
18579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
18679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return -ENOSYS;
18779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
18879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_direction_output(struct gpio_desc *desc, int value)
18979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
19079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
19179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
19279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return -ENOSYS;
19379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
194ef70bbe1aaa612f75360e5df5952fddec50b7ca9Philipp Zabelstatic inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
195ef70bbe1aaa612f75360e5df5952fddec50b7ca9Philipp Zabel{
196ef70bbe1aaa612f75360e5df5952fddec50b7ca9Philipp Zabel	/* GPIO can never have been requested */
197ef70bbe1aaa612f75360e5df5952fddec50b7ca9Philipp Zabel	WARN_ON(1);
198ef70bbe1aaa612f75360e5df5952fddec50b7ca9Philipp Zabel	return -ENOSYS;
199ef70bbe1aaa612f75360e5df5952fddec50b7ca9Philipp Zabel}
20079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
20179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
20279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_get_value(const struct gpio_desc *desc)
20379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
20479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
20579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
20679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return 0;
20779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
20879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline void gpiod_set_value(struct gpio_desc *desc, int value)
20979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
21079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
21179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
21279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
21379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_get_raw_value(const struct gpio_desc *desc)
21479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
21579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
21679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
21779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return 0;
21879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
21979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline void gpiod_set_raw_value(struct gpio_desc *desc, int value)
22079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
22179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
22279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
22379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
22479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
22579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_get_value_cansleep(const struct gpio_desc *desc)
22679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
22779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
22879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
22979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return 0;
23079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
23179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
23279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
23379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
23479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
23579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
23679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
23779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
23879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
23979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
24079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return 0;
24179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
24279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc,
24379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot						int value)
24479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
24579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
24679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
24779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
24879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
24979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
25079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
25179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
25279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
25379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return -ENOSYS;
25479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
25579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
25679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_is_active_low(const struct gpio_desc *desc)
25779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
25879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
25979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
26079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return 0;
26179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
26279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_cansleep(const struct gpio_desc *desc)
26379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
26479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
26579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
26679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return 0;
26779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
26879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
26979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_to_irq(const struct gpio_desc *desc)
27079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
27179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
27279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
27379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return -EINVAL;
27479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
27579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
27679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline struct gpio_desc *gpio_to_desc(unsigned gpio)
27779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
27879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return ERR_PTR(-EINVAL);
27979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
28079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int desc_to_gpio(const struct gpio_desc *desc)
28179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
28279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	/* GPIO can never have been requested */
28379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	WARN_ON(1);
28479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return -EINVAL;
28579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
28679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
28779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#endif /* CONFIG_GPIOLIB */
28879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
2890dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij/*
2900dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij * Vararg-hacks! This is done to transition the kernel to always pass
2910dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij * the options flags argument to the below functions. During a transition
2920dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij * phase these vararg macros make both old-and-newstyle code compile,
2930dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij * but when all calls to the elder API are removed, these should go away
2940dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij * and the __gpiod_get() etc functions above be renamed just gpiod_get()
2950dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij * etc.
2960dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij */
2970dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define __gpiod_get(dev, con_id, flags, ...) __gpiod_get(dev, con_id, flags)
2980dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define gpiod_get(varargs...) __gpiod_get(varargs, 0)
2990dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define __gpiod_get_index(dev, con_id, index, flags, ...)		\
3000dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__gpiod_get_index(dev, con_id, index, flags)
3010dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define gpiod_get_index(varargs...) __gpiod_get_index(varargs, 0)
3020dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define __gpiod_get_optional(dev, con_id, flags, ...)			\
3030dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__gpiod_get_optional(dev, con_id, flags)
3040dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define gpiod_get_optional(varargs...) __gpiod_get_optional(varargs, 0)
3050dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define __gpiod_get_index_optional(dev, con_id, index, flags, ...)	\
3060dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__gpiod_get_index_optional(dev, con_id, index, flags)
3070dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define gpiod_get_index_optional(varargs...)				\
3080dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__gpiod_get_index_optional(varargs, 0)
3090dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define __devm_gpiod_get(dev, con_id, flags, ...)			\
3100dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__devm_gpiod_get(dev, con_id, flags)
3110dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define devm_gpiod_get(varargs...) __devm_gpiod_get(varargs, 0)
3120dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define __devm_gpiod_get_index(dev, con_id, index, flags, ...)		\
3130dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__devm_gpiod_get_index(dev, con_id, index, flags)
3140dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define devm_gpiod_get_index(varargs...) __devm_gpiod_get_index(varargs, 0)
3150dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define __devm_gpiod_get_optional(dev, con_id, flags, ...)		\
3160dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__devm_gpiod_get_optional(dev, con_id, flags)
3170dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define devm_gpiod_get_optional(varargs...)				\
3180dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__devm_gpiod_get_optional(varargs, 0)
3190dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define __devm_gpiod_get_index_optional(dev, con_id, index, flags, ...)	\
3200dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__devm_gpiod_get_index_optional(dev, con_id, index, flags)
3210dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij#define devm_gpiod_get_index_optional(varargs...)			\
3220dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij	__devm_gpiod_get_index_optional(varargs, 0)
3230dbc8b7afef6e4fddcfebcbacbeb269a0a3b06d5Linus Walleij
32479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
32579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
32679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_export(struct gpio_desc *desc, bool direction_may_change);
32779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_export_link(struct device *dev, const char *name,
32879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot		      struct gpio_desc *desc);
32979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotint gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value);
33079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotvoid gpiod_unexport(struct gpio_desc *desc);
33179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
33279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#else  /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
33379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
33479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_export(struct gpio_desc *desc,
33579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot			       bool direction_may_change)
33679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
33779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return -ENOSYS;
33879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
33979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
34079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_export_link(struct device *dev, const char *name,
34179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot				    struct gpio_desc *desc)
34279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
34379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return -ENOSYS;
34479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
34579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
34679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value)
34779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
34879a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot	return -ENOSYS;
34979a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
35079a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
35179a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbotstatic inline void gpiod_unexport(struct gpio_desc *desc)
35279a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot{
35379a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot}
35479a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
35579a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#endif /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
35679a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot
35779a9becda8940deb2274b5aa4577c86d52ee7ecbAlexandre Courbot#endif
358