diff options
Diffstat (limited to 'sys/arch')
-rw-r--r-- | sys/arch/arm/xscale/pxa2x0_gpio.c | 20 | ||||
-rw-r--r-- | sys/arch/arm/xscale/pxa2x0_intr.c | 9 |
2 files changed, 20 insertions, 9 deletions
diff --git a/sys/arch/arm/xscale/pxa2x0_gpio.c b/sys/arch/arm/xscale/pxa2x0_gpio.c index 8a5766894d4..dc41d76d7d2 100644 --- a/sys/arch/arm/xscale/pxa2x0_gpio.c +++ b/sys/arch/arm/xscale/pxa2x0_gpio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pxa2x0_gpio.c,v 1.10 2005/01/13 20:46:28 drahn Exp $ */ +/* $OpenBSD: pxa2x0_gpio.c,v 1.11 2005/01/17 04:27:20 drahn Exp $ */ /* $NetBSD: pxa2x0_gpio.c,v 1.2 2003/07/15 00:24:55 lukem Exp $ */ /* @@ -191,7 +191,7 @@ pxagpio_attach(struct device *parent, struct device *self, void *aux) #ifdef PXAGPIO_HAS_GPION_INTRS sc->sc_irqcookie[2] = pxa2x0_intr_establish(PXA2X0_INT_GPION, IPL_BIO, - gpio_intrN, sc, sc->sc_dev.dv_xname); + gpio_intrN, sc, NULL); if (sc->sc_irqcookie[2] == NULL) { printf("%s: failed to hook main GPIO interrupt\n", sc->sc_dev.dv_xname); @@ -260,13 +260,13 @@ pxa2x0_gpio_intr_establish(u_int gpio, int level, int spl, int (*func)(void *), if (gpio == 0) { KDASSERT(sc->sc_irqcookie[0] == NULL); sc->sc_irqcookie[0] = pxa2x0_intr_establish(PXA2X0_INT_GPIO0, - spl, gpio_intr0, sc, sc->sc_dev.dv_xname); + spl, gpio_intr0, sc, NULL); KDASSERT(sc->sc_irqcookie[0]); } else if (gpio == 1) { KDASSERT(sc->sc_irqcookie[1] == NULL); sc->sc_irqcookie[1] = pxa2x0_intr_establish(PXA2X0_INT_GPIO1, - spl, gpio_intr1, sc, sc->sc_dev.dv_xname); + spl, gpio_intr1, sc, NULL); KDASSERT(sc->sc_irqcookie[1]); } @@ -334,6 +334,7 @@ static int gpio_intr0(void *arg) { struct pxagpio_softc *sc = arg; + int ret; #ifdef DIAGNOSTIC if (sc->sc_handlers[0] == NULL) { @@ -346,13 +347,17 @@ gpio_intr0(void *arg) bus_space_write_4(sc->sc_bust, sc->sc_bush, GPIO_REG(GPIO_GEDR0, 0), GPIO_BIT(0)); - return ((sc->sc_handlers[0]->gh_func)(sc->sc_handlers[0]->gh_arg)); + ret = (sc->sc_handlers[0]->gh_func)(sc->sc_handlers[0]->gh_arg); + if (ret != 0) + sc->sc_handlers[0]->gh_count.ec_count++; + return ret; } static int gpio_intr1(void *arg) { struct pxagpio_softc *sc = arg; + int ret; #ifdef DIAGNOSTIC if (sc->sc_handlers[1] == NULL) { @@ -365,7 +370,10 @@ gpio_intr1(void *arg) bus_space_write_4(sc->sc_bust, sc->sc_bush, GPIO_REG(GPIO_GEDR0, 1), GPIO_BIT(1)); - return ((sc->sc_handlers[1]->gh_func)(sc->sc_handlers[1]->gh_arg)); + ret = (sc->sc_handlers[1]->gh_func)(sc->sc_handlers[1]->gh_arg); + if (ret != 0) + sc->sc_handlers[0]->gh_count.ec_count++; + return ret; } #ifdef PXAGPIO_HAS_GPION_INTRS diff --git a/sys/arch/arm/xscale/pxa2x0_intr.c b/sys/arch/arm/xscale/pxa2x0_intr.c index c9b80f5304f..c6adc81061a 100644 --- a/sys/arch/arm/xscale/pxa2x0_intr.c +++ b/sys/arch/arm/xscale/pxa2x0_intr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pxa2x0_intr.c,v 1.6 2005/01/13 17:59:32 drahn Exp $ */ +/* $OpenBSD: pxa2x0_intr.c,v 1.7 2005/01/17 04:27:20 drahn Exp $ */ /* $NetBSD: pxa2x0_intr.c,v 1.5 2003/07/15 00:24:55 lukem Exp $ */ /* @@ -452,7 +452,9 @@ pxa2x0_intr_establish(int irqno, int level, ih->ih_irq = irqno; extirq_level[irqno] = level; - evcount_attach(&ih->ih_count, name, (void *)&ih->ih_irq, &evcount_intr); + if (name != NULL) + evcount_attach(&ih->ih_count, name, (void *)&ih->ih_irq, + &evcount_intr); pxa2x0_update_intr_masks(irqno, level); @@ -478,7 +480,8 @@ pxa2x0_intr_disestablish(void *cookie) psw = disable_interrupts(I32_bit); ih = &handler[irqno]; - evcount_detach(&ih->ih_count); + if (ih->name != NULL) + evcount_detach(&ih->ih_count); ih->arg = (void *) irqno; ih->func = pxa2x0_stray_interrupt; |