aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-12 16:22:58 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-24 11:53:52 -0400
commit59d92bfa5f0cdf57f82f5181b0ad6af75c3fdf41 (patch)
tree26a3d15ec188af544f8b0b04dc3c3ee1a4deb72d /drivers
parent6bd459df96ffc2488e7816c78e78bcc706c58276 (diff)
drm/i915: properly handle interlaced bit for sdvo dtd conversion
We've simply ignored this, which isn't too great. With this, interlaced 1080i works on my HDMI screen connected through sdvo. For no apparent reason anything else still doesn't work as it should. While at it, give these magic numbers in the dtd proper names and add a comment that they match with EDID detailed timings. v2: Actually use the right bit for interlaced. Tested-by: Peter Ross <pross@xvid.org> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Cc: stable@vger.kernel.org Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c12
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo_regs.h5
2 files changed, 13 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 125228e77c50..a6582079134f 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -783,10 +783,12 @@ static void intel_sdvo_get_dtd_from_mode(struct intel_sdvo_dtd *dtd,
783 ((v_sync_len & 0x30) >> 4); 783 ((v_sync_len & 0x30) >> 4);
784 784
785 dtd->part2.dtd_flags = 0x18; 785 dtd->part2.dtd_flags = 0x18;
786 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
787 dtd->part2.dtd_flags |= DTD_FLAG_INTERLACE;
786 if (mode->flags & DRM_MODE_FLAG_PHSYNC) 788 if (mode->flags & DRM_MODE_FLAG_PHSYNC)
787 dtd->part2.dtd_flags |= 0x2; 789 dtd->part2.dtd_flags |= DTD_FLAG_HSYNC_POSITIVE;
788 if (mode->flags & DRM_MODE_FLAG_PVSYNC) 790 if (mode->flags & DRM_MODE_FLAG_PVSYNC)
789 dtd->part2.dtd_flags |= 0x4; 791 dtd->part2.dtd_flags |= DTD_FLAG_VSYNC_POSITIVE;
790 792
791 dtd->part2.sdvo_flags = 0; 793 dtd->part2.sdvo_flags = 0;
792 dtd->part2.v_sync_off_high = v_sync_offset & 0xc0; 794 dtd->part2.v_sync_off_high = v_sync_offset & 0xc0;
@@ -820,9 +822,11 @@ static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode,
820 mode->clock = dtd->part1.clock * 10; 822 mode->clock = dtd->part1.clock * 10;
821 823
822 mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); 824 mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC);
823 if (dtd->part2.dtd_flags & 0x2) 825 if (dtd->part2.dtd_flags & DTD_FLAG_INTERLACE)
826 mode->flags |= DRM_MODE_FLAG_INTERLACE;
827 if (dtd->part2.dtd_flags & DTD_FLAG_HSYNC_POSITIVE)
824 mode->flags |= DRM_MODE_FLAG_PHSYNC; 828 mode->flags |= DRM_MODE_FLAG_PHSYNC;
825 if (dtd->part2.dtd_flags & 0x4) 829 if (dtd->part2.dtd_flags & DTD_FLAG_VSYNC_POSITIVE)
826 mode->flags |= DRM_MODE_FLAG_PVSYNC; 830 mode->flags |= DRM_MODE_FLAG_PVSYNC;
827} 831}
828 832
diff --git a/drivers/gpu/drm/i915/intel_sdvo_regs.h b/drivers/gpu/drm/i915/intel_sdvo_regs.h
index 6b7b22f4d63e..9d030142ee43 100644
--- a/drivers/gpu/drm/i915/intel_sdvo_regs.h
+++ b/drivers/gpu/drm/i915/intel_sdvo_regs.h
@@ -61,6 +61,11 @@ struct intel_sdvo_caps {
61 u16 output_flags; 61 u16 output_flags;
62} __attribute__((packed)); 62} __attribute__((packed));
63 63
64/* Note: SDVO detailed timing flags match EDID misc flags. */
65#define DTD_FLAG_HSYNC_POSITIVE (1 << 1)
66#define DTD_FLAG_VSYNC_POSITIVE (1 << 2)
67#define DTD_FLAG_INTERLACE (1 << 7)
68
64/** This matches the EDID DTD structure, more or less */ 69/** This matches the EDID DTD structure, more or less */
65struct intel_sdvo_dtd { 70struct intel_sdvo_dtd {
66 struct { 71 struct {