hsu: call PCI pm hooks in suspend/resume function
authorFeng Tang <feng.tang@intel.com>
Tue, 27 Jul 2010 07:20:52 +0000 (08:20 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 10 Aug 2010 20:47:46 +0000 (13:47 -0700)
Also add check for dma controller or the uart ports.

Signed-off-by: Feng Tang <feng.tang@intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/serial/mfd.c

index f5e7569..bc9af50 100644 (file)
@@ -1217,25 +1217,38 @@ static struct uart_driver serial_hsu_reg = {
 #ifdef CONFIG_PM
 static int serial_hsu_suspend(struct pci_dev *pdev, pm_message_t state)
 {
+       void *priv = pci_get_drvdata(pdev);
        struct uart_hsu_port *up;
 
-       up = pci_get_drvdata(pdev);
-       if (!up)
-               return 0;
-
-       uart_suspend_port(&serial_hsu_reg, &up->port);
+       /* Make sure this is not the internal dma controller */
+       if (priv && (pdev->device != 0x081E)) {
+               up = priv;
+               uart_suspend_port(&serial_hsu_reg, &up->port);
+       }
 
+       pci_save_state(pdev);
+       pci_set_power_state(pdev, pci_choose_state(pdev, state));
         return 0;
 }
 
 static int serial_hsu_resume(struct pci_dev *pdev)
 {
+       void *priv = pci_get_drvdata(pdev);
        struct uart_hsu_port *up;
+       int ret;
 
-       up = pci_get_drvdata(pdev);
-       if (!up)
-               return 0;
-       uart_resume_port(&serial_hsu_reg, &up->port);
+       pci_set_power_state(pdev, PCI_D0);
+       pci_restore_state(pdev);
+
+       ret = pci_enable_device(pdev);
+       if (ret)
+               dev_warn(&pdev->dev,
+                       "HSU: can't re-enable device, try to continue\n");
+
+       if (priv && (pdev->device != 0x081E)) {
+               up = priv;
+               uart_resume_port(&serial_hsu_reg, &up->port);
+       }
        return 0;
 }
 #else