diff mbox

DRM/i915: Restore sdvo_flags after dtd->mode->dtd Roundrtrip.

Message ID 1350131371-1268-1-git-send-email-eich@suse.de (mailing list archive)
State New, archived
Headers show

Commit Message

Egbert Eich Oct. 13, 2012, 12:29 p.m. UTC
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>
---
 drivers/gpu/drm/i915/intel_sdvo.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

Comments

Daniel Vetter Oct. 16, 2012, 7:48 a.m. UTC | #1
On Sat, Oct 13, 2012 at 02:29:31PM +0200, Egbert Eich wrote:
> 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>

Long term we need to decently improve our adjusted_mode handling and stop
shoveling random state into random structures. Short-term this looks good
enough. Thanks for the patch, applied.
-Daniel
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 39c3198..d192ce4 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -140,6 +140,11 @@  struct intel_sdvo {
 
 	/* DDC bus used by this SDVO encoder */
 	uint8_t ddc_bus;
+
+	/*
+	 * the sdvo flag gets lost in round trip: dtd->adjusted_mode->dtd
+	 */
+	uint8_t dtd_sdvo_flags;
 };
 
 struct intel_sdvo_connector {
@@ -985,6 +990,7 @@  intel_sdvo_get_preferred_input_mode(struct intel_sdvo *intel_sdvo,
 		return false;
 
 	intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd);
+	intel_sdvo->dtd_sdvo_flags = input_dtd.part2.sdvo_flags;
 
 	return true;
 }
@@ -1093,6 +1099,8 @@  static void intel_sdvo_mode_set(struct drm_encoder *encoder,
 	 * adjusted_mode.
 	 */
 	intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode);
+	if (intel_sdvo->is_tv || intel_sdvo->is_lvds)
+		input_dtd.part2.sdvo_flags = intel_sdvo->dtd_sdvo_flags;
 	if (!intel_sdvo_set_input_timing(intel_sdvo, &input_dtd))
 		DRM_INFO("Setting input timings on %s failed\n",
 			 SDVO_NAME(intel_sdvo));