summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_drv.c
diff options
context:
space:
mode:
authorImre Deak2014-10-23 18:23:18 +0200
committerDaniel Vetter2014-10-24 16:34:17 +0200
commit5a17514ed924201f1465e4a2f5209bdb192d8dff (patch)
tree725e9d1452ae41d53f6ff8bf24a5c9d36f7168ec /drivers/gpu/drm/i915/i915_drv.c
parentdrm/i915: propagate error from legacy resume handler (diff)
downloadkernel-qcow2-linux-5a17514ed924201f1465e4a2f5209bdb192d8dff.tar.gz
kernel-qcow2-linux-5a17514ed924201f1465e4a2f5209bdb192d8dff.tar.xz
kernel-qcow2-linux-5a17514ed924201f1465e4a2f5209bdb192d8dff.zip
drm/i915: vlv: fix switcheroo/legacy suspend/resume
During switcheroo/legacy suspend we don't call the suspend_late handler but when resuming afterwards we call resume_early. This happened to work so far, since suspend_late only disabled the PCI device. This changed in commit 016970beb05da6285c2f3ed2bee1c676cb75972e Author: Sagar Kamble <sagar.a.kamble@intel.com> Date: Wed Aug 13 23:07:06 2014 +0530 drm/i915: Sharing platform specific sequence between runtime and system susp after which we also saved/restored the VLV Gunit HW state in suspend_late/resume_early. So now since we don't save the state during suspend a following resume will restore a corrupted state. Fix this by calling the suspend_late handler during both switcheroo and legacy suspend. CC: Sagar Kamble <sagar.a.kamble@intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Sagar Kamble <sagar.a.kamble@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.c')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 524c3dfed380..203bd820d5f7 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -670,11 +670,7 @@ int i915_suspend(struct drm_device *dev, pm_message_t state)
if (error)
return error;
- /* Shut down the device */
- pci_disable_device(dev->pdev);
- pci_set_power_state(dev->pdev, PCI_D3hot);
-
- return 0;
+ return i915_drm_suspend_late(dev);
}
static int i915_drm_thaw_early(struct drm_device *dev)
@@ -790,7 +786,7 @@ static int i915_resume_early(struct drm_device *dev)
return i915_drm_thaw_early(dev);
}
-int i915_resume(struct drm_device *dev)
+static int i915_drm_resume(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
int ret;
@@ -816,7 +812,12 @@ static int i915_resume_legacy(struct drm_device *dev)
if (ret)
return ret;
- return i915_resume(dev);
+ return i915_drm_resume(dev);
+}
+
+int i915_resume(struct drm_device *dev)
+{
+ return i915_resume_legacy(dev);
}
/**
@@ -1004,7 +1005,7 @@ static int i915_pm_resume(struct device *dev)
struct pci_dev *pdev = to_pci_dev(dev);
struct drm_device *drm_dev = pci_get_drvdata(pdev);
- return i915_resume(drm_dev);
+ return i915_drm_resume(drm_dev);
}
static int i915_pm_freeze(struct device *dev)