isicom: Split the close hardware bits out
[platform/kernel/linux-starfive.git] / drivers / char / isicom.c
index 4159292..08f5743 100644 (file)
 #include <linux/fs.h>
 #include <linux/sched.h>
 #include <linux/serial.h>
+#include <linux/smp_lock.h>
 #include <linux/mm.h>
 #include <linux/interrupt.h>
 #include <linux/timer.h>
@@ -951,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);
@@ -973,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);
 }
 
@@ -1478,10 +1482,10 @@ static int __devinit load_firmware(struct pci_dev *pdev,
                status = inw(base + 0x4);
                if (status != 0) {
                        dev_warn(&pdev->dev, "Card%d rejected load header:\n"
-                               KERN_WARNING "Address:0x%x\n"
-                               KERN_WARNING "Count:0x%x\n"
-                               KERN_WARNING "Status:0x%x\n",
-                               index + 1, frame->addr, frame->count, status);
+                                "Address:0x%x\n"
+                                "Count:0x%x\n"
+                                "Status:0x%x\n",
+                                index + 1, frame->addr, frame->count, status);
                        goto errrelfw;
                }
                outsw(base, frame->data, word_count);
@@ -1526,10 +1530,10 @@ static int __devinit load_firmware(struct pci_dev *pdev,
                status = inw(base + 0x4);
                if (status != 0) {
                        dev_warn(&pdev->dev, "Card%d rejected verify header:\n"
-                               KERN_WARNING "Address:0x%x\n"
-                               KERN_WARNING "Count:0x%x\n"
-                               KERN_WARNING "Status: 0x%x\n",
-                               index + 1, frame->addr, frame->count, status);
+                                "Address:0x%x\n"
+                                "Count:0x%x\n"
+                                "Status: 0x%x\n",
+                                index + 1, frame->addr, frame->count, status);
                        goto errrelfw;
                }