⬢ DragonFlyBSD Kernel Audit
sys/dev/misc/gpio/gpio.h
← back
/*
 * Copyright (c) 2009 The DragonFly Project.  All rights reserved.
 *
 * This code is derived from software contributed to The DragonFly Project
 * by Alex Hornung <ahornung@gmail.com>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name of The DragonFly Project nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific, prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *
 * Copyright (c) 2008 Marc Balmer <mbalmer@openbsd.org>
 * Copyright (c) 2004, 2006 Alexander Yurchenko <grange@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <sys/ioccom.h>

/* GPIO pin states */
#define GPIO_PIN_LOW		0x00	/* low level (logical 0) */
#define GPIO_PIN_HIGH		0x01	/* high level (logical 1) */

/* Max name length of a pin */
#define GPIOPINMAXNAME		64

/* GPIO pin configuration flags */
#define GPIO_PIN_INPUT		0x0001	/* input direction */
#define GPIO_PIN_OUTPUT		0x0002	/* output direction */
#define GPIO_PIN_INOUT		0x0004	/* bi-directional */
#define GPIO_PIN_OPENDRAIN	0x0008	/* open-drain output */
#define GPIO_PIN_PUSHPULL	0x0010	/* push-pull output */
#define GPIO_PIN_TRISTATE	0x0020	/* output disabled */
#define GPIO_PIN_PULLUP		0x0040	/* internal pull-up enabled */
#define GPIO_PIN_PULLDOWN	0x0080	/* internal pull-down enabled */
#define GPIO_PIN_INVIN		0x0100	/* invert input */
#define GPIO_PIN_INVOUT		0x0200	/* invert output */
#define GPIO_PIN_USER		0x0400	/* user != 0 can access */
#define GPIO_PIN_SET		0x8000	/* set for securelevel access */

/* Consumer attach arg types */
#define	GPIO_TYPE_INT		0x01

typedef struct gpio_pin {
	int	pin_num;		/* number */
	int	pin_caps;		/* capabilities */
	int	pin_flags;		/* current configuration */
	int	pin_state;		/* current state */
	int	pin_mapped;		/* is mapped */
	int	pin_opened;		/* is opened */
	cdev_t	dev;
} gpio_pin_t;

struct gpio {
	const char	*driver_name;
	void		*arg;
	int		(*pin_read)(void *, int);
	void		(*pin_write)(void *, int, int);
	void		(*pin_ctl)(void *, int, int);
	gpio_pin_t	*pins;
	int		npins;

	/* Private members */
	int		driver_unit;
	cdev_t		master_dev;
};

struct gpio_consumer {
	const char	*consumer_name;
	int		(*consumer_attach)(struct gpio *, void *, int, u_int32_t);
	int		(*consumer_detach)(struct gpio *, void *, int);
	LIST_ENTRY(gpio_consumer)	link;
};

struct gpio_info {
	int		npins;
	gpio_pin_t	*pins;
};

struct gpio_attach_args {
	char		consumer_name[16];
	int		pin_offset;
	u_int32_t	pin_mask;
	int		arg_type;
	union {
		char	string[32];
		long	lint;
	} consumer_arg;
};

struct gpio_pin_set_args {
	int	pin;
	int	caps;
	int	flags;
};

struct gpio_mapping {
	struct gpio	*gp;
	int		*map;
	int		size;

	int		map_alloced;
};

void	gpio_consumer_register(struct gpio_consumer *gcp);
void	gpio_consumer_unregister(struct gpio_consumer *gcp);
int	gpio_consumer_attach(const char *consumer, void *arg, struct gpio *gp,
	    int pin, u_int32_t mask);
int	gpio_consumer_detach(const char *consumer, struct gpio *gp, int pin);
struct gpio_mapping *gpio_map(struct gpio *gp, int *map, int offset, u_int32_t mask);
void	gpio_unmap(struct gpio_mapping *gmp);

int	gpio_npins(u_int32_t mask);
int	gpio_pin_read(struct gpio *gp, struct gpio_mapping *map, int pin);
void	gpio_pin_write(struct gpio  *gp, struct gpio_mapping *map, int pin, int data);
void	gpio_pin_ctl(struct gpio  *gp, struct gpio_mapping *map, int pin, int flags);
int	gpio_pin_caps(struct gpio  *gp, struct gpio_mapping *map, int pin);
void	gpio_register(struct gpio *gp);
void	gpio_unregister(struct gpio *gp);

void	led_switch(const char *name, int on_off);

#define GPIOINFO		_IOWR('G', 0, struct gpio_info)
#define GPIOPINSET		_IOWR('G', 4, struct gpio_pin_set_args)
#define GPIOPINUNSET		_IOWR('G', 5, struct gpio_pin_set_args)
#define GPIOATTACH		_IOWR('G', 6, struct gpio_attach_args)
#define GPIODETACH		_IOWR('G', 7, struct gpio_attach_args)