diff options
Diffstat (limited to 'drivers/char/riscom8.c')
-rw-r--r-- | drivers/char/riscom8.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/drivers/char/riscom8.c b/drivers/char/riscom8.c index 171711acf5cd..949999120258 100644 --- a/drivers/char/riscom8.c +++ b/drivers/char/riscom8.c | |||
@@ -921,20 +921,12 @@ static void rc_flush_buffer(struct tty_struct *tty) | |||
921 | tty_wakeup(tty); | 921 | tty_wakeup(tty); |
922 | } | 922 | } |
923 | 923 | ||
924 | static void rc_close(struct tty_struct *tty, struct file *filp) | 924 | static void rc_close_port(struct tty_struct *tty, struct tty_port *port) |
925 | { | 925 | { |
926 | struct riscom_port *port = tty->driver_data; | ||
927 | struct riscom_board *bp; | ||
928 | unsigned long flags; | 926 | unsigned long flags; |
927 | struct riscom_port *rp = container_of(port, struct riscom_port, port); | ||
928 | struct riscom_board *bp = port_Board(rp); | ||
929 | unsigned long timeout; | 929 | unsigned long timeout; |
930 | |||
931 | if (!port || rc_paranoia_check(port, tty->name, "close")) | ||
932 | return; | ||
933 | |||
934 | bp = port_Board(port); | ||
935 | |||
936 | if (tty_port_close_start(&port->port, tty, filp) == 0) | ||
937 | return; | ||
938 | 930 | ||
939 | /* | 931 | /* |
940 | * At this point we stop accepting input. To do this, we | 932 | * At this point we stop accepting input. To do this, we |
@@ -944,29 +936,42 @@ static void rc_close(struct tty_struct *tty, struct file *filp) | |||
944 | */ | 936 | */ |
945 | 937 | ||
946 | spin_lock_irqsave(&riscom_lock, flags); | 938 | spin_lock_irqsave(&riscom_lock, flags); |
947 | port->IER &= ~IER_RXD; | 939 | rp->IER &= ~IER_RXD; |
948 | if (port->port.flags & ASYNC_INITIALIZED) { | 940 | if (port->flags & ASYNC_INITIALIZED) { |
949 | port->IER &= ~IER_TXRDY; | 941 | rp->IER &= ~IER_TXRDY; |
950 | port->IER |= IER_TXEMPTY; | 942 | rp->IER |= IER_TXEMPTY; |
951 | rc_out(bp, CD180_CAR, port_No(port)); | 943 | rc_out(bp, CD180_CAR, port_No(rp)); |
952 | rc_out(bp, CD180_IER, port->IER); | 944 | rc_out(bp, CD180_IER, rp->IER); |
953 | /* | 945 | /* |
954 | * Before we drop DTR, make sure the UART transmitter | 946 | * Before we drop DTR, make sure the UART transmitter |
955 | * has completely drained; this is especially | 947 | * has completely drained; this is especially |
956 | * important if there is a transmit FIFO! | 948 | * important if there is a transmit FIFO! |
957 | */ | 949 | */ |
958 | timeout = jiffies + HZ; | 950 | timeout = jiffies + HZ; |
959 | while (port->IER & IER_TXEMPTY) { | 951 | while (rp->IER & IER_TXEMPTY) { |
960 | spin_unlock_irqrestore(&riscom_lock, flags); | 952 | spin_unlock_irqrestore(&riscom_lock, flags); |
961 | msleep_interruptible(jiffies_to_msecs(port->timeout)); | 953 | msleep_interruptible(jiffies_to_msecs(rp->timeout)); |
962 | spin_lock_irqsave(&riscom_lock, flags); | 954 | spin_lock_irqsave(&riscom_lock, flags); |
963 | if (time_after(jiffies, timeout)) | 955 | if (time_after(jiffies, timeout)) |
964 | break; | 956 | break; |
965 | } | 957 | } |
966 | } | 958 | } |
967 | rc_shutdown_port(tty, bp, port); | 959 | rc_shutdown_port(tty, bp, rp); |
968 | rc_flush_buffer(tty); | ||
969 | spin_unlock_irqrestore(&riscom_lock, flags); | 960 | spin_unlock_irqrestore(&riscom_lock, flags); |
961 | } | ||
962 | |||
963 | static void rc_close(struct tty_struct *tty, struct file *filp) | ||
964 | { | ||
965 | struct riscom_port *port = tty->driver_data; | ||
966 | |||
967 | if (!port || rc_paranoia_check(port, tty->name, "close")) | ||
968 | return; | ||
969 | |||
970 | if (tty_port_close_start(&port->port, tty, filp) == 0) | ||
971 | return; | ||
972 | |||
973 | rc_close_port(tty, &port->port); | ||
974 | rc_flush_buffer(tty); | ||
970 | 975 | ||
971 | tty_port_close_end(&port->port, tty); | 976 | tty_port_close_end(&port->port, tty); |
972 | } | 977 | } |