Message ID | 1350131371-1268-1-git-send-email-eich@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 --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));
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(-)