diff options
Diffstat (limited to 'sys/arm/mv/gpio.c')
-rw-r--r-- | sys/arm/mv/gpio.c | 19 |
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); } /* |