serial: 8250_pci: Add MKS Tenta SCOM-0800 and SCOM-0801 cards
[pandora-kernel.git] / drivers / tty / serial / 8250_pci.c
index 825937a..7619e98 100644 (file)
@@ -67,7 +67,7 @@ static void moan_device(const char *str, struct pci_dev *dev)
               "Please send the output of lspci -vv, this\n"
               "message (0x%04x,0x%04x,0x%04x,0x%04x), the\n"
               "manufacturer and name of serial board or\n"
-              "modem board to rmk+serial@arm.linux.org.uk.\n",
+              "modem board to <linux-serial@vger.kernel.org>.\n",
               pci_name(dev), str, dev->vendor, dev->device,
               dev->subsystem_vendor, dev->subsystem_device);
 }
@@ -1077,6 +1077,18 @@ pci_omegapci_setup(struct serial_private *priv,
        return setup_port(priv, port, 2, idx * 8, 0);
 }
 
+static int
+pci_brcm_trumanage_setup(struct serial_private *priv,
+                        const struct pciserial_board *board,
+                        struct uart_port *port, int idx)
+{
+       int ret = pci_default_setup(priv, board, port, idx);
+
+       port->type = PORT_BRCM_TRUMANAGE;
+       port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
+       return ret;
+}
+
 static int skip_tx_en_setup(struct serial_private *priv,
                        const struct pciserial_board *board,
                        struct uart_port *port, int idx)
