diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2011-07-11 13:31:13 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2011-07-11 13:31:13 +0000 |
commit | fbf7e5878ab44e9cf42d409b77b80620a1bf8105 (patch) | |
tree | 7dae27a8f1bd551438303a760761906c8be77c60 /c/src/libchip/serial/ns16550.c | |
parent | 2011-07-11 Sebastien Bourdeauducq <sebastien.bourdeauducq@gmail.com> (diff) | |
download | rtems-fbf7e5878ab44e9cf42d409b77b80620a1bf8105.tar.bz2 |
2011-07-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libchip/serial/ns16550_p.h, libchip/serial/ns16550.c: Remove
interrupt handler during last close.
Diffstat (limited to '')
-rw-r--r-- | c/src/libchip/serial/ns16550.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/c/src/libchip/serial/ns16550.c b/c/src/libchip/serial/ns16550.c index 2293e3bdd8..bd83b55506 100644 --- a/c/src/libchip/serial/ns16550.c +++ b/c/src/libchip/serial/ns16550.c @@ -203,15 +203,21 @@ NS16550_STATIC int ns16550_close( void * arg ) { + console_tbl *c = &Console_Port_Tbl [minor]; + /* * Negate DTR */ - if(Console_Port_Tbl[minor].pDeviceFlow != &ns16550_flow_DTRCTS) { + if (c->pDeviceFlow != &ns16550_flow_DTRCTS) { ns16550_negate_DTR(minor); } ns16550_enable_interrupts(minor, NS16550_DISABLE_ALL_INTR); + if (c->pDeviceFns->deviceOutputUsesInterrupts) { + ns16550_cleanup_interrupts(minor); + } + return(RTEMS_SUCCESSFUL); } @@ -651,6 +657,38 @@ NS16550_STATIC void ns16550_initialize_interrupts( int minor) #endif } +NS16550_STATIC void ns16550_cleanup_interrupts(int minor) +{ + #if defined(BSP_FEATURE_IRQ_EXTENSION) + rtems_status_code sc = RTEMS_SUCCESSFUL; + console_tbl *c = &Console_Port_Tbl [minor]; + sc = rtems_interrupt_handler_remove( + c->ulIntVector, + ns16550_isr, + (void *) minor + ); + if (sc != RTEMS_SUCCESSFUL) { + /* FIXME */ + printk("%s: Error: Remove interrupt handler\n", __func__); + rtems_fatal_error_occurred(0xdeadbeef); + } + #elif defined(BSP_FEATURE_IRQ_LEGACY) + int rv = 0; + console_tbl *c = &Console_Port_Tbl [minor]; + rtems_irq_connect_data cd = { + .name = c->ulIntVector, + .hdl = ns16550_isr, + .handle = (void *) minor + }; + rv = BSP_remove_rtems_irq_handler(&cd); + if (rv == 0) { + /* FIXME */ + printk("%s: Error: Remove interrupt handler\n", __func__); + rtems_fatal_error_occurred(0xdeadbeef); + } + #endif +} + /* * ns16550_write_support_polled * |