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 { |
