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