aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_lvds.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lvds.c')
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 8bcb93a2a9f6..f1ecf916474a 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -848,8 +848,8 @@ static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder)
848 struct drm_i915_private *dev_priv = dev->dev_private; 848 struct drm_i915_private *dev_priv = dev->dev_private;
849 849
850 /* use the module option value if specified */ 850 /* use the module option value if specified */
851 if (i915_lvds_channel_mode > 0) 851 if (i915.lvds_channel_mode > 0)
852 return i915_lvds_channel_mode == 2; 852 return i915.lvds_channel_mode == 2;
853 853
854 if (dmi_check_system(intel_dual_link_lvds)) 854 if (dmi_check_system(intel_dual_link_lvds))
855 return true; 855 return true;
@@ -899,6 +899,7 @@ void intel_lvds_init(struct drm_device *dev)
899 struct drm_encoder *encoder; 899 struct drm_encoder *encoder;
900 struct drm_display_mode *scan; /* *modes, *bios_mode; */ 900 struct drm_display_mode *scan; /* *modes, *bios_mode; */
901 struct drm_display_mode *fixed_mode = NULL; 901 struct drm_display_mode *fixed_mode = NULL;
902 struct drm_display_mode *downclock_mode = NULL;
902 struct edid *edid; 903 struct edid *edid;
903 struct drm_crtc *crtc; 904 struct drm_crtc *crtc;
904 u32 lvds; 905 u32 lvds;
@@ -957,11 +958,12 @@ void intel_lvds_init(struct drm_device *dev)
957 intel_encoder->get_hw_state = intel_lvds_get_hw_state; 958 intel_encoder->get_hw_state = intel_lvds_get_hw_state;
958 intel_encoder->get_config = intel_lvds_get_config; 959 intel_encoder->get_config = intel_lvds_get_config;
959 intel_connector->get_hw_state = intel_connector_get_hw_state; 960 intel_connector->get_hw_state = intel_connector_get_hw_state;
961 intel_connector->unregister = intel_connector_unregister;
960 962
961 intel_connector_attach_encoder(intel_connector, intel_encoder); 963 intel_connector_attach_encoder(intel_connector, intel_encoder);
962 intel_encoder->type = INTEL_OUTPUT_LVDS; 964 intel_encoder->type = INTEL_OUTPUT_LVDS;
963 965
964 intel_encoder->cloneable = false; 966 intel_encoder->cloneable = 0;
965 if (HAS_PCH_SPLIT(dev)) 967 if (HAS_PCH_SPLIT(dev))
966 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); 968 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
967 else if (IS_GEN4(dev)) 969 else if (IS_GEN4(dev))
@@ -1000,6 +1002,7 @@ void intel_lvds_init(struct drm_device *dev)
1000 * Attempt to get the fixed panel mode from DDC. Assume that the 1002 * Attempt to get the fixed panel mode from DDC. Assume that the
1001 * preferred mode is the right one. 1003 * preferred mode is the right one.
1002 */ 1004 */
1005 mutex_lock(&dev->mode_config.mutex);
1003 edid = drm_get_edid(connector, intel_gmbus_get_adapter(dev_priv, pin)); 1006 edid = drm_get_edid(connector, intel_gmbus_get_adapter(dev_priv, pin));
1004 if (edid) { 1007 if (edid) {
1005 if (drm_add_edid_modes(connector, edid)) { 1008 if (drm_add_edid_modes(connector, edid)) {
@@ -1032,15 +1035,14 @@ void intel_lvds_init(struct drm_device *dev)
1032 1035
1033 fixed_mode = drm_mode_duplicate(dev, scan); 1036 fixed_mode = drm_mode_duplicate(dev, scan);
1034 if (fixed_mode) { 1037 if (fixed_mode) {
1035 intel_connector->panel.downclock_mode = 1038 downclock_mode =
1036 intel_find_panel_downclock(dev, 1039 intel_find_panel_downclock(dev,
1037 fixed_mode, connector); 1040 fixed_mode, connector);
1038 if (intel_connector->panel.downclock_mode != 1041 if (downclock_mode != NULL &&
1039 NULL && i915_lvds_downclock) { 1042 i915.lvds_downclock) {
1040 /* We found the downclock for LVDS. */ 1043 /* We found the downclock for LVDS. */
1041 dev_priv->lvds_downclock_avail = true; 1044 dev_priv->lvds_downclock_avail = true;
1042 dev_priv->lvds_downclock = 1045 dev_priv->lvds_downclock =
1043 intel_connector->panel.
1044 downclock_mode->clock; 1046 downclock_mode->clock;
1045 DRM_DEBUG_KMS("LVDS downclock is found" 1047 DRM_DEBUG_KMS("LVDS downclock is found"
1046 " in EDID. Normal clock %dKhz, " 1048 " in EDID. Normal clock %dKhz, "
@@ -1094,6 +1096,8 @@ void intel_lvds_init(struct drm_device *dev)
1094 goto failed; 1096 goto failed;
1095 1097
1096out: 1098out:
1099 mutex_unlock(&dev->mode_config.mutex);
1100
1097 lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); 1101 lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder);
1098 DRM_DEBUG_KMS("detected %s-link lvds configuration\n", 1102 DRM_DEBUG_KMS("detected %s-link lvds configuration\n",
1099 lvds_encoder->is_dual_link ? "dual" : "single"); 1103 lvds_encoder->is_dual_link ? "dual" : "single");
@@ -1116,17 +1120,17 @@ out:
1116 } 1120 }
1117 drm_sysfs_connector_add(connector); 1121 drm_sysfs_connector_add(connector);
1118 1122
1119 intel_panel_init(&intel_connector->panel, fixed_mode); 1123 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
1120 intel_panel_setup_backlight(connector); 1124 intel_panel_setup_backlight(connector);
1121 1125
1122 return; 1126 return;
1123 1127
1124failed: 1128failed:
1129 mutex_unlock(&dev->mode_config.mutex);
1130
1125 DRM_DEBUG_KMS("No LVDS modes found, disabling.\n"); 1131 DRM_DEBUG_KMS("No LVDS modes found, disabling.\n");
1126 drm_connector_cleanup(connector); 1132 drm_connector_cleanup(connector);
1127 drm_encoder_cleanup(encoder); 1133 drm_encoder_cleanup(encoder);
1128 if (fixed_mode)
1129 drm_mode_destroy(dev, fixed_mode);
1130 kfree(lvds_encoder); 1134 kfree(lvds_encoder);
1131 kfree(lvds_connector); 1135 kfree(lvds_connector);
1132 return; 1136 return;