gpio.h 9.3 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
 * @get_direction: returns direction for signal "offset", 0=out, 1=in,
 *	(same as GPIOF_DIR_XXX), or negative error
62 63 64 65
 * @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
66 67
 * @set_debounce: optional hook for setting debounce time for specified gpio in
 *      interrupt triggered gpio chips
68
 * @set: assigns output value for signal "offset"
D
David Brownell 已提交
69 70
 * @to_irq: optional hook supporting non-static gpio_to_irq() mappings;
 *	implementation may not sleep
71 72 73 74 75 76 77 78 79
 * @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
80 81 82
 * @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
83 84 85
 *      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.
86 87 88 89 90 91 92 93 94 95 96 97
 *
 * 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 已提交
98
	const char		*label;
D
David Brownell 已提交
99
	struct device		*dev;
100
	struct module		*owner;
101

D
David Brownell 已提交
102 103 104 105
	int			(*request)(struct gpio_chip *chip,
						unsigned offset);
	void			(*free)(struct gpio_chip *chip,
						unsigned offset);
106 107
	int			(*get_direction)(struct gpio_chip *chip,
						unsigned offset);
108 109 110 111 112 113
	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);
114 115 116
	int			(*set_debounce)(struct gpio_chip *chip,
						unsigned offset, unsigned debounce);

117 118
	void			(*set)(struct gpio_chip *chip,
						unsigned offset, int value);
D
David Brownell 已提交
119 120 121 122

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

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

#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;
138 139
	int (*of_xlate)(struct gpio_chip *gc,
		        const struct of_phandle_args *gpiospec, u32 *flags);
140
#endif
141 142 143 144 145 146 147 148 149
#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
150 151 152 153
};

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

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


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

171 172
extern int gpio_direction_input(unsigned gpio);
extern int gpio_direction_output(unsigned gpio, int value);
173

174 175
extern int gpio_set_debounce(unsigned gpio, unsigned debounce);

176 177 178 179 180 181 182 183 184 185 186 187 188
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 已提交
189
extern int __gpio_to_irq(unsigned gpio);
190

191
extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
192 193
extern int gpio_request_array(const struct gpio *array, size_t num);
extern void gpio_free_array(const struct gpio *array, size_t num);
194

D
David Brownell 已提交
195 196 197 198 199 200 201
#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);
202 203
extern int gpio_export_link(struct device *dev, const char *name,
			unsigned gpio);
204
extern int gpio_sysfs_set_active_low(unsigned gpio, int value);
D
David Brownell 已提交
205 206 207 208
extern void gpio_unexport(unsigned gpio);

#endif	/* CONFIG_GPIO_SYSFS */

209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
#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 gpio_offset, unsigned int pin_offset,
			   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 gpio_offset, unsigned int pin_offset,
		       unsigned int npins)
{
	return 0;
}

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

#endif /* CONFIG_PINCTRL */

246
#else	/* !CONFIG_GPIOLIB */
247

248
static inline bool gpio_is_valid(int number)
249 250 251 252 253
{
	/* only non-negative numbers are valid */
	return number >= 0;
}

D
David Brownell 已提交
254 255 256 257 258 259 260 261 262 263 264 265
/* 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();
266
	return __gpio_get_value(gpio);
D
David Brownell 已提交
267 268 269 270 271
}

static inline void gpio_set_value_cansleep(unsigned gpio, int value)
{
	might_sleep();
272
	__gpio_set_value(gpio, value);
D
David Brownell 已提交
273 274
}

275
#endif /* !CONFIG_GPIOLIB */
D
David Brownell 已提交
276 277 278

#ifndef CONFIG_GPIO_SYSFS

279 280
struct device;

D
David Brownell 已提交
281 282 283 284 285 286 287
/* sysfs support is only available with gpiolib, where it's optional */

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

288 289 290 291 292 293
static inline int gpio_export_link(struct device *dev, const char *name,
				unsigned gpio)
{
	return -ENOSYS;
}

294 295 296 297 298
static inline int gpio_sysfs_set_active_low(unsigned gpio, int value)
{
	return -ENOSYS;
}

D
David Brownell 已提交
299 300 301 302
static inline void gpio_unexport(unsigned gpio)
{
}
#endif	/* CONFIG_GPIO_SYSFS */
303

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