Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/hch/hfsplus
[pandora-kernel.git] / drivers / char / mxser.c
index 3fc89da..dd9d753 100644 (file)
@@ -303,6 +303,7 @@ static void mxser_enable_must_enchance_mode(unsigned long baseio)
        outb(oldlcr, baseio + UART_LCR);
 }
 
+#ifdef CONFIG_PCI
 static void mxser_disable_must_enchance_mode(unsigned long baseio)
 {
        u8 oldlcr;
@@ -317,6 +318,7 @@ static void mxser_disable_must_enchance_mode(unsigned long baseio)
        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
        outb(oldlcr, baseio + UART_LCR);
 }
+#endif
 
 static void mxser_set_must_xon1_value(unsigned long baseio, u8 value)
 {
@@ -388,6 +390,7 @@ static void mxser_set_must_enum_value(unsigned long baseio, u8 value)
        outb(oldlcr, baseio + UART_LCR);
 }
 
+#ifdef CONFIG_PCI
 static void mxser_get_must_hardware_id(unsigned long baseio, u8 *pId)
 {
        u8 oldlcr;
@@ -404,6 +407,7 @@ static void mxser_get_must_hardware_id(unsigned long baseio, u8 *pId)
        *pId = inb(baseio + MOXA_MUST_HWID_REGISTER);
        outb(oldlcr, baseio + UART_LCR);
 }
+#endif
 
 static void SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(unsigned long baseio)
 {
@@ -1700,7 +1704,7 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file,
                return 0;
        }
 
-       if (cmd != TIOCGSERIAL && cmd != TIOCMIWAIT && cmd != TIOCGICOUNT &&
+       if (cmd != TIOCGSERIAL && cmd != TIOCMIWAIT &&
                        test_bit(TTY_IO_ERROR, &tty->flags))
                return -EIO;
 
@@ -1730,32 +1734,6 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file,
 
                return wait_event_interruptible(info->port.delta_msr_wait,
                                mxser_cflags_changed(info, arg, &cnow));
-       /*
-        * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
-        * Return: write counters to the user passed counter struct
-        * NB: both 1->0 and 0->1 transitions are counted except for
-        *     RI where only 0->1 is counted.
-        */
-       case TIOCGICOUNT: {
-               struct serial_icounter_struct icnt = { 0 };
-               spin_lock_irqsave(&info->slock, flags);
-               cnow = info->icount;
-               spin_unlock_irqrestore(&info->slock, flags);
-
-               icnt.frame = cnow.frame;
-               icnt.brk = cnow.brk;
-               icnt.overrun = cnow.overrun;
-               icnt.buf_overrun = cnow.buf_overrun;
-               icnt.parity = cnow.parity;
-               icnt.rx = cnow.rx;
-               icnt.tx = cnow.tx;
-               icnt.cts = cnow.cts;
-               icnt.dsr = cnow.dsr;
-               icnt.rng = cnow.rng;
-               icnt.dcd = cnow.dcd;
-
-               return copy_to_user(argp, &icnt, sizeof(icnt)) ? -EFAULT : 0;
-       }
        case MOXA_HighSpeedOn:
                return put_user(info->baud_base != 115200 ? 1 : 0, (int __user *)argp);
        case MOXA_SDS_RSTICOUNTER:
@@ -1828,6 +1806,39 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file,
        return 0;
 }
 
