xref: /openbmc/linux/include/linux/gpio.h (revision 6a89a314)
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 
427560fa60SDavid Brownell #ifdef CONFIG_GENERIC_GPIO
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 
77165adc9cSLinus Walleij #else /* ! CONFIG_GENERIC_GPIO */
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>
836ea0205bSDavid Brownell 
84a4177ee7SJani Nikula struct device;
854e4438b8SAnton Vorontsov struct gpio_chip;
86a4177ee7SJani Nikula 
873474cb3cSJoe Perches static inline bool gpio_is_valid(int number)
887560fa60SDavid Brownell {
893474cb3cSJoe Perches 	return false;
907560fa60SDavid Brownell }
917560fa60SDavid Brownell 
92d8a3515eSLinus Torvalds static inline int gpio_request(unsigned gpio, const char *label)
937560fa60SDavid Brownell {
947560fa60SDavid Brownell 	return -ENOSYS;
957560fa60SDavid Brownell }
967560fa60SDavid Brownell 
97323b7fe8SWolfram Sang static inline int gpio_request_one(unsigned gpio,
985f829e40SWolfram Sang 					unsigned long flags, const char *label)
995f829e40SWolfram Sang {
1005f829e40SWolfram Sang 	return -ENOSYS;
1015f829e40SWolfram Sang }
1025f829e40SWolfram Sang 
1037c295975SLars-Peter Clausen static inline int gpio_request_array(const struct gpio *array, size_t num)
1045f829e40SWolfram Sang {
1055f829e40SWolfram Sang 	return -ENOSYS;
1065f829e40SWolfram Sang }
1075f829e40SWolfram Sang 
1087560fa60SDavid Brownell static inline void gpio_free(unsigned gpio)
1097560fa60SDavid Brownell {
1103d599d1cSUwe Kleine-König 	might_sleep();
1113d599d1cSUwe Kleine-König 
1127560fa60SDavid Brownell 	/* GPIO can never have been requested */
1137560fa60SDavid Brownell 	WARN_ON(1);
1147560fa60SDavid Brownell }
1157560fa60SDavid Brownell 
1167c295975SLars-Peter Clausen static inline void gpio_free_array(const struct gpio *array, size_t num)
1175f829e40SWolfram Sang {
1185f829e40SWolfram Sang 	might_sleep();
1195f829e40SWolfram Sang 
1205f829e40SWolfram Sang 	/* GPIO can never have been requested */
1215f829e40SWolfram Sang 	WARN_ON(1);
1225f829e40SWolfram Sang }
1235f829e40SWolfram Sang 
124d8a3515eSLinus Torvalds static inline int gpio_direction_input(unsigned gpio)
1257560fa60SDavid Brownell {
1267560fa60SDavid Brownell 	return -ENOSYS;
1277560fa60SDavid Brownell }
1287560fa60SDavid Brownell 
129d8a3515eSLinus Torvalds static inline int gpio_direction_output(unsigned gpio, int value)
1307560fa60SDavid Brownell {
1317560fa60SDavid Brownell 	return -ENOSYS;
1327560fa60SDavid Brownell }
1337560fa60SDavid Brownell 
134c4b5be98SFelipe Balbi static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
135c4b5be98SFelipe Balbi {
136c4b5be98SFelipe Balbi 	return -ENOSYS;
137c4b5be98SFelipe Balbi }
138c4b5be98SFelipe Balbi 
1397560fa60SDavid Brownell static inline int gpio_get_value(unsigned gpio)
1407560fa60SDavid Brownell {
1417560fa60SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
1427560fa60SDavid Brownell 	WARN_ON(1);
1437560fa60SDavid Brownell 	return 0;
1447560fa60SDavid Brownell }
1457560fa60SDavid Brownell 
1467560fa60SDavid Brownell static inline void gpio_set_value(unsigned gpio, int value)
1477560fa60SDavid Brownell {
1487560fa60SDavid Brownell 	/* GPIO can never have been requested or set as output */
1497560fa60SDavid Brownell 	WARN_ON(1);
1507560fa60SDavid Brownell }
1517560fa60SDavid Brownell 
1527560fa60SDavid Brownell static inline int gpio_cansleep(unsigned gpio)
1537560fa60SDavid Brownell {
1547560fa60SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
1557560fa60SDavid Brownell 	WARN_ON(1);
1567560fa60SDavid Brownell 	return 0;
1577560fa60SDavid Brownell }
1587560fa60SDavid Brownell 
1597560fa60SDavid Brownell static inline int gpio_get_value_cansleep(unsigned gpio)
1607560fa60SDavid Brownell {
1617560fa60SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
1627560fa60SDavid Brownell 	WARN_ON(1);
1637560fa60SDavid Brownell 	return 0;
1647560fa60SDavid Brownell }
1657560fa60SDavid Brownell 
1667560fa60SDavid Brownell static inline void gpio_set_value_cansleep(unsigned gpio, int value)
1677560fa60SDavid Brownell {
1687560fa60SDavid Brownell 	/* GPIO can never have been requested or set as output */
1697560fa60SDavid Brownell 	WARN_ON(1);
1707560fa60SDavid Brownell }
1717560fa60SDavid Brownell 
172d8f388d8SDavid Brownell static inline int gpio_export(unsigned gpio, bool direction_may_change)
173d8f388d8SDavid Brownell {
174d8f388d8SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
175d8f388d8SDavid Brownell 	WARN_ON(1);
176d8f388d8SDavid Brownell 	return -EINVAL;
177d8f388d8SDavid Brownell }
178d8f388d8SDavid Brownell 
179a4177ee7SJani Nikula static inline int gpio_export_link(struct device *dev, const char *name,
180a4177ee7SJani Nikula 				unsigned gpio)
181a4177ee7SJani Nikula {
182a4177ee7SJani Nikula 	/* GPIO can never have been exported */
183a4177ee7SJani Nikula 	WARN_ON(1);
184a4177ee7SJani Nikula 	return -EINVAL;
185a4177ee7SJani Nikula }
186a4177ee7SJani Nikula 
18707697461SJani Nikula static inline int gpio_sysfs_set_active_low(unsigned gpio, int value)
18807697461SJani Nikula {
18907697461SJani Nikula 	/* GPIO can never have been requested */
19007697461SJani Nikula 	WARN_ON(1);
19107697461SJani Nikula 	return -EINVAL;
19207697461SJani Nikula }
193a4177ee7SJani Nikula 
194d8f388d8SDavid Brownell static inline void gpio_unexport(unsigned gpio)
195d8f388d8SDavid Brownell {
196d8f388d8SDavid Brownell 	/* GPIO can never have been exported */
197d8f388d8SDavid Brownell 	WARN_ON(1);
198d8f388d8SDavid Brownell }
199d8f388d8SDavid Brownell 
2007560fa60SDavid Brownell static inline int gpio_to_irq(unsigned gpio)
2017560fa60SDavid Brownell {
2027560fa60SDavid Brownell 	/* GPIO can never have been requested or set as input */
2037560fa60SDavid Brownell 	WARN_ON(1);
2047560fa60SDavid Brownell 	return -EINVAL;
2057560fa60SDavid Brownell }
2067560fa60SDavid Brownell 
2077560fa60SDavid Brownell static inline int irq_to_gpio(unsigned irq)
2087560fa60SDavid Brownell {
2097560fa60SDavid Brownell 	/* irq can never have been returned from gpio_to_irq() */
2107560fa60SDavid Brownell 	WARN_ON(1);
2117560fa60SDavid Brownell 	return -EINVAL;
2127560fa60SDavid Brownell }
2137560fa60SDavid Brownell 
2141e63d7b9SLinus Walleij static inline int
215165adc9cSLinus Walleij gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
216316511c0SLinus Walleij 		       unsigned int gpio_offset, unsigned int pin_offset,
2173f0f8670SLinus Walleij 		       unsigned int npins)
218165adc9cSLinus Walleij {
21950309a9cSLinus Walleij 	WARN_ON(1);
22050309a9cSLinus Walleij 	return -EINVAL;
221165adc9cSLinus Walleij }
222165adc9cSLinus Walleij 
223165adc9cSLinus Walleij static inline void
224165adc9cSLinus Walleij gpiochip_remove_pin_ranges(struct gpio_chip *chip)
225165adc9cSLinus Walleij {
22650309a9cSLinus Walleij 	WARN_ON(1);
227165adc9cSLinus Walleij }
228165adc9cSLinus Walleij 
229165adc9cSLinus Walleij #endif /* ! CONFIG_GENERIC_GPIO */
2307560fa60SDavid Brownell 
2316a89a314SShawn Guo struct device;
2326a89a314SShawn Guo 
2336a89a314SShawn Guo /* bindings for managed devices that want to request gpios */
2346a89a314SShawn Guo int devm_gpio_request(struct device *dev, unsigned gpio, const char *label);
2356a89a314SShawn Guo int devm_gpio_request_one(struct device *dev, unsigned gpio,
2366a89a314SShawn Guo 			  unsigned long flags, const char *label);
2376a89a314SShawn Guo void devm_gpio_free(struct device *dev, unsigned int gpio);
2386a89a314SShawn Guo 
2397560fa60SDavid Brownell #endif /* __LINUX_GPIO_H */
240