diff options
author | Dave Airlie <airlied@redhat.com> | 2010-05-31 19:09:06 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-05-31 20:36:02 -0400 |
commit | fbf81762e385d3d45acad057b654d56972acf58c (patch) | |
tree | bc1b9e31e92ca702ea808650fda45443145f6776 /drivers/gpu | |
parent | fc5ea29d72bde1bec230538becf396caad8621b8 (diff) |
drm/kms: disable/enable poll around switcheroo on/off
Because we aren't in a suspend state the poll will still run when we have switcherooed a card off.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 28 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_state.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 2 |
4 files changed, 30 insertions, 7 deletions
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index 764401951041..9b2a54117c91 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c | |||
@@ -860,19 +860,24 @@ static void output_poll_execute(struct slow_work *work) | |||
860 | } | 860 | } |
861 | } | 861 | } |
862 | 862 | ||
863 | void drm_kms_helper_poll_init(struct drm_device *dev) | 863 | void drm_kms_helper_poll_disable(struct drm_device *dev) |
864 | { | ||
865 | if (!dev->mode_config.poll_enabled) | ||
866 | return; | ||
867 | delayed_slow_work_cancel(&dev->mode_config.output_poll_slow_work); | ||
868 | } | ||
869 | EXPORT_SYMBOL(drm_kms_helper_poll_disable); | ||
870 | |||
871 | void drm_kms_helper_poll_enable(struct drm_device *dev) | ||
864 | { | 872 | { |
865 | struct drm_connector *connector; | ||
866 | bool poll = false; | 873 | bool poll = false; |
874 | struct drm_connector *connector; | ||
867 | int ret; | 875 | int ret; |
868 | 876 | ||
869 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 877 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
870 | if (connector->polled) | 878 | if (connector->polled) |
871 | poll = true; | 879 | poll = true; |
872 | } | 880 | } |
873 | slow_work_register_user(THIS_MODULE); | ||
874 | delayed_slow_work_init(&dev->mode_config.output_poll_slow_work, | ||
875 | &output_poll_ops); | ||
876 | 881 | ||
877 | if (poll) { | 882 | if (poll) { |
878 | ret = delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, DRM_OUTPUT_POLL_PERIOD); | 883 | ret = delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, DRM_OUTPUT_POLL_PERIOD); |
@@ -880,11 +885,22 @@ void drm_kms_helper_poll_init(struct drm_device *dev) | |||
880 | DRM_ERROR("delayed enqueue failed %d\n", ret); | 885 | DRM_ERROR("delayed enqueue failed %d\n", ret); |
881 | } | 886 | } |
882 | } | 887 | } |
888 | EXPORT_SYMBOL(drm_kms_helper_poll_enable); | ||
889 | |||
890 | void drm_kms_helper_poll_init(struct drm_device *dev) | ||
891 | { | ||
892 | slow_work_register_user(THIS_MODULE); | ||
893 | delayed_slow_work_init(&dev->mode_config.output_poll_slow_work, | ||
894 | &output_poll_ops); | ||
895 | dev->mode_config.poll_enabled = true; | ||
896 | |||
897 | drm_kms_helper_poll_enable(dev); | ||
898 | } | ||
883 | EXPORT_SYMBOL(drm_kms_helper_poll_init); | 899 | EXPORT_SYMBOL(drm_kms_helper_poll_init); |
884 | 900 | ||
885 | void drm_kms_helper_poll_fini(struct drm_device *dev) | 901 | void drm_kms_helper_poll_fini(struct drm_device *dev) |
886 | { | 902 | { |
887 | delayed_slow_work_cancel(&dev->mode_config.output_poll_slow_work); | 903 | drm_kms_helper_poll_disable(dev); |
888 | slow_work_unregister_user(THIS_MODULE); | 904 | slow_work_unregister_user(THIS_MODULE); |
889 | } | 905 | } |
890 | EXPORT_SYMBOL(drm_kms_helper_poll_fini); | 906 | EXPORT_SYMBOL(drm_kms_helper_poll_fini); |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 2a6b5de5ae5d..cc6e56a18edd 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -1399,12 +1399,14 @@ static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_ | |||
1399 | struct drm_device *dev = pci_get_drvdata(pdev); | 1399 | struct drm_device *dev = pci_get_drvdata(pdev); |
1400 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; | 1400 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; |
1401 | if (state == VGA_SWITCHEROO_ON) { | 1401 | if (state == VGA_SWITCHEROO_ON) { |
1402 | printk(KERN_INFO "i915: switched off\n"); | 1402 | printk(KERN_INFO "i915: switched on\n"); |
1403 | /* i915 resume handler doesn't set to D0 */ | 1403 | /* i915 resume handler doesn't set to D0 */ |
1404 | pci_set_power_state(dev->pdev, PCI_D0); | 1404 | pci_set_power_state(dev->pdev, PCI_D0); |
1405 | i915_resume(dev); | 1405 | i915_resume(dev); |
1406 | drm_kms_helper_poll_enable(dev); | ||
1406 | } else { | 1407 | } else { |
1407 | printk(KERN_ERR "i915: switched off\n"); | 1408 | printk(KERN_ERR "i915: switched off\n"); |
1409 | drm_kms_helper_poll_disable(dev); | ||
1408 | i915_suspend(dev, pmm); | 1410 | i915_suspend(dev, pmm); |
1409 | } | 1411 | } |
1410 | } | 1412 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index e632339c323e..5c468a4fef9a 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
@@ -376,12 +376,15 @@ out_err: | |||
376 | static void nouveau_switcheroo_set_state(struct pci_dev *pdev, | 376 | static void nouveau_switcheroo_set_state(struct pci_dev *pdev, |
377 | enum vga_switcheroo_state state) | 377 | enum vga_switcheroo_state state) |
378 | { | 378 | { |
379 | struct drm_device *dev = pci_get_drvdata(pdev); | ||
379 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; | 380 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; |
380 | if (state == VGA_SWITCHEROO_ON) { | 381 | if (state == VGA_SWITCHEROO_ON) { |
381 | printk(KERN_ERR "VGA switcheroo: switched nouveau on\n"); | 382 | printk(KERN_ERR "VGA switcheroo: switched nouveau on\n"); |
382 | nouveau_pci_resume(pdev); | 383 | nouveau_pci_resume(pdev); |
384 | drm_kms_helper_poll_enable(dev); | ||
383 | } else { | 385 | } else { |
384 | printk(KERN_ERR "VGA switcheroo: switched nouveau off\n"); | 386 | printk(KERN_ERR "VGA switcheroo: switched nouveau off\n"); |
387 | drm_kms_helper_poll_disable(dev); | ||
385 | nouveau_pci_suspend(pdev, pmm); | 388 | nouveau_pci_suspend(pdev, pmm); |
386 | } | 389 | } |
387 | } | 390 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index fdc3fdf78acb..db338522191f 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -546,8 +546,10 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero | |||
546 | /* don't suspend or resume card normally */ | 546 | /* don't suspend or resume card normally */ |
547 | rdev->powered_down = false; | 547 | rdev->powered_down = false; |
548 | radeon_resume_kms(dev); | 548 | radeon_resume_kms(dev); |
549 | drm_kms_helper_poll_enable(dev); | ||
549 | } else { | 550 | } else { |
550 | printk(KERN_INFO "radeon: switched off\n"); | 551 | printk(KERN_INFO "radeon: switched off\n"); |
552 | drm_kms_helper_poll_disable(dev); | ||
551 | radeon_suspend_kms(dev, pmm); | 553 | radeon_suspend_kms(dev, pmm); |
552 | /* don't suspend or resume card normally */ | 554 | /* don't suspend or resume card normally */ |
553 | rdev->powered_down = true; | 555 | rdev->powered_down = true; |