+       /*
+        * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
+        * Return: write counters to the user passed counter struct
+        * NB: both 1->0 and 0->1 transitions are counted except for
+        *     RI where only 0->1 is counted.
+        */
+
+static int mxser_get_icount(struct tty_struct *tty,
+               struct serial_icounter_struct *icount)
+
+{
+       struct mxser_port *info = tty->driver_data;
+       struct async_icount cnow;
+       unsigned long flags;
+
+       spin_lock_irqsave(&info->slock, flags);
+       cnow = info->icount;
+       spin_unlock_irqrestore(&info->slock, flags);
+
+       icount->frame = cnow.frame;
+       icount->brk = cnow.brk;
+       icount->overrun = cnow.overrun;
+       icount->buf_overrun = cnow.buf_overrun;
+       icount->parity = cnow.parity;
+       icount->rx = cnow.rx;
+       icount->tx = cnow.tx;
+       icount->cts = cnow.cts;
+       icount->dsr = cnow.dsr;
+       icount->rng = cnow.rng;
+       icount->dcd = cnow.dcd;
+       return 0;
+}
+
 static void mxser_stoprx(struct tty_struct *tty)
 {
        struct mxser_port *info = tty->driver_data;
@@ -2326,6 +2337,7 @@ static const struct tty_operations mxser_ops = {
        .wait_until_sent = mxser_wait_until_sent,
        .tiocmget = mxser_tiocmget,
        .tiocmset = mxser_tiocmset,
+       .get_icount = mxser_get_icount,
 };
 
 struct tty_port_operations mxser_port_ops = {
@@ -2339,20 +2351,11 @@ struct tty_port_operations mxser_port_ops = {
  * The MOXA Smartio/Industio serial driver boot-time initialization code!
  */
 
-static void mxser_release_res(struct mxser_board *brd, struct pci_dev *pdev,
-               unsigned int irq)
+static void mxser_release_ISA_res(struct mxser_board *brd)
 {
-       if (irq)
-               free_irq(brd->irq, brd);
-       if (pdev != NULL) {     /* PCI */
-#ifdef CONFIG_PCI
-               pci_release_region(pdev, 2);
-               pci_release_region(pdev, 3);
-#endif
-       } else {
-               release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
-               release_region(brd->vector, 1);
-       }
+       free_irq(brd->irq, brd);
+       release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
+       release_region(brd->vector, 1);
 }
 
 static int __devinit mxser_initbrd(struct mxser_board *brd,
@@ -2397,13 +2400,11 @@ static int __devinit mxser_initbrd(struct mxser_board *brd,
 
        retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser",
                        brd);
-       if (retval) {
+       if (retval)
                printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may "
                        "conflict with another device.\n",
                        brd->info->name, brd->irq);
-               /* We hold resources, we need to release them. */
-               mxser_release_res(brd, pdev, 0);
-       }
+
        return retval;
 }
 
@@ -2555,7 +2556,7 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
        ioaddress = pci_resource_start(pdev, 2);
        retval = pci_request_region(pdev, 2, "mxser(IO)");
        if (retval)
-               goto err;
+               goto err_dis;
 
        brd->info = &mxser_cards[ent->driver_data];
        for (i = 0; i < brd->info->nports; i++)
@@ -2565,7 +2566,7 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
        ioaddress = pci_resource_start(pdev, 3);
        retval = pci_request_region(pdev, 3, "mxser(vector)");
        if (retval)
-               goto err_relio;
+               goto err_zero;
        brd->vector = ioaddress;
 
        /* irq */
@@ -2608,7 +2609,7 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
        /* mxser_initbrd will hook ISR. */
        retval = mxser_initbrd(brd, pdev);
        if (retval)
-               goto err_null;
+               goto err_rel3;
 
        for (i = 0; i < brd->info->nports; i++)
                tty_register_device(mxvar_sdriver, brd->idx + i, &pdev->dev);
@@ -2616,10 +2617,13 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
        pci_set_drvdata(pdev, brd);
 
        return 0;
-err_relio:
-       pci_release_region(pdev, 2);
-err_null:
+err_rel3:
+       pci_release_region(pdev, 3);
+err_zero:
        brd->info = NULL;
+       pci_release_region(pdev, 2);
+err_dis:
+       pci_disable_device(pdev);
 err:
        return retval;
 #else
@@ -2629,14 +2633,19 @@ err:
 
 static void __devexit mxser_remove(struct pci_dev *pdev)
 {
+#ifdef CONFIG_PCI
        struct mxser_board *brd = pci_get_drvdata(pdev);
        unsigned int i;
 
        for (i = 0; i < brd->info->nports; i++)
                tty_unregister_device(mxvar_sdriver, brd->idx + i);
 
-       mxser_release_res(brd, pdev, 1);
+       free_irq(pdev->irq, brd);
+       pci_release_region(pdev, 2);
+       pci_release_region(pdev, 3);
+       pci_disable_device(pdev);
        brd->info = NULL;
+#endif
 }
 
 static struct pci_driver mxser_driver = {
@@ -2741,7 +2750,7 @@ static void __exit mxser_module_exit(void)
 
        for (i = 0; i < MXSER_BOARDS; i++)
                if (mxser_boards[i].info != NULL)
-                       mxser_release_res(&mxser_boards[i], NULL, 1);
+                       mxser_release_ISA_res(&mxser_boards[i]);
 }
 
 module_init(mxser_module_init);