xref: /openbmc/linux/include/linux/gpio.h (revision 7563bbf8)
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 
25fc3a1f04SWolfram Sang #define GPIOF_EXPORT		(1 << 2)
26fc3a1f04SWolfram Sang #define GPIOF_EXPORT_CHANGEABLE	(1 << 3)
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 
757563bbf8SMark Brown #endif
767560fa60SDavid Brownell 
777560fa60SDavid Brownell #else
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 
972c96922aSMark Brown static inline int devm_gpio_request(struct device *dev, unsigned gpio,
982c96922aSMark Brown 				    const char *label)
992c96922aSMark Brown {
1002c96922aSMark Brown 	return -ENOSYS;
1012c96922aSMark Brown }
1022c96922aSMark Brown 
103323b7fe8SWolfram Sang static inline int gpio_request_one(unsigned gpio,
1045f829e40SWolfram Sang 					unsigned long flags, const char *label)
1055f829e40SWolfram Sang {
1065f829e40SWolfram Sang 	return -ENOSYS;
1075f829e40SWolfram Sang }
1085f829e40SWolfram Sang 
1097c295975SLars-Peter Clausen static inline int gpio_request_array(const struct gpio *array, size_t num)
1105f829e40SWolfram Sang {
1115f829e40SWolfram Sang 	return -ENOSYS;
1125f829e40SWolfram Sang }
1135f829e40SWolfram Sang 
1147560fa60SDavid Brownell static inline void gpio_free(unsigned gpio)
1157560fa60SDavid Brownell {
1163d599d1cSUwe Kleine-König 	might_sleep();
1173d599d1cSUwe Kleine-König 
1187560fa60SDavid Brownell 	/* GPIO can never have been requested */
1197560fa60SDavid Brownell 	WARN_ON(1);
1207560fa60SDavid Brownell }
1217560fa60SDavid Brownell 
1222c96922aSMark Brown static inline void devm_gpio_free(struct device *dev, unsigned gpio)
1232c96922aSMark Brown {
1242c96922aSMark Brown 	might_sleep();
1252c96922aSMark Brown 
1262c96922aSMark Brown 	/* GPIO can never have been requested */
1272c96922aSMark Brown 	WARN_ON(1);
1282c96922aSMark Brown }
1292c96922aSMark Brown 
1307c295975SLars-Peter Clausen static inline void gpio_free_array(const struct gpio *array, size_t num)
1315f829e40SWolfram Sang {
1325f829e40SWolfram Sang 	might_sleep();
1335f829e40SWolfram Sang 
1345f829e40SWolfram Sang 	/* GPIO can never have been requested */
1355f829e40SWolfram Sang 	WARN_ON(1);
1365f829e40SWolfram Sang }
1375f829e40SWolfram Sang 
138d8a3515eSLinus Torvalds static inline int gpio_direction_input(unsigned gpio)
1397560fa60SDavid Brownell {
1407560fa60SDavid Brownell 	return -ENOSYS;
1417560fa60SDavid Brownell }
1427560fa60SDavid Brownell 
143d8a3515eSLinus Torvalds static inline int gpio_direction_output(unsigned gpio, int value)
1447560fa60SDavid Brownell {
1457560fa60SDavid Brownell 	return -ENOSYS;
1467560fa60SDavid Brownell }
1477560fa60SDavid Brownell 
148c4b5be98SFelipe Balbi static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
149c4b5be98SFelipe Balbi {
150c4b5be98SFelipe Balbi 	return -ENOSYS;
151c4b5be98SFelipe Balbi }
152c4b5be98SFelipe Balbi 
1537560fa60SDavid Brownell static inline int gpio_get_value(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 void gpio_set_value(unsigned gpio, int value)
1617560fa60SDavid Brownell {
1627560fa60SDavid Brownell 	/* GPIO can never have been requested or set as output */
1637560fa60SDavid Brownell 	WARN_ON(1);
1647560fa60SDavid Brownell }
1657560fa60SDavid Brownell 
1667560fa60SDavid Brownell static inline int gpio_cansleep(unsigned gpio)
1677560fa60SDavid Brownell {
1687560fa60SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
1697560fa60SDavid Brownell 	WARN_ON(1);
1707560fa60SDavid Brownell 	return 0;
1717560fa60SDavid Brownell }
1727560fa60SDavid Brownell 
1737560fa60SDavid Brownell static inline int gpio_get_value_cansleep(unsigned gpio)
1747560fa60SDavid Brownell {
1757560fa60SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
1767560fa60SDavid Brownell 	WARN_ON(1);
1777560fa60SDavid Brownell 	return 0;
1787560fa60SDavid Brownell }
1797560fa60SDavid Brownell 
1807560fa60SDavid Brownell static inline void gpio_set_value_cansleep(unsigned gpio, int value)
1817560fa60SDavid Brownell {
1827560fa60SDavid Brownell 	/* GPIO can never have been requested or set as output */
1837560fa60SDavid Brownell 	WARN_ON(1);
1847560fa60SDavid Brownell }
1857560fa60SDavid Brownell 
186d8f388d8SDavid Brownell static inline int gpio_export(unsigned gpio, bool direction_may_change)
187d8f388d8SDavid Brownell {
188d8f388d8SDavid Brownell 	/* GPIO can never have been requested or set as {in,out}put */
189d8f388d8SDavid Brownell 	WARN_ON(1);
190d8f388d8SDavid Brownell 	return -EINVAL;
191d8f388d8SDavid Brownell }
192d8f388d8SDavid Brownell 
193a4177ee7SJani Nikula static inline int gpio_export_link(struct device *dev, const char *name,
194a4177ee7SJani Nikula 				unsigned gpio)
195a4177ee7SJani Nikula {
196a4177ee7SJani Nikula 	/* GPIO can never have been exported */
197a4177ee7SJani Nikula 	WARN_ON(1);
198a4177ee7SJani Nikula 	return -EINVAL;
199a4177ee7SJani Nikula }
200a4177ee7SJani Nikula 
20107697461SJani Nikula static inline int gpio_sysfs_set_active_low(unsigned gpio, int value)
20207697461SJani Nikula {
20307697461SJani Nikula 	/* GPIO can never have been requested */
20407697461SJani Nikula 	WARN_ON(1);
20507697461SJani Nikula 	return -EINVAL;
20607697461SJani Nikula }
207a4177ee7SJani Nikula 
208d8f388d8SDavid Brownell static inline void gpio_unexport(unsigned gpio)
209d8f388d8SDavid Brownell {
210d8f388d8SDavid Brownell 	/* GPIO can never have been exported */
211d8f388d8SDavid Brownell 	WARN_ON(1);
212d8f388d8SDavid Brownell }
213d8f388d8SDavid Brownell 
2147560fa60SDavid Brownell static inline int gpio_to_irq(unsigned gpio)
2157560fa60SDavid Brownell {
2167560fa60SDavid Brownell 	/* GPIO can never have been requested or set as input */
2177560fa60SDavid Brownell 	WARN_ON(1);
2187560fa60SDavid Brownell 	return -EINVAL;
2197560fa60SDavid Brownell }
2207560fa60SDavid Brownell 
2217560fa60SDavid Brownell static inline int irq_to_gpio(unsigned irq)
2227560fa60SDavid Brownell {
2237560fa60SDavid Brownell 	/* irq can never have been returned from gpio_to_irq() */
2247560fa60SDavid Brownell 	WARN_ON(1);
2257560fa60SDavid Brownell 	return -EINVAL;
2267560fa60SDavid Brownell }
2277560fa60SDavid Brownell 
2287560fa60SDavid Brownell #endif
2297560fa60SDavid Brownell 
2307560fa60SDavid Brownell #endif /* __LINUX_GPIO_H */
231