aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@virtuousgeek.org>2011-12-15 15:30:36 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-01-17 05:06:10 -0500
commitc65d77d83ccffc60f8729b2e7806cac2564ee1b1 (patch)
tree216c3571343200a9561d3673e2af3af9379c2084 /drivers/gpu/drm/i915/intel_display.c
parent6b2d590540d219064a53638f485b75203131dfce (diff)
drm/i915: split 9xx refclk & sdvo tv code out
Makes the mode set routine a little cleaner and easier to extend. Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c74
1 files changed, 46 insertions, 28 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 15f2b52ea704..b050a7785167 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4982,6 +4982,48 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc,
4982 return display_bpc != bpc; 4982 return display_bpc != bpc;
4983} 4983}
4984 4984
4985static int i9xx_get_refclk(struct drm_crtc *crtc, int num_connectors)
4986{
4987 struct drm_device *dev = crtc->dev;
4988 struct drm_i915_private *dev_priv = dev->dev_private;
4989 int refclk;
4990
4991 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) &&
4992 intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
4993 refclk = dev_priv->lvds_ssc_freq * 1000;
4994 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n",
4995 refclk / 1000);
4996 } else if (!IS_GEN2(dev)) {
4997 refclk = 96000;
4998 } else {
4999 refclk = 48000;
5000 }
5001
5002 return refclk;
5003}
5004
5005static void i9xx_adjust_sdvo_tv_clock(struct drm_display_mode *adjusted_mode,
5006 intel_clock_t *clock)
5007{
5008 /* SDVO TV has fixed PLL values depend on its clock range,
5009 this mirrors vbios setting. */
5010 if (adjusted_mode->clock >= 100000
5011 && adjusted_mode->clock < 140500) {
5012 clock->p1 = 2;
5013 clock->p2 = 10;
5014 clock->n = 3;
5015 clock->m1 = 16;
5016 clock->m2 = 8;
5017 } else if (adjusted_mode->clock >= 140500
5018 && adjusted_mode->clock <= 200000) {
5019 clock->p1 = 1;
5020 clock->p2 = 10;
5021 clock->n = 6;
5022 clock->m1 = 12;
5023 clock->m2 = 8;
5024 }
5025}
5026
4985static int i9xx_crtc_mode_set(struct drm_crtc *crtc, 5027static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
4986 struct drm_display_mode *mode, 5028 struct drm_display_mode *mode,
4987 struct drm_display_mode *adjusted_mode, 5029 struct drm_display_mode *adjusted_mode,
@@ -5036,15 +5078,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
5036 num_connectors++; 5078 num_connectors++;
5037 } 5079 }
5038 5080
5039 if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) { 5081 refclk = i9xx_get_refclk(crtc, num_connectors);
5040 refclk = dev_priv->lvds_ssc_freq * 1000;
5041 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n",
5042 refclk / 1000);
5043 } else if (!IS_GEN2(dev)) {
5044 refclk = 96000;
5045 } else {
5046 refclk = 48000;
5047 }
5048 5082
5049 /* 5083 /*
5050 * Returns a set of divisors for the desired target clock with the given 5084 * Returns a set of divisors for the desired target clock with the given
@@ -5075,25 +5109,9 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
5075 &clock, 5109 &clock,
5076 &reduced_clock); 5110 &reduced_clock);
5077 } 5111 }
5078 /* SDVO TV has fixed PLL values depend on its clock range, 5112
5079 this mirrors vbios setting. */ 5113 if (is_sdvo && is_tv)
5080 if (is_sdvo && is_tv) { 5114 i9xx_adjust_sdvo_tv_clock(adjusted_mode, &clock);
5081 if (adjusted_mode->clock >= 100000
5082 && adjusted_mode->clock < 140500) {
5083 clock.p1 = 2;
5084 clock.p2 = 10;
5085 clock.n = 3;
5086 clock.m1 = 16;
5087 clock.m2 = 8;
5088 } else if (adjusted_mode->clock >= 140500
5089 && adjusted_mode->clock <= 200000) {
5090 clock.p1 = 1;
5091 clock.p2 = 10;
5092 clock.n = 6;
5093 clock.m1 = 12;
5094 clock.m2 = 8;
5095 }
5096 }
5097 5115
5098 if (IS_PINEVIEW(dev)) { 5116 if (IS_PINEVIEW(dev)) {
5099 fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; 5117 fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2;