diff options
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index cd756262924d..edfc54e41842 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -897,6 +897,25 @@ static void radeon_check_arguments(struct radeon_device *rdev) | |||
897 | } | 897 | } |
898 | 898 | ||
899 | /** | 899 | /** |
900 | * radeon_switcheroo_quirk_long_wakeup - return true if longer d3 delay is | ||
901 | * needed for waking up. | ||
902 | * | ||
903 | * @pdev: pci dev pointer | ||
904 | */ | ||
905 | static bool radeon_switcheroo_quirk_long_wakeup(struct pci_dev *pdev) | ||
906 | { | ||
907 | |||
908 | /* 6600m in a macbook pro */ | ||
909 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE && | ||
910 | pdev->subsystem_device == 0x00e2) { | ||
911 | printk(KERN_INFO "radeon: quirking longer d3 wakeup delay\n"); | ||
912 | return true; | ||
913 | } | ||
914 | |||
915 | return false; | ||
916 | } | ||
917 | |||
918 | /** | ||
900 | * radeon_switcheroo_set_state - set switcheroo state | 919 | * radeon_switcheroo_set_state - set switcheroo state |
901 | * | 920 | * |
902 | * @pdev: pci dev pointer | 921 | * @pdev: pci dev pointer |
@@ -910,10 +929,19 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero | |||
910 | struct drm_device *dev = pci_get_drvdata(pdev); | 929 | struct drm_device *dev = pci_get_drvdata(pdev); |
911 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; | 930 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; |
912 | if (state == VGA_SWITCHEROO_ON) { | 931 | if (state == VGA_SWITCHEROO_ON) { |
932 | unsigned d3_delay = dev->pdev->d3_delay; | ||
933 | |||
913 | printk(KERN_INFO "radeon: switched on\n"); | 934 | printk(KERN_INFO "radeon: switched on\n"); |
914 | /* don't suspend or resume card normally */ | 935 | /* don't suspend or resume card normally */ |
915 | dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; | 936 | dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; |
937 | |||
938 | if (d3_delay < 20 && radeon_switcheroo_quirk_long_wakeup(pdev)) | ||
939 | dev->pdev->d3_delay = 20; | ||
940 | |||
916 | radeon_resume_kms(dev); | 941 | radeon_resume_kms(dev); |
942 | |||
943 | dev->pdev->d3_delay = d3_delay; | ||
944 | |||
917 | dev->switch_power_state = DRM_SWITCH_POWER_ON; | 945 | dev->switch_power_state = DRM_SWITCH_POWER_ON; |
918 | drm_kms_helper_poll_enable(dev); | 946 | drm_kms_helper_poll_enable(dev); |
919 | } else { | 947 | } else { |