PCI: Don't touch card regs after runtime suspend D3
authorDave Airlie <airlied@redhat.com>
Mon, 29 Oct 2012 23:26:54 +0000 (17:26 -0600)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 7 Nov 2012 22:24:18 +0000 (15:24 -0700)
If the driver takes care of state saving, don't touch any registers on it.

Optimus (dual-gpu) laptops seem to have their own form of D3cold, but
unfortunately enter it on normal D3 transitions via the ACPI callback.

So when we use runtime PM to transition to D3, the card disappears off
the PCI bus, however we then try to access registers on it in the
runtime suspend finish, which really doesn't work.

This patch checks whether the pci state is saved and doesn't attempt to hit
any registers after that point if it is.

(Looks okay to Rafael)

Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pci-driver.c

index 94c6e2aa03d658defb5d30b0f2fbb1f8383cf9d0..11d9c8a9d0d0f71efcf5410fc4ffb919e39bedc9 100644 (file)
@@ -1023,10 +1023,10 @@ static int pci_pm_runtime_suspend(struct device *dev)
                return 0;
        }
 
-       if (!pci_dev->state_saved)
+       if (!pci_dev->state_saved) {
                pci_save_state(pci_dev);
-
-       pci_finish_runtime_suspend(pci_dev);
+               pci_finish_runtime_suspend(pci_dev);
+       }
 
        return 0;
 }