| @@ -813,12 +813,28 @@ static int intel_dual_link_lvds_callback(const struct dmi_system_id *id) · 812 unmodified lines |
| 813 | static const struct dmi_system_id intel_dual_link_lvds[] = { | 813 | static const struct dmi_system_id intel_dual_link_lvds[] = { |
| 814 | { | 814 | { |
| 815 | .callback = intel_dual_link_lvds_callback, | 815 | .callback = intel_dual_link_lvds_callback, |
| 816 | .ident = "Apple MacBook Pro (Core i5/i7 Series)", | 816 | .ident = "Apple MacBook Pro 15\" (2010)", |
| | 817 | .matches = { |
| | 818 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), |
| | 819 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro6,2"), |
| | 820 | }, |
| | 821 | }, |
| | 822 | { |
| | 823 | .callback = intel_dual_link_lvds_callback, |
| | 824 | .ident = "Apple MacBook Pro 15\" (2011)", |
| 817 | .matches = { | 825 | .matches = { |
| 818 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | 826 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), |
| 819 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro8,2"), | 827 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro8,2"), |
| 820 | }, | 828 | }, |
| 821 | }, | 829 | }, |
| | 830 | { |
| | 831 | .callback = intel_dual_link_lvds_callback, |
| | 832 | .ident = "Apple MacBook Pro 15\" (2012)", |
| | 833 | .matches = { |
| | 834 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), |
| | 835 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro9,1"), |
| | 836 | }, |
| | 837 | }, |
| 822 | { } /* terminating entry */ | 838 | { } /* terminating entry */ |
| 823 | }; | 839 | }; |
| 824 | | 840 | |
| @@ -848,6 +864,11 @@ static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder) · 23 unmodified lines |
| 848 | if (i915.lvds_channel_mode > 0) | 864 | if (i915.lvds_channel_mode > 0) |
| 849 | return i915.lvds_channel_mode == 2; | 865 | return i915.lvds_channel_mode == 2; |
| 850 | | 866 | |
| | 867 | /* single channel LVDS is limited to 112 MHz */ |
| | 868 | if (lvds_encoder->attached_connector->base.panel.fixed_mode->clock |
| | 869 | > 112999) |
| | 870 | return true; |
| | 871 | |
| 851 | if (dmi_check_system(intel_dual_link_lvds)) | 872 | if (dmi_check_system(intel_dual_link_lvds)) |
| 852 | return true; | 873 | return true; |
| 853 | | 874 | |
| @@ -1111,6 +1132,8 @@ void intel_lvds_init(struct drm_device *dev) · 257 unmodified lines |
| 1111 | out: | 1132 | out: |
| 1112 | mutex_unlock(&dev->mode_config.mutex); | 1133 | mutex_unlock(&dev->mode_config.mutex); |
| 1113 | | 1134 | |
| | 1135 | intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode); |
| | 1136 | |
| 1114 | lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); | 1137 | lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); |
| 1115 | DRM_DEBUG_KMS("detected %s-link lvds configuration\n", | 1138 | DRM_DEBUG_KMS("detected %s-link lvds configuration\n", |
| 1116 | lvds_encoder->is_dual_link ? "dual" : "single"); | 1139 | lvds_encoder->is_dual_link ? "dual" : "single"); |
| @@ -1125,7 +1148,6 @@ out: · 8 unmodified lines |
| 1125 | } | 1148 | } |
| 1126 | drm_connector_register(connector); | 1149 | drm_connector_register(connector); |
| 1127 | | 1150 | |
| 1128 | intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode); | | |
| 1129 | intel_panel_setup_backlight(connector, INVALID_PIPE); | 1151 | intel_panel_setup_backlight(connector, INVALID_PIPE); |
| 1130 | | 1152 | |
| 1131 | return; | 1153 | return; |