aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-04-30 08:01:41 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-05-10 15:56:43 -0400
commit70484559296623d49e559a3a10fa32fd2bc5dcc3 (patch)
tree1c03a3dfff3980d42be89f793921be0ed5abbda9
parente7281eab0bb4a5265593866d6f7acea2812fe0ec (diff)
drm/i915: move sdvo TV clock computation to intel_sdvo.c
We have a very nice infrastructure for this now! Note that the multifunction sdvo support is pretty neatly broken: We completely ignore userspace's request for which connector to wire up with the encoder and just use whatever the last detect callback has seen. Not something I'll fix in this patch, but unfortunately something which is also broken in the DDI code ... v2: Don't call sdvo_tv_clock twice. Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c30
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c30
2 files changed, 30 insertions, 30 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 0dab9f64b35d..9365c5aa16bb 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4290,30 +4290,6 @@ static int i9xx_get_refclk(struct drm_crtc *crtc, int num_connectors)
4290 return refclk; 4290 return refclk;
4291} 4291}
4292 4292
4293static void i9xx_adjust_sdvo_tv_clock(struct intel_crtc *crtc)
4294{
4295 unsigned dotclock = crtc->config.adjusted_mode.clock;
4296 struct dpll *clock = &crtc->config.dpll;
4297
4298 /* SDVO TV has fixed PLL values depend on its clock range,
4299 this mirrors vbios setting. */
4300 if (dotclock >= 100000 && dotclock < 140500) {
4301 clock->p1 = 2;
4302 clock->p2 = 10;
4303 clock->n = 3;
4304 clock->m1 = 16;
4305 clock->m2 = 8;
4306 } else if (dotclock >= 140500 && dotclock <= 200000) {
4307 clock->p1 = 1;
4308 clock->p2 = 10;
4309 clock->n = 6;
4310 clock->m1 = 12;
4311 clock->m2 = 8;
4312 }
4313
4314 crtc->config.clock_set = true;
4315}
4316
4317static uint32_t pnv_dpll_compute_fp(struct dpll *dpll) 4293static uint32_t pnv_dpll_compute_fp(struct dpll *dpll)
4318{ 4294{
4319 return (1 << dpll->n) << 16 | dpll->m1 << 8 | dpll->m2; 4295 return (1 << dpll->n) << 16 | dpll->m1 << 8 | dpll->m2;
@@ -4972,9 +4948,6 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
4972 intel_crtc->config.dpll.p2 = clock.p2; 4948 intel_crtc->config.dpll.p2 = clock.p2;
4973 } 4949 }
4974 4950
4975 if (is_sdvo && is_tv)
4976 i9xx_adjust_sdvo_tv_clock(intel_crtc);
4977
4978 if (IS_GEN2(dev)) 4951 if (IS_GEN2(dev))
4979 i8xx_update_pll(intel_crtc, adjusted_mode, 4952 i8xx_update_pll(intel_crtc, adjusted_mode,
4980 has_reduced_clock ? &reduced_clock : NULL, 4953 has_reduced_clock ? &reduced_clock : NULL,
@@ -5580,9 +5553,6 @@ static bool ironlake_compute_clocks(struct drm_crtc *crtc,
5580 reduced_clock); 5553 reduced_clock);
5581 } 5554 }
5582 5555
5583 if (is_sdvo && is_tv)
5584 i9xx_adjust_sdvo_tv_clock(to_intel_crtc(crtc));
5585
5586 return true; 5556 return true;
5587} 5557}
5588 5558
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index a618a6a45a77..0fc6fc2d6a30 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1041,6 +1041,32 @@ intel_sdvo_get_preferred_input_mode(struct intel_sdvo *intel_sdvo,
1041 return true; 1041 return true;
1042} 1042}
1043 1043
1044static void i9xx_adjust_sdvo_tv_clock(struct intel_crtc_config *pipe_config)
1045{
1046 unsigned dotclock = pipe_config->adjusted_mode.clock;
1047 struct dpll *clock = &pipe_config->dpll;
1048
1049 /* SDVO TV has fixed PLL values depend on its clock range,
1050 this mirrors vbios setting. */
1051 if (dotclock >= 100000 && dotclock < 140500) {
1052 clock->p1 = 2;
1053 clock->p2 = 10;
1054 clock->n = 3;
1055 clock->m1 = 16;
1056 clock->m2 = 8;
1057 } else if (dotclock >= 140500 && dotclock <= 200000) {
1058 clock->p1 = 1;
1059 clock->p2 = 10;
1060 clock->n = 6;
1061 clock->m1 = 12;
1062 clock->m2 = 8;
1063 } else {
1064 WARN(1, "SDVO TV clock out of range: %i\n", dotclock);
1065 }
1066
1067 pipe_config->clock_set = true;
1068}
1069
1044static bool intel_sdvo_compute_config(struct intel_encoder *encoder, 1070static bool intel_sdvo_compute_config(struct intel_encoder *encoder,
1045 struct intel_crtc_config *pipe_config) 1071 struct intel_crtc_config *pipe_config)
1046{ 1072{
@@ -1097,6 +1123,10 @@ static bool intel_sdvo_compute_config(struct intel_encoder *encoder,
1097 if (intel_sdvo->color_range) 1123 if (intel_sdvo->color_range)
1098 pipe_config->limited_color_range = true; 1124 pipe_config->limited_color_range = true;
1099 1125
1126 /* Clock computation needs to happen after pixel multiplier. */
1127 if (intel_sdvo->is_tv)
1128 i9xx_adjust_sdvo_tv_clock(pipe_config);
1129
1100 return true; 1130 return true;
1101} 1131}
1102 1132