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 | 6f6412b4c76441f2060e580b8d5cbda07dabde37 (patch) | |
tree | 9970a24ad9f8f602f1ea0fb4300218e1d753eec9 /drivers/char/isicom.c | |
parent | 1e2b025453d45d35b07d8105bea7fc9d339ff562 (diff) | |
download | lwn-6f6412b4c76441f2060e580b8d5cbda07dabde37.tar.gz lwn-6f6412b4c76441f2060e580b8d5cbda07dabde37.zip |
isicom: Split the close hardware bits out
Start to extract and build a model for a common tty_port_close()
Signed-off-by: Alan Cox <alan@linux.intel.com>
Diffstat (limited to 'drivers/char/isicom.c')
-rw-r--r-- | drivers/char/isicom.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/drivers/char/isicom.c b/drivers/char/isicom.c index 4f1f4cd670da..08f574333a57 100644 --- a/drivers/char/isicom.c +++ b/drivers/char/isicom.c @@ -952,19 +952,12 @@ static void isicom_flush_buffer(struct tty_struct *tty) tty_wakeup(tty); } -static void isicom_close(struct tty_struct *tty, struct file *filp) +static void isicom_close_port(struct tty_port *port) { - struct isi_port *ip = tty->driver_data; - struct tty_port *port = &ip->port; - struct isi_board *card; + struct isi_port *ip = container_of(port, struct isi_port, port); + struct isi_board *card = ip->card; unsigned long flags; - BUG_ON(!ip); - - card = ip->card; - if (isicom_paranoia_check(ip, tty->name, "isicom_close")) - return; - /* indicate to the card that no more data can be received on this port */ spin_lock_irqsave(&card->card_lock, flags); @@ -974,9 +967,19 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) } isicom_shutdown_port(ip); spin_unlock_irqrestore(&card->card_lock, flags); +} +static void isicom_close(struct tty_struct *tty, struct file *filp) +{ + struct isi_port *ip = tty->driver_data; + struct tty_port *port = &ip->port; + if (isicom_paranoia_check(ip, tty->name, "isicom_close")) + return; + + if (tty_port_close_start(port, tty, filp) == 0) + return; + isicom_close_port(port); isicom_flush_buffer(tty); - tty_port_close_end(port, tty); } |