summaryrefslogtreecommitdiffstats
path: root/sys/arm/mv/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arm/mv/gpio.c')
-rw-r--r--sys/arm/mv/gpio.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/sys/arm/mv/gpio.c b/sys/arm/mv/gpio.c
index 3d2d582..4053aba 100644
--- a/sys/arm/mv/gpio.c
+++ b/sys/arm/mv/gpio.c
@@ -64,7 +64,6 @@ struct mv_gpio_softc {
bus_space_handle_t bsh;
uint8_t pin_num; /* number of GPIO pins */
uint8_t irq_num; /* number of real IRQs occupied by GPIO controller */
- uint8_t use_high;
};
extern struct resource_spec mv_gpio_res[];
@@ -74,7 +73,7 @@ static uint32_t gpio_setup[MV_GPIO_MAX_NPINS];
static int mv_gpio_probe(device_t);
static int mv_gpio_attach(device_t);
-static void mv_gpio_intr(void *);
+static int mv_gpio_intr(void *);
static void mv_gpio_intr_handler(int pin);
static uint32_t mv_gpio_reg_read(uint32_t reg);
@@ -141,7 +140,6 @@ mv_gpio_attach(device_t dev)
uint32_t dev_id, rev_id;
sc = (struct mv_gpio_softc *)device_get_softc(dev);
-
if (sc == NULL)
return (ENXIO);
@@ -156,12 +154,10 @@ mv_gpio_attach(device_t dev)
dev_id == MV_DEV_MV78100_Z0 ) {
sc->pin_num = 32;
sc->irq_num = 4;
- sc->use_high = 0;
} else if (dev_id == MV_DEV_88F6281) {
sc->pin_num = 50;
sc->irq_num = 7;
- sc->use_high = 1;
} else {
device_printf(dev, "unknown chip id=0x%x\n", dev_id);
@@ -182,7 +178,7 @@ mv_gpio_attach(device_t dev)
bus_space_write_4(sc->bst, sc->bsh, GPIO_INT_LEV_MASK, 0);
bus_space_write_4(sc->bst, sc->bsh, GPIO_INT_CAUSE, 0);
- if (sc->use_high) {
+ if (sc->pin_num > GPIO_PINS_PER_REG) {
bus_space_write_4(sc->bst, sc->bsh,
GPIO_HI_INT_EDGE_MASK, 0);
bus_space_write_4(sc->bst, sc->bsh,
@@ -193,8 +189,7 @@ mv_gpio_attach(device_t dev)
for (i = 0; i < sc->irq_num; i++) {
if (bus_setup_intr(dev, sc->res[1 + i],
- INTR_TYPE_MISC | INTR_FAST,
- (driver_filter_t *)mv_gpio_intr, NULL,
+ INTR_TYPE_MISC, mv_gpio_intr, NULL,
sc, &sc->ih_cookie[i]) != 0) {
bus_release_resources(dev, mv_gpio_res, sc->res);
device_printf(dev, "could not set up intr %d\n", i);
@@ -208,7 +203,7 @@ mv_gpio_attach(device_t dev)
return (0);
}
-static void
+static int
mv_gpio_intr(void *arg)
{
uint32_t int_cause, gpio_val;
@@ -218,7 +213,7 @@ mv_gpio_intr(void *arg)
int_cause = mv_gpio_reg_read(GPIO_INT_CAUSE);
gpio_val = mv_gpio_reg_read(GPIO_DATA_IN);
gpio_val &= int_cause;
- if (mv_gpio_softc->use_high) {
+ if (mv_gpio_softc->pin_num > GPIO_PINS_PER_REG) {
int_cause_hi = mv_gpio_reg_read(GPIO_HI_INT_CAUSE);
gpio_val_hi = mv_gpio_reg_read(GPIO_HI_DATA_IN);
gpio_val_hi &= int_cause_hi;
@@ -232,7 +227,7 @@ mv_gpio_intr(void *arg)
i++;
}
- if (mv_gpio_softc->use_high) {
+ if (mv_gpio_softc->pin_num > GPIO_PINS_PER_REG) {
i = 0;
while (gpio_val_hi != 0) {
if (gpio_val_hi & 1)
@@ -241,6 +236,8 @@ mv_gpio_intr(void *arg)
i++;
}
}
+
+ return (FILTER_HANDLED);
}
/*
OpenPOWER on IntegriCloud