xref: /openbmc/linux/include/linux/gpio.h (revision 586a87e6)
17560fa60SDavid Brownell #ifndef __LINUX_GPIO_H
27560fa60SDavid Brownell #define __LINUX_GPIO_H
37560fa60SDavid Brownell 
47563bbf8SMark Brown #include <linux/errno.h>
57563bbf8SMark Brown 
67560fa60SDavid Brownell /* see Documentation/gpio.txt */
77560fa60SDavid Brownell 
8c001fb72SRandy Dunlap /* make these flag values available regardless of GPIO kconfig options */
9c001fb72SRandy Dunlap #define GPIOF_DIR_OUT	(0 << 0)
10c001fb72SRandy Dunlap #define GPIOF_DIR_IN	(1 << 0)
11c001fb72SRandy Dunlap 
12c001fb72SRandy Dunlap #define GPIOF_INIT_LOW	(0 << 1)
13c001fb72SRandy Dunlap #define GPIOF_INIT_HIGH	(1 << 1)
14c001fb72SRandy Dunlap 
15c001fb72SRandy Dunlap #define GPIOF_IN		(GPIOF_DIR_IN)
16c001fb72SRandy Dunlap #define GPIOF_OUT_INIT_LOW	(GPIOF_DIR_OUT | GPIOF_INIT_LOW)
17c001fb72SRandy Dunlap #define GPIOF_OUT_INIT_HIGH	(GPIOF_DIR_OUT | GPIOF_INIT_HIGH)
18c001fb72SRandy Dunlap 
19aca5ce14SLaxman Dewangan /* Gpio pin is open drain */
20aca5ce14SLaxman Dewangan #define GPIOF_OPEN_DRAIN	(1 << 2)
21aca5ce14SLaxman Dewangan 
2225553ff0SLaxman Dewangan /* Gpio pin is open source */
2325553ff0SLaxman Dewangan #define GPIOF_OPEN_SOURCE	(1 << 3)
2425553ff0SLaxman Dewangan 
25f567fde2SLaxman Dewangan #define GPIOF_EXPORT		(1 << 4)
26f567fde2SLaxman Dewangan #define GPIOF_EXPORT_CHANGEABLE	(1 << 5)
27fc3a1f04SWolfram Sang #define GPIOF_EXPORT_DIR_FIXED	(GPIOF_EXPORT)
28fc3a1f04SWolfram Sang #define GPIOF_EXPORT_DIR_CHANGEABLE (GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE)
29fc3a1f04SWolfram Sang 
30feb83699SMark Brown /**
31feb83699SMark Brown  * struct gpio - a structure describing a GPIO with configuration
32feb83699SMark Brown  * @gpio:	the GPIO number
33feb83699SMark Brown  * @flags:	GPIO configuration as specified by GPIOF_*
34feb83699SMark Brown  * @label:	a literal description string of this GPIO
35feb83699SMark Brown  */
36feb83699SMark Brown struct gpio {
37feb83699SMark Brown 	unsigned	gpio;
38feb83699SMark Brown 	unsigned long	flags;
39feb83699SMark Brown 	const char	*label;
40feb83699SMark Brown };
41feb83699SMark Brown 
4276ec9d18SAlexandre Courbot #ifdef CONFIG_GPIOLIB
437563bbf8SMark Brown 
447563bbf8SMark Brown #ifdef CONFIG_ARCH_HAVE_CUSTOM_GPIO_H
457560fa60SDavid Brownell #include <asm/gpio.h>
467563bbf8SMark Brown #else
477563bbf8SMark Brown 
487563bbf8SMark Brown #include <asm-generic/gpio.h>
497563bbf8SMark Brown 
507563bbf8SMark Brown static inline int gpio_get_value(unsigned int gpio)
517563bbf8SMark Brown {
527563bbf8SMark Brown 	return __gpio_get_value(gpio);
537563bbf8SMark Brown }
547563bbf8SMark Brown 
557563bbf8SMark Brown static inline void gpio_set_value(unsigned int gpio, int value)
567563bbf8SMark Brown {
577563bbf8SMark Brown 	__gpio_set_value(gpio, value);
587563bbf8SMark Brown }
597563bbf8SMark Brown 
607563bbf8SMark Brown static inline int gpio_cansleep(unsigned int gpio)
617563bbf8SMark Brown {
627563bbf8SMark Brown 	return __gpio_cansleep(gpio);
637563bbf8SMark Brown }
647563bbf8SMark Brown 
657563bbf8SMark Brown static inline int gpio_to_irq(unsigned int gpio)
667563bbf8SMark Brown {
677563bbf8SMark Brown 	return __gpio_to_irq(gpio);
687563bbf8SMark Brown }
697563bbf8SMark Brown 
707563bbf8SMark Brown static inline int irq_to_gpio(unsigned int irq)
717563bbf8SMark Brown {
727563bbf8SMark Brown 	return -EINVAL;
737563bbf8SMark Brown }
747563bbf8SMark Brown 
75165adc9cSLinus Walleij #endif /* ! CONFIG_ARCH_HAVE_CUSTOM_GPIO_H */
767560fa60SDavid Brownell 
7776ec9d18SAlexandre Courbot #else /* ! CONFIG_GPIOLIB */
787560fa60SDavid Brownell 
793d599d1cSUwe Kleine-König #include <linux/kernel.h>
806ea0205bSDavid Brownell #include <linux/types.h>
816ea0205bSDavid Brownell #include <linux/errno.h>
82187f1882SPaul Gortmaker #include <linux/bug.h>
83586a87e6SChristian Ruppert #include <linux/pinctrl/pinctrl.h>
846ea0205bSDavid Brownell 
85a4177ee7SJani Nikula struct device;
864e4438b8SAnton Vorontsov struct gpio_chip;
87a4177ee7SJani Nikula 
883474cb3cSJoe Perches static inline bool gpio_is_valid(int number)
897560fa60SDavid Brownell {
903474cb3cSJoe Perches 	return false;
917560fa60SDavid Brownell }
927560fa60SDavid Brownell 
93d8a3515eSLinus Torvalds static inline int gpio_request(unsigned gpio, const char *label)
947560fa60SDavid Brownell {
957560fa60SDavid Brownell 	return -ENOSYS;
967560fa60SDavid Brownell }
977560fa60SDavid Brownell 
98323b7fe8SWolfram Sang static inline int gpio_request_one(unsigned gpio,
995f829e40SWolfram Sang 					unsigned long flags, const char *label)
1005f829e40SWolfram Sang {
1015f829e40SWolfram Sang 	return -ENOSYS;
1025f829e40SWolfram Sang }
1035f829e40SWolfram Sang 
1047c295975SLars-Peter Clausen static inline int gpio_request_array(const struct gpio *array, size_t num)
1055f829e40SWolfram Sang {
1065f829e40SWolfram Sang 	return -ENOSYS;
1075f829e40SWolfram Sang }
1085f829e40SWolfram Sang 
1097560fa60SDavid Brownell static inline void gpio_free(unsigned gpio)
1107560fa60SDavid Brownell {
1113d599d1cSUwe Kleine-König 	might_sleep();
1123d599d1cSUwe Kleine-König 
1137560fa60SDavid Brownell 	/* GPIO can never have been requested */
1147560fa60SDavid Brownell 	WARN_ON(1);
1157560fa60SDavid Brownell }
1167560fa60SDavid Brownell 
1177c295975SLars-Peter Clausen static inline void gpio_free_array(const struct gpio *array, size_t num)
1185f829e40SWolfram Sang {
1195f829e40SWolfram Sang 	might_sleep();
1205f829e40SWolfram Sang 
1215f829e40SWolfram Sang 	/* GPIO can never have been requested */
1225f829e40SWolfram Sang 	WARN_ON(1);
1235f829e40SWolfram Sang }
1245f829e40SWolfram Sang 
125d8a3515eSLinus Torvalds static inline int gpio_direction_input(unsigned gpio)
1267560fa60SDavid Brownell {
1277560fa60SDavid Brownell 	return -ENOSYS;
1287560fa60SDavid Brownell }
1297560fa60SDavid Brownell 
130d8a3515eSLinus Torvalds static inline int gpio_direction_output(unsigned gpio, int value)
1317560fa60SDavid Brownell {
1327560fa60SDavid Brownell 	return -ENOSYS;
1337560fa60SDavid Brownell }
1347560fa60SDavid Brownell 
135c4b5be98SFelipe Balbi static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
136c4b5be98SFelipe Balbi {
137c4b5be98SFelipe Balbi 	return -ENOSYS;
138c4b5be98SFelipe Balbi }
139c4b5be98SFelipe Balbi 
1407560fa60SDavid Brownell static inline int gpio_get_value(unsigned gpio)
1417560fa60SDavid Brownell {
1427560fa60SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
1437560fa60SDavid Brownell 	WARN_ON(1);
1447560fa60SDavid Brownell 	return 0;
1457560fa60SDavid Brownell }
1467560fa60SDavid Brownell 
1477560fa60SDavid Brownell static inline void gpio_set_value(unsigned gpio, int value)
1487560fa60SDavid Brownell {
1497560fa60SDavid Brownell 	/* GPIO can never have been requested or set as output */
1507560fa60SDavid Brownell 	WARN_ON(1);
1517560fa60SDavid Brownell }
1527560fa60SDavid Brownell 
1537560fa60SDavid Brownell static inline int gpio_cansleep(unsigned gpio)
1547560fa60SDavid Brownell {
1557560fa60SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
1567560fa60SDavid Brownell 	WARN_ON(1);
1577560fa60SDavid Brownell 	return 0;
1587560fa60SDavid Brownell }
1597560fa60SDavid Brownell 
1607560fa60SDavid Brownell static inline int gpio_get_value_cansleep(unsigned gpio)
1617560fa60SDavid Brownell {
1627560fa60SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
1637560fa60SDavid Brownell 	WARN_ON(1);
1647560fa60SDavid Brownell 	return 0;
1657560fa60SDavid Brownell }
1667560fa60SDavid Brownell 
1677560fa60SDavid Brownell static inline void gpio_set_value_cansleep(unsigned gpio, int value)
1687560fa60SDavid Brownell {
1697560fa60SDavid Brownell 	/* GPIO can never have been requested or set as output */
1707560fa60SDavid Brownell 	WARN_ON(1);
1717560fa60SDavid Brownell }
1727560fa60SDavid Brownell 
173d8f388d8SDavid Brownell static inline int gpio_export(unsigned gpio, bool direction_may_change)
174d8f388d8SDavid Brownell {
175d8f388d8SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
176d8f388d8SDavid Brownell 	WARN_ON(1);
177d8f388d8SDavid Brownell 	return -EINVAL;
178d8f388d8SDavid Brownell }
179d8f388d8SDavid Brownell 
180a4177ee7SJani Nikula static inline int gpio_export_link(struct device *dev, const char *name,
181a4177ee7SJani Nikula 				unsigned gpio)
182a4177ee7SJani Nikula {
183a4177ee7SJani Nikula 	/* GPIO can never have been exported */
184a4177ee7SJani Nikula 	WARN_ON(1);
185a4177ee7SJani Nikula 	return -EINVAL;
186a4177ee7SJani Nikula }
187a4177ee7SJani Nikula 
18807697461SJani Nikula static inline int gpio_sysfs_set_active_low(unsigned gpio, int value)
18907697461SJani Nikula {
19007697461SJani Nikula 	/* GPIO can never have been requested */
19107697461SJani Nikula 	WARN_ON(1);
19207697461SJani Nikula 	return -EINVAL;
19307697461SJani Nikula }
194a4177ee7SJani Nikula 
195d8f388d8SDavid Brownell static inline void gpio_unexport(unsigned gpio)
196d8f388d8SDavid Brownell {
197d8f388d8SDavid Brownell 	/* GPIO can never have been exported */
198d8f388d8SDavid Brownell 	WARN_ON(1);
199d8f388d8SDavid Brownell }
200d8f388d8SDavid Brownell 
2017560fa60SDavid Brownell static inline int gpio_to_irq(unsigned gpio)
2027560fa60SDavid Brownell {
2037560fa60SDavid Brownell 	/* GPIO can never have been requested or set as input */
2047560fa60SDavid Brownell 	WARN_ON(1);
2057560fa60SDavid Brownell 	return -EINVAL;
2067560fa60SDavid Brownell }
2077560fa60SDavid Brownell 
2087560fa60SDavid Brownell static inline int irq_to_gpio(unsigned irq)
2097560fa60SDavid Brownell {
2107560fa60SDavid Brownell 	/* irq can never have been returned from gpio_to_irq() */
2117560fa60SDavid Brownell 	WARN_ON(1);
2127560fa60SDavid Brownell 	return -EINVAL;
2137560fa60SDavid Brownell }
2147560fa60SDavid Brownell 
2151e63d7b9SLinus Walleij static inline int
216165adc9cSLinus Walleij gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
217316511c0SLinus Walleij 		       unsigned int gpio_offset, unsigned int pin_offset,
2183f0f8670SLinus Walleij 		       unsigned int npins)
219165adc9cSLinus Walleij {
22050309a9cSLinus Walleij 	WARN_ON(1);
22150309a9cSLinus Walleij 	return -EINVAL;
222165adc9cSLinus Walleij }
223165adc9cSLinus Walleij 
224586a87e6SChristian Ruppert static inline int
225586a87e6SChristian Ruppert gpiochip_add_pingroup_range(struct gpio_chip *chip,
226586a87e6SChristian Ruppert 			struct pinctrl_dev *pctldev,
227586a87e6SChristian Ruppert 			unsigned int gpio_offset, const char *pin_group)
228586a87e6SChristian Ruppert {
229586a87e6SChristian Ruppert 	WARN_ON(1);
230586a87e6SChristian Ruppert 	return -EINVAL;
231586a87e6SChristian Ruppert }
232586a87e6SChristian Ruppert 
233165adc9cSLinus Walleij static inline void
234165adc9cSLinus Walleij gpiochip_remove_pin_ranges(struct gpio_chip *chip)
235165adc9cSLinus Walleij {
23650309a9cSLinus Walleij 	WARN_ON(1);
237165adc9cSLinus Walleij }
238165adc9cSLinus Walleij 
23976ec9d18SAlexandre Courbot #endif /* ! CONFIG_GPIOLIB */
2407560fa60SDavid Brownell 
2416a89a314SShawn Guo struct device;
2426a89a314SShawn Guo 
2436a89a314SShawn Guo /* bindings for managed devices that want to request gpios */
2446a89a314SShawn Guo int devm_gpio_request(struct device *dev, unsigned gpio, const char *label);
2456a89a314SShawn Guo int devm_gpio_request_one(struct device *dev, unsigned gpio,
2466a89a314SShawn Guo 			  unsigned long flags, const char *label);
2476a89a314SShawn Guo void devm_gpio_free(struct device *dev, unsigned int gpio);
2486a89a314SShawn Guo 
2497560fa60SDavid Brownell #endif /* __LINUX_GPIO_H */
250