diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lvds.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 24 |
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 | ||
1096 | out: | 1098 | out: |
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 | ||
1124 | failed: | 1128 | failed: |
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; |