diff options
| author | Rafal Jaworowski <raj@FreeBSD.org> | 2008-09-11 12:36:13 +0000 |
|---|---|---|
| committer | Rafal Jaworowski <raj@FreeBSD.org> | 2008-09-11 12:36:13 +0000 |
| commit | f4e42148d701f5ef5b2f301abadbfb2b888f9967 (patch) | |
| tree | 42c4a1699b503244b7e33f5a53810449a27be094 /sys | |
| parent | e29b1b389b30bf8afc855b3dbf256ba20ed595ae (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/arm/arm/intr.c | 14 | ||||
| -rw-r--r-- | sys/arm/arm/nexus.c | 14 | ||||
| -rw-r--r-- | sys/arm/include/intr.h | 2 |
3 files changed, 16 insertions, 14 deletions
diff --git a/sys/arm/arm/intr.c b/sys/arm/arm/intr.c index 0787b88a54c1..85c2fd8fa3af 100644 --- a/sys/arm/arm/intr.c +++ b/sys/arm/arm/intr.c @@ -92,9 +92,19 @@ arm_setup_irqhandler(const char *name, driver_filter_t *filt, } int -arm_remove_irqhandler(void *cookie) +arm_remove_irqhandler(int irq, void *cookie) { - return (intr_event_remove_handler(cookie)); + struct intr_event *event; + int error; + + event = intr_events[irq]; + arm_mask_irq(irq); + + error = intr_event_remove_handler(cookie); + + if (!TAILQ_EMPTY(&event->ie_handlers)) + arm_unmask_irq(irq); + return (error); } void dosoftints(void); diff --git a/sys/arm/arm/nexus.c b/sys/arm/arm/nexus.c index 0be9ec117092..ca9c587813b7 100644 --- a/sys/arm/arm/nexus.c +++ b/sys/arm/arm/nexus.c @@ -120,34 +120,26 @@ nexus_probe(device_t dev) panic("nexus_probe mem_rman"); return (0); - return bus_generic_probe(dev); } static int nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep) { - int i; if ((rman_get_flags(res) & RF_SHAREABLE) == 0) flags |= INTR_EXCL; - for (i = rman_get_start(res); i <= rman_get_end(res); i++) - arm_setup_irqhandler(device_get_nameunit(child), - filt, intr, arg, i, flags, cookiep); + arm_setup_irqhandler(device_get_nameunit(child), + filt, intr, arg, rman_get_start(res), flags, cookiep); return (0); } static int nexus_teardown_intr(device_t dev, device_t child, struct resource *r, void *ih) { - int error; - int i; - for (i = rman_get_start(r); i <= rman_get_end(r); i++) - arm_mask_irq(i); - error = arm_remove_irqhandler(ih); - return (error); + return (arm_remove_irqhandler(rman_get_start(r), ih)); } static int diff --git a/sys/arm/include/intr.h b/sys/arm/include/intr.h index a41b214f82a9..bf2bf6d6a54f 100644 --- a/sys/arm/include/intr.h +++ b/sys/arm/include/intr.h @@ -57,6 +57,6 @@ void arm_mask_irq(uintptr_t); void arm_unmask_irq(uintptr_t); void arm_setup_irqhandler(const char *, int (*)(void*), void (*)(void*), void *, int, int, void **); -int arm_remove_irqhandler(void *); +int arm_remove_irqhandler(int, void *); extern void (*arm_post_filter)(void *); #endif /* _MACHINE_INTR_H */ |
