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
struct gpio_desc;
51 52 53 54

/**
 * struct gpio_chip - abstract a GPIO controller
 * @label: for diagnostics
D
David Brownell 已提交
55 56
 * @dev: optional device providing the GPIOs
 * @owner: helps prevent removal of modules exporting active GPIOs
57
 * @list: links gpio_chips together for traversal
D
David Brownell 已提交
58 59 60 61
 * @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
62 63
 * @get_direction: returns direction for signal "offset", 0=out, 1=in,
 *	(same as GPIOF_DIR_XXX), or negative error
64 65 66 67
 * @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
68 69
 * @set_debounce: optional hook for setting debounce time for specified gpio in
 *      interrupt triggered gpio chips
70
 * @set: assigns output value for signal "offset"
D
David Brownell 已提交
71 72
 * @to_irq: optional hook supporting non-static gpio_to_irq() mappings;
 *	implementation may not sleep
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).
80
 * @desc: array of ngpio descriptors. Private.
81 82
 * @can_sleep: flag must be set iff get()/set() methods sleep, as they
 *	must while accessing GPIO expander chips over I2C or SPI
83 84 85
 * @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
86 87 88
 *      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.
89 90 91 92 93 94 95 96 97 98 99 100
 *
 * 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 已提交
101
	const char		*label;
D
David Brownell 已提交
102
	struct device		*dev;
103
	struct module		*owner;
104
	struct list_head        list;
105

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

121 122
	void			(*set)(struct gpio_chip *chip,
						unsigned offset, int value);
D
David Brownell 已提交
123 124 125 126

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

127 128 129 130
	void			(*dbg_show)(struct seq_file *s,
						struct gpio_chip *chip);
	int			base;
	u16			ngpio;
131
	struct gpio_desc	*desc;
132
	const char		*const *names;
133
	unsigned		can_sleep:1;
D
David Brownell 已提交
134
	unsigned		exported:1;
135 136 137 138 139 140 141 142

#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;
143 144
	int (*of_xlate)(struct gpio_chip *gc,
		        const struct of_phandle_args *gpiospec, u32 *flags);
145
#endif
146 147 148 149 150 151 152 153 154
#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
155 156 157 158
};

extern const char *gpiochip_is_requested(struct gpio_chip *chip,
			unsigned offset);
159
extern struct gpio_chip *gpio_to_chip(unsigned gpio);
160 161 162 163

/* add/remove chips */
extern int gpiochip_add(struct gpio_chip *chip);
extern int __must_check gpiochip_remove(struct gpio_chip *chip);
164
extern struct gpio_chip *gpiochip_find(void *data,
165
					int (*match)(struct gpio_chip *chip,
166
						     void *data));
167 168 169 170 171


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

175 176
extern int gpio_direction_input(unsigned gpio);
extern int gpio_direction_output(unsigned gpio, int value);
177

178 179
extern int gpio_set_debounce(unsigned gpio, unsigned debounce);

180 181 182 183 184 185 186 187 188 189 190 191 192
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 已提交
193
extern int __gpio_to_irq(unsigned gpio);
194

195
extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
196 197
extern int gpio_request_array(const struct gpio *array, size_t num);
extern void gpio_free_array(const struct gpio *array, size_t num);
198

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

#endif	/* CONFIG_GPIO_SYSFS */

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 246 247 248 249
#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 */

250
#else	/* !CONFIG_GPIOLIB */
251

252
static inline bool gpio_is_valid(int number)
253 254 255 256 257
{
	/* only non-negative numbers are valid */
	return number >= 0;
}

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

static inline void gpio_set_value_cansleep(unsigned gpio, int value)
{
	might_sleep();
276
	__gpio_set_value(gpio, value);
D
David Brownell 已提交
277 278
}

279
#endif /* !CONFIG_GPIOLIB */
D
David Brownell 已提交
280 281 282

#ifndef CONFIG_GPIO_SYSFS

283 284
struct device;

D
David Brownell 已提交
285 286 287 288 289 290 291
/* sysfs support is only available with gpiolib, where it's optional */

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

292 293 294 295 296 297
static inline int gpio_export_link(struct device *dev, const char *name,
				unsigned gpio)
{
	return -ENOSYS;
}

298 299 300 301 302
static inline int gpio_sysfs_set_active_low(unsigned gpio, int value)
{
	return -ENOSYS;
}

D
David Brownell 已提交
303 304 305 306
static inline void gpio_unexport(unsigned gpio)
{
}
#endif	/* CONFIG_GPIO_SYSFS */
307

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