vserver 2.0 rc7
[linux-2.6.git] / drivers / serial / 8250_pci.c
index e99ffdd..de54bdc 100644 (file)
@@ -31,6 +31,8 @@
 
 #include "8250.h"
 
+#undef SERIAL_DEBUG_PCI
+
 /*
  * Definitions for PCI support.
  */
@@ -577,6 +579,16 @@ static int __devinit pci_xircom_init(struct pci_dev *dev)
        return 0;
 }
 
+static int __devinit pci_netmos_init(struct pci_dev *dev)
+{
+       /* subdevice 0x00PS means <P> parallel, <S> serial */
+       unsigned int num_serial = dev->subsystem_device & 0xf;
+
+       if (num_serial == 0)
+               return -ENODEV;
+       return num_serial;
+}
+
 static int
 pci_default_setup(struct pci_dev *dev, struct pci_board *board,
                  struct uart_port *port, int idx)
@@ -933,6 +945,17 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
                .init           = pci_xircom_init,
                .setup          = pci_default_setup,
        },
+       /*
+        * Netmos cards
+        */
+       {
+               .vendor         = PCI_VENDOR_ID_NETMOS,
+               .device         = PCI_ANY_ID,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_netmos_init,
+               .setup          = pci_default_setup,
+       },
        /*
         * Default "match everything" terminator entry
         */
@@ -986,6 +1009,8 @@ get_pci_irq(struct pci_dev *dev, struct pci_board *board, int idx)
  *  n    = number of serial ports
  *  baud = baud rate
  *
+ * This table is sorted by (in order): baud, bt, bn, n.
+ *
  * Please note: in theory if n = 1, _bt infix should make no difference.
  * ie, pbn_b0_1_115200 is the same as pbn_b0_bt_1_115200
  */
@@ -1759,7 +1784,7 @@ static void __devexit pciserial_remove_one(struct pci_dev *dev)
        }
 }
 
-static int pciserial_suspend_one(struct pci_dev *dev, u32 state)
+static int pciserial_suspend_one(struct pci_dev *dev, pm_message_t state)
 {
        struct serial_private *priv = pci_get_drvdata(dev);
 
@@ -1769,6 +1794,8 @@ static int pciserial_suspend_one(struct pci_dev *dev, u32 state)
                for (i = 0; i < priv->nr; i++)
                        serial8250_suspend_port(priv->line[i]);
        }
+       pci_save_state(dev);
+       pci_set_power_state(dev, pci_choose_state(dev, state));
        return 0;
 }
 
@@ -1776,9 +1803,17 @@ static int pciserial_resume_one(struct pci_dev *dev)
 {
        struct serial_private *priv = pci_get_drvdata(dev);
 
+       pci_set_power_state(dev, PCI_D0);
+       pci_restore_state(dev);
+
        if (priv) {
                int i;
 
+               /*
+                * The device may have been disabled.  Re-enable it.
+                */
+               pci_enable_device(dev);
+
                /*
                 * Ensure that the board is correctly configured.
                 */
@@ -1867,6 +1902,9 @@ static struct pci_device_id serial_pci_tbl[] = {
        {       PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_COMM8,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
                pbn_b2_8_115200 },
+       {       PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM8,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b2_8_115200 },
 
        {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_GTEK_SERIAL2,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
@@ -2174,6 +2212,9 @@ static struct pci_device_id serial_pci_tbl[] = {
        /*
         * HP Diva card
         */
+       {       PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA,
+               PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_RMP3, 0, 0,
+               pbn_b1_1_115200 },
        {       PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                pbn_b0_5_115200 },