@@ -1118,6 +1130,8 @@ pci_xr17c154_setup(struct serial_private *priv,
 #define PCI_SUBDEVICE_ID_OCTPRO422     0x0208
 #define PCI_SUBDEVICE_ID_POCTAL232     0x0308
 #define PCI_SUBDEVICE_ID_POCTAL422     0x0408
+#define PCI_SUBDEVICE_ID_SIIG_DUAL_00  0x2500
+#define PCI_SUBDEVICE_ID_SIIG_DUAL_30  0x2530
 #define PCI_VENDOR_ID_ADVANTECH                0x13fe
 #define PCI_DEVICE_ID_INTEL_CE4100_UART 0x2e66
 #define PCI_DEVICE_ID_ADVANTECH_PCI3620        0x3620
@@ -1133,12 +1147,19 @@ pci_xr17c154_setup(struct serial_private *priv,
 #define PCI_DEVICE_ID_TITAN_800E       0xA014
 #define PCI_DEVICE_ID_TITAN_200EI      0xA016
 #define PCI_DEVICE_ID_TITAN_200EISI    0xA017
+#define PCI_DEVICE_ID_TITAN_200V3      0xA306
+#define PCI_DEVICE_ID_TITAN_400V3      0xA310
+#define PCI_DEVICE_ID_TITAN_410V3      0xA312
+#define PCI_DEVICE_ID_TITAN_800V3      0xA314
+#define PCI_DEVICE_ID_TITAN_800V3B     0xA315
 #define PCI_DEVICE_ID_OXSEMI_16PCI958  0x9538
 #define PCIE_DEVICE_ID_NEO_2_OX_IBM    0x00F6
 #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001
+#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
 
 /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
 #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584        0x1584
+#define PCI_SUBDEVICE_ID_UNKNOWN_0x1588        0x1588
 
 /*
  * Master list of serial port init/setup/exit quirks.
@@ -1401,15 +1422,6 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
                .setup          = pci_default_setup,
                .exit           = __devexit_p(pci_plx9050_exit),
        },
-       {
-               .vendor         = PCI_VENDOR_ID_PLX,
-               .device         = PCI_DEVICE_ID_PLX_9050,
-               .subvendor      = PCI_VENDOR_ID_PLX,
-               .subdevice      = PCI_SUBDEVICE_ID_UNKNOWN_0x1584,
-               .init           = pci_plx9050_init,
-               .setup          = pci_default_setup,
-               .exit           = __devexit_p(pci_plx9050_exit),
-       },
        {
                .vendor         = PCI_VENDOR_ID_PLX,
                .device         = PCI_DEVICE_ID_PLX_ROMULUS,
@@ -1590,54 +1602,72 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
        {
                .vendor         = PCI_VENDOR_ID_INTEL,
                .device         = 0x8811,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
                .init           = pci_eg20t_init,
                .setup          = pci_default_setup,
        },
        {
                .vendor         = PCI_VENDOR_ID_INTEL,
                .device         = 0x8812,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
                .init           = pci_eg20t_init,
                .setup          = pci_default_setup,
        },
        {
                .vendor         = PCI_VENDOR_ID_INTEL,
                .device         = 0x8813,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
                .init           = pci_eg20t_init,
                .setup          = pci_default_setup,
        },
        {
                .vendor         = PCI_VENDOR_ID_INTEL,
                .device         = 0x8814,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
                .init           = pci_eg20t_init,
                .setup          = pci_default_setup,
        },
        {
                .vendor         = 0x10DB,
                .device         = 0x8027,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
                .init           = pci_eg20t_init,
                .setup          = pci_default_setup,
        },
        {
                .vendor         = 0x10DB,
                .device         = 0x8028,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
                .init           = pci_eg20t_init,
                .setup          = pci_default_setup,
        },
        {
                .vendor         = 0x10DB,
                .device         = 0x8029,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
                .init           = pci_eg20t_init,
                .setup          = pci_default_setup,
        },
        {
                .vendor         = 0x10DB,
                .device         = 0x800C,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
                .init           = pci_eg20t_init,
                .setup          = pci_default_setup,
        },
        {
                .vendor         = 0x10DB,
                .device         = 0x800D,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
                .init           = pci_eg20t_init,
                .setup          = pci_default_setup,
        },
@@ -1651,6 +1681,17 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
                .subdevice      = PCI_ANY_ID,
                .setup          = pci_omegapci_setup,
         },
+       /*
+        * Broadcom TruManage (NetXtreme)
+        */
+       {
+               .vendor         = PCI_VENDOR_ID_BROADCOM,
+               .device         = PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_brcm_trumanage_setup,
+       },
+
        /*
         * Default "match everything" terminator entry
         */
@@ -1727,6 +1768,8 @@ enum pci_board_num_t {
 
        pbn_b0_4_1152000,
 
+       pbn_b0_4_1250000,
+
        pbn_b0_2_1843200,
        pbn_b0_4_1843200,
 
@@ -1840,6 +1883,7 @@ enum pci_board_num_t {
        pbn_ce4100_1_115200,
        pbn_omegapci,
        pbn_NETMOS9900_2s_115200,
+       pbn_brcm_trumanage,
 };
 
 /*
@@ -1922,6 +1966,13 @@ static struct pciserial_board pci_boards[] __devinitdata = {
                .uart_offset    = 8,
        },
 
+       [pbn_b0_4_1250000] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 4,
+               .base_baud      = 1250000,
+               .uart_offset    = 8,
+       },
+
        [pbn_b0_2_1843200] = {
                .flags          = FL_BASE0,
                .num_ports      = 2,
@@ -2546,6 +2597,12 @@ static struct pciserial_board pci_boards[] __devinitdata = {
                .num_ports      = 2,
                .base_baud      = 115200,
        },
+       [pbn_brcm_trumanage] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 1,
+               .reg_shift      = 2,
+               .base_baud      = 115200,
+       },
 };
 
 static const struct pci_device_id softmodem_blacklist[] = {
@@ -3069,7 +3126,12 @@ static struct pci_device_id serial_pci_tbl[] = {
        {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
                PCI_VENDOR_ID_PLX,
                PCI_SUBDEVICE_ID_UNKNOWN_0x1584, 0, 0,
-               pbn_b0_4_115200 },
+               pbn_b2_4_115200 },
+       /* Unknown card - subdevice 0x1588 */
+       {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
+               PCI_VENDOR_ID_PLX,
+               PCI_SUBDEVICE_ID_UNKNOWN_0x1588, 0, 0,
+               pbn_b2_8_115200 },
        {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
                PCI_SUBVENDOR_ID_KEYSPAN,
                PCI_SUBDEVICE_ID_KEYSPAN_SX2, 0, 0,
@@ -3150,8 +3212,11 @@ static struct pci_device_id serial_pci_tbl[] = {
                 * For now just used the hex ID 0x950a.
                 */
        {       PCI_VENDOR_ID_OXSEMI, 0x950a,
-               PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL, 0, 0,
-               pbn_b0_2_115200 },
+               PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_00,
+               0, 0, pbn_b0_2_115200 },
+       {       PCI_VENDOR_ID_OXSEMI, 0x950a,
+               PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_30,
+               0, 0, pbn_b0_2_115200 },
        {       PCI_VENDOR_ID_OXSEMI, 0x950a,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                pbn_b0_2_1130000 },
@@ -3414,6 +3479,21 @@ static struct pci_device_id serial_pci_tbl[] = {
        {       PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200EISI,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                pbn_oxsemi_2_4000000 },
+       {       PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200V3,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b0_bt_2_921600 },
+       {       PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400V3,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b0_4_921600 },
+       {       PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_410V3,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b0_4_921600 },
+       {       PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800V3,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b0_4_921600 },
+       {       PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800V3B,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b0_4_921600 },
 
        {       PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_550,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
@@ -4084,6 +4164,17 @@ static struct pci_device_id serial_pci_tbl[] = {
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                pbn_omegapci },
 
+       /*
+        * Broadcom TruManage
+        */
+       {       PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_brcm_trumanage },
+
+       /* MKS Tenta SCOM-080x serial cards */
+       { PCI_DEVICE(0x1601, 0x0800), .driver_data = pbn_b0_4_1250000 },
+       { PCI_DEVICE(0x1601, 0xa801), .driver_data = pbn_b0_4_1250000 },
+
        /*
         * These entries match devices with class COMMUNICATION_SERIAL,
         * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL