diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2011-11-08 23:31:16 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2011-12-21 04:01:34 -0500 |
commit | cf41d53bf5b95d77673b185cc3b20ae3257f79e2 (patch) | |
tree | f070e08fe3a76715b95fec60b791bd59921b7fd8 /drivers/gpu | |
parent | 2a44e4997c5fee8e1da1589ff57e0bd1c53f03ce (diff) |
drm/nouveau: re-jig fbcon suspend/resume process a little
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_drv.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_fbcon.c | 7 |
2 files changed, 13 insertions, 16 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c index ffde896b1f3c..cb357ab3670c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.c +++ b/drivers/gpu/drm/nouveau/nouveau_drv.c | |||
@@ -180,8 +180,8 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state) | |||
180 | 180 | ||
181 | drm_kms_helper_poll_disable(dev); | 181 | drm_kms_helper_poll_disable(dev); |
182 | 182 | ||
183 | NV_INFO(dev, "Disabling fbcon acceleration...\n"); | 183 | NV_INFO(dev, "Disabling fbcon...\n"); |
184 | nouveau_fbcon_save_disable_accel(dev); | 184 | nouveau_fbcon_set_suspend(dev, 1); |
185 | 185 | ||
186 | NV_INFO(dev, "Unpinning framebuffer(s)...\n"); | 186 | NV_INFO(dev, "Unpinning framebuffer(s)...\n"); |
187 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 187 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
@@ -248,10 +248,6 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state) | |||
248 | pci_set_power_state(pdev, PCI_D3hot); | 248 | pci_set_power_state(pdev, PCI_D3hot); |
249 | } | 249 | } |
250 | 250 | ||
251 | console_lock(); | ||
252 | nouveau_fbcon_set_suspend(dev, 1); | ||
253 | console_unlock(); | ||
254 | nouveau_fbcon_restore_accel(dev); | ||
255 | return 0; | 251 | return 0; |
256 | 252 | ||
257 | out_abort: | 253 | out_abort: |
@@ -277,8 +273,6 @@ nouveau_pci_resume(struct pci_dev *pdev) | |||
277 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) | 273 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
278 | return 0; | 274 | return 0; |
279 | 275 | ||
280 | nouveau_fbcon_save_disable_accel(dev); | ||
281 | |||
282 | NV_INFO(dev, "We're back, enabling device...\n"); | 276 | NV_INFO(dev, "We're back, enabling device...\n"); |
283 | pci_set_power_state(pdev, PCI_D0); | 277 | pci_set_power_state(pdev, PCI_D0); |
284 | pci_restore_state(pdev); | 278 | pci_restore_state(pdev); |
@@ -360,7 +354,11 @@ nouveau_pci_resume(struct pci_dev *pdev) | |||
360 | NV_ERROR(dev, "Could not pin/map cursor.\n"); | 354 | NV_ERROR(dev, "Could not pin/map cursor.\n"); |
361 | } | 355 | } |
362 | 356 | ||
357 | nouveau_fbcon_set_suspend(dev, 0); | ||
358 | nouveau_fbcon_zfill_all(dev); | ||
359 | |||
363 | engine->display.init(dev); | 360 | engine->display.init(dev); |
361 | drm_kms_helper_poll_enable(dev); | ||
364 | 362 | ||
365 | /* Force CLUT to get re-loaded during modeset */ | 363 | /* Force CLUT to get re-loaded during modeset */ |
366 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 364 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
@@ -369,12 +367,6 @@ nouveau_pci_resume(struct pci_dev *pdev) | |||
369 | nv_crtc->lut.depth = 0; | 367 | nv_crtc->lut.depth = 0; |
370 | } | 368 | } |
371 | 369 | ||
372 | console_lock(); | ||
373 | nouveau_fbcon_set_suspend(dev, 0); | ||
374 | console_unlock(); | ||
375 | |||
376 | nouveau_fbcon_zfill_all(dev); | ||
377 | |||
378 | drm_helper_resume_force_mode(dev); | 370 | drm_helper_resume_force_mode(dev); |
379 | 371 | ||
380 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 372 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
@@ -386,8 +378,6 @@ nouveau_pci_resume(struct pci_dev *pdev) | |||
386 | nv_crtc->cursor_saved_y); | 378 | nv_crtc->cursor_saved_y); |
387 | } | 379 | } |
388 | 380 | ||
389 | nouveau_fbcon_restore_accel(dev); | ||
390 | drm_kms_helper_poll_enable(dev); | ||
391 | return 0; | 381 | return 0; |
392 | } | 382 | } |
393 | 383 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c index dbb151834121..9892218d7452 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/init.h> | 36 | #include <linux/init.h> |
37 | #include <linux/screen_info.h> | 37 | #include <linux/screen_info.h> |
38 | #include <linux/vga_switcheroo.h> | 38 | #include <linux/vga_switcheroo.h> |
39 | #include <linux/console.h> | ||
39 | 40 | ||
40 | #include "drmP.h" | 41 | #include "drmP.h" |
41 | #include "drm.h" | 42 | #include "drm.h" |
@@ -548,7 +549,13 @@ void nouveau_fbcon_restore_accel(struct drm_device *dev) | |||
548 | void nouveau_fbcon_set_suspend(struct drm_device *dev, int state) | 549 | void nouveau_fbcon_set_suspend(struct drm_device *dev, int state) |
549 | { | 550 | { |
550 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 551 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
552 | console_lock(); | ||
553 | if (state == 0) | ||
554 | nouveau_fbcon_save_disable_accel(dev); | ||
551 | fb_set_suspend(dev_priv->nfbdev->helper.fbdev, state); | 555 | fb_set_suspend(dev_priv->nfbdev->helper.fbdev, state); |
556 | if (state == 1) | ||
557 | nouveau_fbcon_restore_accel(dev); | ||
558 | console_unlock(); | ||
552 | } | 559 | } |
553 | 560 | ||
554 | void nouveau_fbcon_zfill_all(struct drm_device *dev) | 561 | void nouveau_fbcon_zfill_all(struct drm_device *dev) |