aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorMichal Meloun <mmel@FreeBSD.org>2016-04-28 12:03:22 +0000
committerMichal Meloun <mmel@FreeBSD.org>2016-04-28 12:03:22 +0000
commit39f6c1bdf48ae6a4e1e13d762d88e4ad431fc18c (patch)
tree00380a7fe91fc930efff33bed8dd079eafcc6a3c /sys/dev
parentf9ac50ac450ac66102147393587147df36368a1a (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/gpio/gpiobus.c26
-rw-r--r--sys/dev/gpio/gpiobusvar.h7
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);