gpio.h 9.4 KB
Newer Older
D
David Brownell 已提交
1 2 3
#ifndef _ASM_GENERIC_GPIO_H
#define _ASM_GENERIC_GPIO_H

4
#include <linux/kernel.h>
D
David Brownell 已提交
5
#include <linux/types.h>
6
#include <linux/errno.h>
7
#include <linux/of.h>
8
#include <linux/pinctrl/pinctrl.h>
D
David Brownell 已提交
9

M
Michael Buesch 已提交
10
#ifdef CONFIG_GPIOLIB
11

D
David Brownell 已提交
12 13
#include <linux/compiler.h>

14 15 16 17 18 19
/* Platforms may implement their GPIO interface with library code,
 * at a small performance cost for non-inlined operations and some
 * extra memory (for code and for per-GPIO table entries).
 *
 * While the GPIO programming interface defines valid GPIO numbers
 * to be in the range 0..MAX_INT, this library restricts them to the
M
Michael Buesch 已提交
20
 * smaller range 0..ARCH_NR_GPIOS-1.
D
David Brownell 已提交
21 22 23 24
 *
 * ARCH_NR_GPIOS is somewhat arbitrary; it usually reflects the sum of
 * builtin/SoC GPIOs plus a number of GPIOs on expanders; the latter is
 * actually an estimate of a board-specific value.
25 26 27 28 29 30
 */

#ifndef ARCH_NR_GPIOS
#define ARCH_NR_GPIOS		256
#endif

D
David Brownell 已提交
31 32 33 34 35 36 37 38 39
/*
 * "valid" GPIO numbers are nonnegative and may be passed to
 * setup routines like gpio_request().  only some valid numbers
 * can successfully be requested and used.
 *
 * Invalid GPIO numbers are useful for indicating no-such-GPIO in
 * platform data and other tables.
 */

40
static inline bool gpio_is_valid(int number)
41
{
42
	return number >= 0 && number < ARCH_NR_GPIOS;
43 44
}

45
struct device;
46
struct gpio;
47
struct seq_file;
48
struct module;
49
struct device_node;
50 51 52 53

/**
 * struct gpio_chip - abstract a GPIO controller
 * @label: for diagnostics
D
David Brownell 已提交
54 55
 * @dev: optional device providing the GPIOs
 * @owner: helps prevent removal of modules exporting active GPIOs
D
David Brownell 已提交
56 57 58 59
 * @request: optional hook for chip-specific activation, such as
 *	enabling module power and clock; may sleep
 * @free: optional hook for chip-specific deactivation, such as
 *	disabling module power and clock; may sleep
60 61 62 63
 * @direction_input: configures signal "offset" as input, or returns error
 * @get: returns value for signal "offset"; for output signals this
 *	returns either the value actually sensed, or zero
 * @direction_output: configures signal "offset" as output, or returns error
64 65
 * @set_debounce: optional hook for setting debounce time for specified gpio in
 *      interrupt triggered gpio chips
66
 * @set: assigns output value for signal "offset"
D
David Brownell 已提交
67 68
 * @to_irq: optional hook supporting non-static gpio_to_irq() mappings;
 *	implementation may not sleep
69 70 71 72 73 74 75 76 77
 * @dbg_show: optional routine to show contents in debugfs; default code
 *	will be used when this is omitted, but custom code can show extra
 *	state (such as pullup/pulldown configuration).
 * @base: identifies the first GPIO number handled by this chip; or, if
 *	negative during registration, requests dynamic ID allocation.
 * @ngpio: the number of GPIOs handled by this controller; the last GPIO
 *	handled is (base + ngpio - 1).
 * @can_sleep: flag must be set iff get()/set() methods sleep, as they
 *	must while accessing GPIO expander chips over I2C or SPI
78 79 80
 * @names: if set, must be an array of strings to use as alternative
 *      names for the GPIOs in this chip. Any entry in the array
 *      may be NULL if there is no alias for the GPIO, however the
81 82 83
 *      array must be @ngpio entries long.  A name can include a single printk
 *      format specifier for an unsigned int.  It is substituted by the actual
 *      number of the gpio.
84 85 86 87 88 89 90 91 92 93 94 95
 *
 * A gpio_chip can help platforms abstract various sources of GPIOs so
 * they can all be accessed through a common programing interface.
 * Example sources would be SOC controllers, FPGAs, multifunction
 * chips, dedicated GPIO expanders, and so on.
 *
 * Each chip controls a number of signals, identified in method calls
 * by "offset" values in the range 0..(@ngpio - 1).  When those signals
 * are referenced through calls like gpio_get_value(gpio), the offset
 * is calculated by subtracting @base from the gpio number.
 */
