diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2011-12-15 15:30:36 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-01-17 05:06:10 -0500 |
commit | c65d77d83ccffc60f8729b2e7806cac2564ee1b1 (patch) | |
tree | 216c3571343200a9561d3673e2af3af9379c2084 /drivers/gpu/drm/i915/intel_display.c | |
parent | 6b2d590540d219064a53638f485b75203131dfce (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.c | 74 |
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 | ||
4985 | static 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 | |||
5005 | static 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 | |||
4985 | static int i9xx_crtc_mode_set(struct drm_crtc *crtc, | 5027 | static 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; |