1/*	$OpenBSD: gpio.h,v 1.8 2011/10/03 20:24:51 matthieu Exp $	*/
2/*
3 * Copyright (c) 2004 Alexander Yurchenko <grange@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#ifndef _SYS_GPIO_H_
19#define _SYS_GPIO_H_
20
21/* GPIO pin states */
22#define GPIO_PIN_LOW		0x00	/* low level (logical 0) */
23#define GPIO_PIN_HIGH		0x01	/* high level (logical 1) */
24
25/* Max name length of a pin */
26#define GPIOPINMAXNAME		64
27
28/* GPIO pin configuration flags */
29#define GPIO_PIN_INPUT		0x0001	/* input direction */
30#define GPIO_PIN_OUTPUT		0x0002	/* output direction */
31#define GPIO_PIN_INOUT		0x0004	/* bi-directional */
32#define GPIO_PIN_OPENDRAIN	0x0008	/* open-drain output */
33#define GPIO_PIN_PUSHPULL	0x0010	/* push-pull output */
34#define GPIO_PIN_TRISTATE	0x0020	/* output disabled */
35#define GPIO_PIN_PULLUP		0x0040	/* internal pull-up enabled */
36#define GPIO_PIN_PULLDOWN	0x0080	/* internal pull-down enabled */
37#define GPIO_PIN_INVIN		0x0100	/* invert input */
38#define GPIO_PIN_INVOUT		0x0200	/* invert output */
39#define GPIO_PIN_USER		0x0400	/* user != 0 can access */
40#define GPIO_PIN_SET		0x8000	/* set for securelevel access */
41
42/* GPIO controller description */
43struct gpio_info {
44	int gpio_npins;		/* total number of pins available */
45};
46
47/* GPIO pin operation (read/write/toggle) */
48struct gpio_pin_op {
49	char gp_name[GPIOPINMAXNAME];	/* pin name */
50	int gp_pin;			/* pin number */
51	int gp_value;			/* value */
52};
53
54/* GPIO pin configuration */
55struct gpio_pin_set {
56	char gp_name[GPIOPINMAXNAME];
57	int gp_pin;
58	int gp_caps;
59	int gp_flags;
60	char gp_name2[GPIOPINMAXNAME];	/* new name */
61};
62
63/* Attach/detach device drivers that use GPIO pins */
64struct gpio_attach {
65	char ga_dvname[16];	/* device name */
66	int ga_offset;		/* pin number */
67	u_int32_t ga_mask;	/* binary mask */
68	u_int32_t ga_flags;	/* flags */
69};
70
71#define GPIOINFO		_IOR('G', 0, struct gpio_info)
72#define GPIOPINREAD		_IOWR('G', 1, struct gpio_pin_op)
73#define GPIOPINWRITE		_IOWR('G', 2, struct gpio_pin_op)
74#define GPIOPINTOGGLE		_IOWR('G', 3, struct gpio_pin_op)
75#define GPIOPINSET		_IOWR('G', 4, struct gpio_pin_set)
76#define GPIOPINUNSET		_IOWR('G', 5, struct gpio_pin_set)
77#define GPIOATTACH		_IOWR('G', 6, struct gpio_attach)
78#define GPIODETACH		_IOWR('G', 7, struct gpio_attach)
79
80#endif	/* !_SYS_GPIO_H_ */
81