aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEgbert Eich <eich@suse.de>2012-10-13 08:29:31 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-10-16 03:39:04 -0400
commite751823da27d37d25e5543abef2dc031f8813bc8 (patch)
treee0a95bde23e85a2b88ff275487ef98761dca3793
parente3b86d6941c7e5f90be05d986fce1fcb40c68d6b (diff)
DRM/i915: Restore sdvo_flags after dtd->mode->dtd Roundrtrip.
For TV and LVDS encoders intel_sdvo_set_input_timings_for_mode() is called to pass a mode to the sdvo chip and retrieve a dtd containing information needed to calculate the adjusted_mode which is done by intel_sdvo_get_dtd_from_mode(). To set this adjusted_mode as input mode for the sdvo chip, a dtd is recalculated using intel_sdvo_get_mode_from_dtd(). During this round trip the sdvo_flags contained in the dtd obtained from the hardware are lost. Since these flags cannot be ignored in all cases this patch preserves and restores them. This regression has been introduced in commit 6651819b4b4fc3caa6964c5d825eb4bb996f3905 Author: Daniel Vetter <daniel.vetter@ffwll.ch> Date: Sun Apr 1 19:16:18 2012 +0200 drm/i915: handle input/output sdvo timings separately in mode_set Signed-off-by: Egbert Eich <eich@suse.de> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 3a7251ad9a73..d2e8c9f4d6d5 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -140,6 +140,11 @@ struct intel_sdvo {
140 140
141 /* DDC bus used by this SDVO encoder */ 141 /* DDC bus used by this SDVO encoder */
142 uint8_t ddc_bus; 142 uint8_t ddc_bus;
143
144 /*
145 * the sdvo flag gets lost in round trip: dtd->adjusted_mode->dtd
146 */
147 uint8_t dtd_sdvo_flags;
143}; 148};
144 149
145struct intel_sdvo_connector { 150struct intel_sdvo_connector {
@@ -985,6 +990,7 @@ intel_sdvo_get_preferred_input_mode(struct intel_sdvo *intel_sdvo,
985 return false; 990 return false;
986 991
987 intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd); 992 intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd);
993 intel_sdvo->dtd_sdvo_flags = input_dtd.part2.sdvo_flags;
988 994
989 return true; 995 return true;
990} 996}
@@ -1093,6 +1099,8 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
1093 * adjusted_mode. 1099 * adjusted_mode.
1094 */ 1100 */
1095 intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode); 1101 intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode);
1102 if (intel_sdvo->is_tv || intel_sdvo->is_lvds)
1103 input_dtd.part2.sdvo_flags = intel_sdvo->dtd_sdvo_flags;
1096 if (!intel_sdvo_set_input_timing(intel_sdvo, &input_dtd)) 1104 if (!intel_sdvo_set_input_timing(intel_sdvo, &input_dtd))
1097 DRM_INFO("Setting input timings on %s failed\n", 1105 DRM_INFO("Setting input timings on %s failed\n",
1098 SDVO_NAME(intel_sdvo)); 1106 SDVO_NAME(intel_sdvo));