struct gpio_chip {
D
Dmitry Baryshkov 已提交
96
	const char		*label;
D
David Brownell 已提交
97
	struct device		*dev;
98
	struct module		*owner;
99

D
David Brownell 已提交
100 101 102 103 104
	int			(*request)(struct gpio_chip *chip,
						unsigned offset);
	void			(*free)(struct gpio_chip *chip,
						unsigned offset);

105 106 107 108 109 110
	int			(*direction_input)(struct gpio_chip *chip,
						unsigned offset);
	int			(*get)(struct gpio_chip *chip,
						unsigned offset);
	int			(*direction_output)(struct gpio_chip *chip,
						unsigned offset, int value);
111 112 113
	int			(*set_debounce)(struct gpio_chip *chip,
						unsigned offset, unsigned debounce);

114 115
	void			(*set)(struct gpio_chip *chip,
						unsigned offset, int value);
D
David Brownell 已提交
116 117 118 119

	int			(*to_irq)(struct gpio_chip *chip,
						unsigned offset);

120 121 122 123
	void			(*dbg_show)(struct seq_file *s,
						struct gpio_chip *chip);
	int			base;
	u16			ngpio;
124
	const char		*const *names;
125
	unsigned		can_sleep:1;
D
David Brownell 已提交
126
	unsigned		exported:1;
127 128 129 130 131 132 133 134

#if defined(CONFIG_OF_GPIO)
	/*
	 * If CONFIG_OF is enabled, then all GPIO controllers described in the
	 * device tree automatically may have an OF translation
	 */
	struct device_node *of_node;
	int of_gpio_n_cells;
135 136
	int (*of_xlate)(struct gpio_chip *gc,
		        const struct of_phandle_args *gpiospec, u32 *flags);
137
#endif
138 139 140 141 142 143 144 145 146
#ifdef CONFIG_PINCTRL
	/*
	 * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally
	 * describe the actual pin range which they serve in an SoC. This
	 * information would be used by pinctrl subsystem to configure
	 * corresponding pins for gpio usage.
	 */
	struct list_head pin_ranges;
#endif
147 148 149 150
};

extern const char *gpiochip_is_requested(struct gpio_chip *chip,
			unsigned offset);
151
extern struct gpio_chip *gpio_to_chip(unsigned gpio);
D
David Brownell 已提交
152
extern int __must_check gpiochip_reserve(int start, int ngpio);
153 154 155 156

/* add/remove chips */
extern int gpiochip_add(struct gpio_chip *chip);
extern int __must_check gpiochip_remove(struct gpio_chip *chip);
157
extern struct gpio_chip *gpiochip_find(void *data,
158
					int (*match)(struct gpio_chip *chip,
159
						     void *data));
160 161 162 163 164


/* Always use the library code for GPIO management calls,
 * or when sleeping may be involved.
 */
165
extern int gpio_request(unsigned gpio, const char *label);
166 167
extern void gpio_free(unsigned gpio);

168 169
extern int gpio_direction_input(unsigned gpio);
extern int gpio_direction_output(unsigned gpio, int value);
170

171 172
extern int gpio_set_debounce(unsigned gpio, unsigned debounce);

173 174 175 176 177 178 179 180 181 182 183 184 185
extern int gpio_get_value_cansleep(unsigned gpio);
extern void gpio_set_value_cansleep(unsigned gpio, int value);


/* A platform's <asm/gpio.h> code may want to inline the I/O calls when
 * the GPIO is constant and refers to some always-present controller,
 * giving direct access to chip registers and tight bitbanging loops.
 */
