vserver 1.9.3
[linux-2.6.git] / drivers / serial / 8250_pci.c
index cf42b9d..55c8aa9 100644 (file)
@@ -28,7 +28,6 @@
 
 #include <asm/bitops.h>
 #include <asm/byteorder.h>
-#include <asm/serial.h>
 #include <asm/io.h>
 
 #include "8250.h"
@@ -84,7 +83,7 @@ struct pci_serial_quirk {
 
 struct serial_private {
        unsigned int            nr;
-       void                    *remapped_bar[PCI_NUM_BAR_RESOURCES];
+       void __iomem            *remapped_bar[PCI_NUM_BAR_RESOURCES];
        struct pci_serial_quirk *quirk;
        int                     line[0];
 };
@@ -244,7 +243,8 @@ static int __devinit pci_inteli960ni_init(struct pci_dev *dev)
  */
 static int __devinit pci_plx9050_init(struct pci_dev *dev)
 {
-       u8 *p, irq_config;
+       u8 irq_config;
+       void __iomem *p;
 
        if ((pci_resource_flags(dev, 0) & IORESOURCE_MEM) == 0) {
                moan_device("no memory in bar 0", dev);
@@ -273,12 +273,12 @@ static int __devinit pci_plx9050_init(struct pci_dev *dev)
        p = ioremap(pci_resource_start(dev, 0), 0x80);
        if (p == NULL)
                return -ENOMEM;
-       writel(irq_config, (unsigned long)p + 0x4c);
+       writel(irq_config, p + 0x4c);
 
        /*
         * Read the register back to ensure that it took effect.
         */
-       readl((unsigned long)p + 0x4c);
+       readl(p + 0x4c);
        iounmap(p);
 
        return 0;
@@ -398,7 +398,8 @@ static void __devexit sbs_exit(struct pci_dev *dev)
 
 static int pci_siig10x_init(struct pci_dev *dev)
 {
-       u16 data, *p;
+       u16 data;
+       void __iomem *p;
 
        switch (dev->device & 0xfff8) {
        case PCI_DEVICE_ID_SIIG_1S_10x: /* 1S */
@@ -416,8 +417,8 @@ static int pci_siig10x_init(struct pci_dev *dev)
        if (p == NULL)
                return -ENOMEM;
 
-       writew(readw((unsigned long) p + 0x28) & data, (unsigned long) p + 0x28);
-       readw((unsigned long)p + 0x28);
+       writew(readw(p + 0x28) & data, p + 0x28);
+       readw(p + 0x28);
        iounmap(p);
        return 0;
 }
@@ -498,7 +499,7 @@ static struct timedia_struct {
        { 2, timedia_dual_port },
        { 4, timedia_quad_port },
        { 8, timedia_eight_port },
-       { 0, 0 }
+       { 0, NULL }
 };
 
 static int __devinit pci_timedia_init(struct pci_dev *dev)
@@ -575,8 +576,7 @@ titan_400l_800l_setup(struct pci_dev *dev, struct pci_board *board,
 
 static int __devinit pci_xircom_init(struct pci_dev *dev)
 {
-       __set_current_state(TASK_UNINTERRUPTIBLE);
-       schedule_timeout(HZ/10);
+       msleep(100);
        return 0;
 }
 
@@ -704,7 +704,7 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
                .subdevice      = PCI_SUBDEVICE_ID_OCTPRO232,
                .init           = sbs_init,
                .setup          = sbs_setup,
-               .exit           = sbs_exit
+               .exit           = __devexit_p(sbs_exit),
        },
        /*
         * SBS Technologies, Inc., PMC-OCTALPRO 422
@@ -716,7 +716,7 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
                .subdevice      = PCI_SUBDEVICE_ID_OCTPRO422,
                .init           = sbs_init,
                .setup          = sbs_setup,
-               .exit           = sbs_exit
+               .exit           = __devexit_p(sbs_exit),
        },
        /*
         * SBS Technologies, Inc., P-Octal 232
@@ -728,7 +728,7 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
                .subdevice      = PCI_SUBDEVICE_ID_POCTAL232,
                .init           = sbs_init,
                .setup          = sbs_setup,
-               .exit           = sbs_exit
+               .exit           = __devexit_p(sbs_exit),
        },
        /*
         * SBS Technologies, Inc., P-Octal 422
@@ -740,7 +740,7 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
                .subdevice      = PCI_SUBDEVICE_ID_POCTAL422,
                .init           = sbs_init,
                .setup          = sbs_setup,
-               .exit           = sbs_exit
+               .exit           = __devexit_p(sbs_exit),
        },
 
        /*
@@ -1070,6 +1070,9 @@ enum pci_board_num_t {
        pbn_computone_6,
        pbn_computone_8,
        pbn_sbsxrsio,
+       pbn_exar_XR17C152,
+       pbn_exar_XR17C154,
+       pbn_exar_XR17C158,
 };
 
 /*
@@ -1490,7 +1493,30 @@ static struct pci_board pci_boards[] __devinitdata = {
                .base_baud      = 460800,
                .uart_offset    = 256,
                .reg_shift      = 4,
-       }
+       },
+       /*
+        * Exar Corp. XR17C15[248] Dual/Quad/Octal UART
+        *  Only basic 16550A support.
+        *  XR17C15[24] are not tested, but they should work.
+        */
+       [pbn_exar_XR17C152] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 2,
+               .base_baud      = 921600,
+               .uart_offset    = 0x200,
+       },
+       [pbn_exar_XR17C154] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 4,
+               .base_baud      = 921600,
+               .uart_offset    = 0x200,
+       },
+       [pbn_exar_XR17C158] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 8,
+               .base_baud      = 921600,
+               .uart_offset    = 0x200,
+       },
 };
 
 /*
@@ -1585,7 +1611,7 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
        struct pci_board *board, tmp;
        struct pci_serial_quirk *quirk;
        struct serial_struct serial_req;
-       int base_baud, rc, nr_ports, i;
+       int rc, nr_ports, i;
 
        if (ent->driver_data >= ARRAY_SIZE(pci_boards)) {
                printk(KERN_ERR "pci_init_one: invalid driver_data: %ld\n",
@@ -1663,16 +1689,11 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
        priv->quirk = quirk;
        pci_set_drvdata(dev, priv);
 
-       base_baud = board->base_baud;
-       if (!base_baud) {
-               moan_device("Board entry does not specify baud rate.", dev);
-               base_baud = BASE_BAUD;
-       }
        for (i = 0; i < nr_ports; i++) {
                memset(&serial_req, 0, sizeof(serial_req));
                serial_req.flags = UPF_SKIP_TEST | UPF_AUTOPROBE |
-                                  UPF_RESOURCES | UPF_SHARE_IRQ;
-               serial_req.baud_base = base_baud;
+                                  UPF_SHARE_IRQ;
+               serial_req.baud_base = board->base_baud;
                serial_req.irq = get_pci_irq(dev, board, i);
                if (quirk->setup(dev, board, &serial_req, i))
                        break;
@@ -2154,6 +2175,22 @@ static struct pci_device_id serial_pci_tbl[] = {
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                pbn_b3_8_115200 },
 
+       /*
+        * Exar Corp. XR17C15[248] Dual/Quad/Octal UART
+        */
+       {       PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17C152,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0,
+               0, pbn_exar_XR17C152 },
+       {       PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17C154,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0,
+               0, pbn_exar_XR17C154 },
+       {       PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17C158,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0,
+               0, pbn_exar_XR17C158 },
+
        /*
         * These entries match devices with class COMMUNICATION_SERIAL,
         * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL