aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_sdvo.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-09-13 09:00:08 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-09-16 16:59:38 -0400
commit18442d08786472c63a0a80c27f92b033dffc26de (patch)
tree9860f05af1453423ee9249b3a60f3f0cb534dea8 /drivers/gpu/drm/i915/intel_sdvo.c
parentda4a1efab8be1e373c1ad31b14deb4e422dad6cb (diff)
drm/i915: Fix port_clock and adjusted_mode.clock readout all over
Now that adjusted_mode.clock no longer contains the pixel_multiplier, we can kill the get_clock() callback and instead do the clock readout in get_pipe_config(). Also i9xx_crtc_clock_get() can now extract the frequency of the PCH DPLL, so use it to populate port_clock accurately for PCH encoders. For DP in port A the encoder is still responsible for filling in port_clock. The FDI adjusted_mode.clock extraction is kept in place for some extra sanity checking, but we no longer need to pretend it's also the port_clock. In the encoder get_config() functions fill out adjusted_mode.clock based on port_clock and other details such as the DP M/N values, HDMI 12bpc and SDVO pixel_multiplier. For PCH encoders we will then do an extra sanity check to make sure the dotclock we derived from the FDI configuratiuon matches the one we derive from port_clock. DVO doesn't exist on PCH platforms, so it doesn't need to anything but assign adjusted_mode.clock=port_clock. And DDI is HSW only, so none of the changes apply there. v2: Use hdmi_reg color format to detect 12bpc HDMI case v3: Set adjusted_mode.clock for LVDS too v4: Rename ironlake_crtc_clock_get to ironlake_pch_clock_get, eliminate the useless link_freq variable. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sdvo.c')
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 393b7a502291..8aa7be588f7f 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1316,6 +1316,7 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
1316 struct intel_sdvo *intel_sdvo = to_sdvo(encoder); 1316 struct intel_sdvo *intel_sdvo = to_sdvo(encoder);
1317 struct intel_sdvo_dtd dtd; 1317 struct intel_sdvo_dtd dtd;
1318 int encoder_pixel_multiplier = 0; 1318 int encoder_pixel_multiplier = 0;
1319 int dotclock;
1319 u32 flags = 0, sdvox; 1320 u32 flags = 0, sdvox;
1320 u8 val; 1321 u8 val;
1321 bool ret; 1322 bool ret;
@@ -1354,6 +1355,13 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
1354 >> SDVO_PORT_MULTIPLY_SHIFT) + 1; 1355 >> SDVO_PORT_MULTIPLY_SHIFT) + 1;
1355 } 1356 }
1356 1357
1358 dotclock = pipe_config->port_clock / pipe_config->pixel_multiplier;
1359
1360 if (HAS_PCH_SPLIT(dev))
1361 ironlake_check_encoder_dotclock(pipe_config, dotclock);
1362
1363 pipe_config->adjusted_mode.clock = dotclock;
1364
1357 /* Cross check the port pixel multiplier with the sdvo encoder state. */ 1365 /* Cross check the port pixel multiplier with the sdvo encoder state. */
1358 if (intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_CLOCK_RATE_MULT, 1366 if (intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_CLOCK_RATE_MULT,
1359 &val, 1)) { 1367 &val, 1)) {