diff options
| author | Michal Meloun <mmel@FreeBSD.org> | 2016-04-28 12:03:22 +0000 |
|---|---|---|
| committer | Michal Meloun <mmel@FreeBSD.org> | 2016-04-28 12:03:22 +0000 |
| commit | 39f6c1bdf48ae6a4e1e13d762d88e4ad431fc18c (patch) | |
| tree | 00380a7fe91fc930efff33bed8dd079eafcc6a3c /sys/dev | |
| parent | f9ac50ac450ac66102147393587147df36368a1a (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/gpio/gpiobus.c | 26 | ||||
| -rw-r--r-- | sys/dev/gpio/gpiobusvar.h | 7 |
2 files changed, 33 insertions, 0 deletions
diff --git a/sys/dev/gpio/gpiobus.c b/sys/dev/gpio/gpiobus.c index 553d574c02ed..f2780217a5c9 100644 --- a/sys/dev/gpio/gpiobus.c +++ b/sys/dev/gpio/gpiobus.c @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$"); #include <sys/systm.h> #include <sys/bus.h> #include <sys/gpio.h> +#include <sys/intr.h> #include <sys/kernel.h> #include <sys/malloc.h> #include <sys/module.h> @@ -72,6 +73,31 @@ static int gpiobus_pin_set(device_t, device_t, uint32_t, unsigned int); static int gpiobus_pin_get(device_t, device_t, uint32_t, unsigned int*); static int gpiobus_pin_toggle(device_t, device_t, uint32_t); +/* + * XXX -> Move me to better place - gpio_subr.c? + * Also, this function must be changed when interrupt configuration + * data will be moved into struct resource. + */ +#ifdef INTRNG +struct resource * +gpio_alloc_intr_resource(device_t consumer_dev, int *rid, u_int alloc_flags, + gpio_pin_t pin, uint32_t intr_mode) +{ + u_int irqnum; + + /* + * Allocate new fictitious interrupt number and store configuration + * into it. + */ + irqnum = intr_gpio_map_irq(pin->dev, pin->pin, pin->flags, intr_mode); + if (irqnum == 0xFFFFFFFF) + return (NULL); + + return (bus_alloc_resource(consumer_dev, SYS_RES_IRQ, rid, + irqnum, irqnum, 1, alloc_flags)); +} +#endif + int gpio_check_flags(uint32_t caps, uint32_t flags) { diff --git a/sys/dev/gpio/gpiobusvar.h b/sys/dev/gpio/gpiobusvar.h index 2ed97315aa76..9fb18a0766e2 100644 --- a/sys/dev/gpio/gpiobusvar.h +++ b/sys/dev/gpio/gpiobusvar.h @@ -61,6 +61,9 @@ #define GPIOBUS_WAIT 1 #define GPIOBUS_DONTWAIT 2 +/* Use default interrupt mode - for gpio_alloc_intr_resource */ +#define GPIO_INTR_CONFORM GPIO_INTR_NONE + struct gpiobus_pin_data { int mapped; /* pin is mapped/reserved. */ @@ -122,6 +125,10 @@ int gpio_pin_is_active(gpio_pin_t pin, bool *active); int gpio_pin_set_active(gpio_pin_t pin, bool active); int gpio_pin_setflags(gpio_pin_t pin, uint32_t flags); #endif +#ifdef INTRNG +struct resource *gpio_alloc_intr_resource(device_t consumer_dev, int *rid, + u_int alloc_flags, gpio_pin_t pin, uint32_t intr_mode); +#endif int gpio_check_flags(uint32_t, uint32_t); device_t gpiobus_attach_bus(device_t); int gpiobus_detach_bus(device_t); |
