summaryrefslogtreecommitdiffstats
path: root/c/src/libchip/serial/ns16550.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2011-07-11 13:31:13 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2011-07-11 13:31:13 +0000
commitfbf7e5878ab44e9cf42d409b77b80620a1bf8105 (patch)
tree7dae27a8f1bd551438303a760761906c8be77c60 /c/src/libchip/serial/ns16550.c
parent2011-07-11 Sebastien Bourdeauducq <sebastien.bourdeauducq@gmail.com> (diff)
downloadrtems-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 'c/src/libchip/serial/ns16550.c')
-rw-r--r--c/src/libchip/serial/ns16550.c40
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
*