diff options
author | Alan Cox <alan@linux.intel.com> | 2009-09-19 13:13:21 -0700 |
---|---|---|
committer | Live-CD User <linux@linux.site> | 2009-09-19 13:13:21 -0700 |
commit | c146942573c84b16ccb480a9cfa885a7581585a8 (patch) | |
tree | 3d5b4e1d49ab0197c5223c249897fba1844eb592 /drivers | |
parent | 7ca0ff9ab3218ec443a7a9ad247e4650373ed41e (diff) | |
download | kernel_samsung_smdk4412-c146942573c84b16ccb480a9cfa885a7581585a8.zip kernel_samsung_smdk4412-c146942573c84b16ccb480a9cfa885a7581585a8.tar.gz kernel_samsung_smdk4412-c146942573c84b16ccb480a9cfa885a7581585a8.tar.bz2 |
riscom8: split open and close methods up
Moving towards a tty_port method for open/close
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-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 171711a..9499991 100644 --- a/drivers/char/riscom8.c +++ b/drivers/char/riscom8.c @@ -921,20 +921,12 @@ static void rc_flush_buffer(struct tty_struct *tty) tty_wakeup(tty); } -static void rc_close(struct tty_struct *tty, struct file *filp) +static void rc_close_port(struct tty_struct *tty, struct tty_port *port) { - struct riscom_port *port = tty->driver_data; - struct riscom_board *bp; unsigned long flags; + struct riscom_port *rp = container_of(port, struct riscom_port, port); + struct riscom_board *bp = port_Board(rp); unsigned long timeout; - - if (!port || rc_paranoia_check(port, tty->name, "close")) - return; - - bp = port_Board(port); - - if (tty_port_close_start(&port->port, tty, filp) == 0) - return; /* * 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) */ spin_lock_irqsave(&riscom_lock, flags); - port->IER &= ~IER_RXD; - if (port->port.flags & ASYNC_INITIALIZED) { - port->IER &= ~IER_TXRDY; - port->IER |= IER_TXEMPTY; - rc_out(bp, CD180_CAR, port_No(port)); - rc_out(bp, CD180_IER, port->IER); + rp->IER &= ~IER_RXD; + if (port->flags & ASYNC_INITIALIZED) { + rp->IER &= ~IER_TXRDY; + rp->IER |= IER_TXEMPTY; + rc_out(bp, CD180_CAR, port_No(rp)); + rc_out(bp, CD180_IER, rp->IER); /* * Before we drop DTR, make sure the UART transmitter * has completely drained; this is especially * important if there is a transmit FIFO! */ timeout = jiffies + HZ; - while (port->IER & IER_TXEMPTY) { + while (rp->IER & IER_TXEMPTY) { spin_unlock_irqrestore(&riscom_lock, flags); - msleep_interruptible(jiffies_to_msecs(port->timeout)); + msleep_interruptible(jiffies_to_msecs(rp->timeout)); spin_lock_irqsave(&riscom_lock, flags); if (time_after(jiffies, timeout)) break; } } - rc_shutdown_port(tty, bp, port); - rc_flush_buffer(tty); + rc_shutdown_port(tty, bp, rp); spin_unlock_irqrestore(&riscom_lock, flags); +} + +static void rc_close(struct tty_struct *tty, struct file *filp) +{ + struct riscom_port *port = tty->driver_data; + + if (!port || rc_paranoia_check(port, tty->name, "close")) + return; + + if (tty_port_close_start(&port->port, tty, filp) == 0) + return; + + rc_close_port(tty, &port->port); + rc_flush_buffer(tty); tty_port_close_end(&port->port, tty); } |