aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Halasa <khc@pm.waw.pl>2010-05-25 12:41:46 -0400
committerEric Anholt <eric@anholt.net>2010-05-26 16:51:01 -0400
commit734b4157b367d66405f7dab80085d17c9c8dd3b5 (patch)
tree24e97b20c389dfd558f3eb3b844e6f1dd17a0b40
parentf953c9353f5fe6e98fa7f32f51060a74d845b5f8 (diff)
drm/i915: Add support for interlaced display.
This doesn't change the clock limits (minimums), i.e. it won't make it output 720x576 PAL nor 720x480 NTSC, but it will work with modes like 1080i etc. (including GLX and textured Xvideo, not sure about the overlay). Tested on i915 + analog VGA, it would be worth checking if newer chips (and which ones) still support interlaced mode. Signed-off-by: Krzysztof Halasa <khc@pm.waw.pl> Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c2
-rw-r--r--drivers/gpu/drm/i915/intel_display.c14
2 files changed, 15 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index e16ac5a28c3c..d5c130202396 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -569,7 +569,7 @@ void intel_crt_init(struct drm_device *dev)
569 (1 << INTEL_ANALOG_CLONE_BIT) | 569 (1 << INTEL_ANALOG_CLONE_BIT) |
570 (1 << INTEL_SDVO_LVDS_CLONE_BIT); 570 (1 << INTEL_SDVO_LVDS_CLONE_BIT);
571 intel_encoder->crtc_mask = (1 << 0) | (1 << 1); 571 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
572 connector->interlace_allowed = 0; 572 connector->interlace_allowed = 1;
573 connector->doublescan_allowed = 0; 573 connector->doublescan_allowed = 0;
574 574
575 drm_encoder_helper_add(&intel_encoder->enc, &intel_crt_helper_funcs); 575 drm_encoder_helper_add(&intel_encoder->enc, &intel_crt_helper_funcs);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 36afe9409964..4c7c151114f7 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2354,6 +2354,8 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
2354 if (mode->clock * 3 > 27000 * 4) 2354 if (mode->clock * 3 > 27000 * 4)
2355 return MODE_CLOCK_HIGH; 2355 return MODE_CLOCK_HIGH;
2356 } 2356 }
2357
2358 drm_mode_set_crtcinfo(adjusted_mode, 0);
2357 return true; 2359 return true;
2358} 2360}
2359 2361
@@ -3781,6 +3783,18 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3781 } 3783 }
3782 } 3784 }
3783 3785
3786 if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
3787 pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION;
3788 /* the chip adds 2 halflines automatically */
3789 adjusted_mode->crtc_vdisplay -= 1;
3790 adjusted_mode->crtc_vtotal -= 1;
3791 adjusted_mode->crtc_vblank_start -= 1;
3792 adjusted_mode->crtc_vblank_end -= 1;
3793 adjusted_mode->crtc_vsync_end -= 1;
3794 adjusted_mode->crtc_vsync_start -= 1;
3795 } else
3796 pipeconf &= ~PIPECONF_INTERLACE_W_FIELD_INDICATION; /* progressive */
3797
3784 I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) | 3798 I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) |
3785 ((adjusted_mode->crtc_htotal - 1) << 16)); 3799 ((adjusted_mode->crtc_htotal - 1) << 16));
3786 I915_WRITE(hblank_reg, (adjusted_mode->crtc_hblank_start - 1) | 3800 I915_WRITE(hblank_reg, (adjusted_mode->crtc_hblank_start - 1) |