extern int __gpio_get_value(unsigned gpio);
extern void __gpio_set_value(unsigned gpio, int value);

extern int __gpio_cansleep(unsigned gpio);

D
David Brownell 已提交
186
extern int __gpio_to_irq(unsigned gpio);
187

188
extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
189 190
extern int gpio_request_array(const struct gpio *array, size_t num);
extern void gpio_free_array(const struct gpio *array, size_t num);
191

192 193
/* bindings for managed devices that want to request gpios */
int devm_gpio_request(struct device *dev, unsigned gpio, const char *label);
194 195
int devm_gpio_request_one(struct device *dev, unsigned gpio,
			  unsigned long flags, const char *label);
196 197
void devm_gpio_free(struct device *dev, unsigned int gpio);

D
David Brownell 已提交
198 199 200 201 202 203 204
#ifdef CONFIG_GPIO_SYSFS

/*
 * A sysfs interface can be exported by individual drivers if they want,
 * but more typically is configured entirely from userspace.
 */
extern int gpio_export(unsigned gpio, bool direction_may_change);
205 206
extern int gpio_export_link(struct device *dev, const char *name,
			unsigned gpio);
207
extern int gpio_sysfs_set_active_low(unsigned gpio, int value);
D
David Brownell 已提交
208 209 210 211
extern void gpio_unexport(unsigned gpio);

#endif	/* CONFIG_GPIO_SYSFS */

212
#else	/* !CONFIG_GPIOLIB */
213

214
static inline bool gpio_is_valid(int number)
215 216 217 218 219
{
	/* only non-negative numbers are valid */
	return number >= 0;
}

D
David Brownell 已提交
220 221 222 223 224 225 226 227 228 229 230 231
/* platforms that don't directly support access to GPIOs through I2C, SPI,
 * or other blocking infrastructure can use these wrappers.
 */

static inline int gpio_cansleep(unsigned gpio)
{
	return 0;
}

static inline int gpio_get_value_cansleep(unsigned gpio)
{
	might_sleep();
232
	return __gpio_get_value(gpio);
D
David Brownell 已提交
233 234 235 236 237
}

static inline void gpio_set_value_cansleep(unsigned gpio, int value)
{
	might_sleep();
238
	__gpio_set_value(gpio, value);
D
David Brownell 已提交
239 240
}

241
#endif /* !CONFIG_GPIOLIB */
D
David Brownell 已提交
242 243 244

#ifndef CONFIG_GPIO_SYSFS

245 246
struct device;

D
David Brownell 已提交
247 248 249 250 251 252 253
/* sysfs support is only available with gpiolib, where it's optional */

static inline int gpio_export(unsigned gpio, bool direction_may_change)
{
	return -ENOSYS;
}

254 255 256 257 258 259
static inline int gpio_export_link(struct device *dev, const char *name,
				unsigned gpio)
{
	return -ENOSYS;
}

260 261 262 263 264
static inline int gpio_sysfs_set_active_low(unsigned gpio, int value)
{
	return -ENOSYS;
}

D
David Brownell 已提交
265 266 267 268
static inline void gpio_unexport(unsigned gpio)
{
}
#endif	/* CONFIG_GPIO_SYSFS */
269

270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
#ifdef CONFIG_PINCTRL

/**
 * struct gpio_pin_range - pin range controlled by a gpio chip
 * @head: list for maintaining set of pin ranges, used internally
 * @pctldev: pinctrl device which handles corresponding pins
 * @range: actual range of pins controlled by a gpio controller
 */

struct gpio_pin_range {
	struct list_head node;
	struct pinctrl_dev *pctldev;
	struct pinctrl_gpio_range range;
};

int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
			   unsigned int pin_base, unsigned int npins);
void gpiochip_remove_pin_ranges(struct gpio_chip *chip);

#else

static inline int
gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
		       unsigned int pin_base, unsigned int npins)
{
	return 0;
}

static inline void
gpiochip_remove_pin_ranges(struct gpio_chip *chip)
{
}

#endif /* CONFIG_PINCTRL */

D
David Brownell 已提交
305
#endif /* _ASM_GENERIC_GPIO_H */