diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2013-09-13 09:00:08 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-09-16 16:59:38 -0400 |
commit | 18442d08786472c63a0a80c27f92b033dffc26de (patch) | |
tree | 9860f05af1453423ee9249b3a60f3f0cb534dea8 /drivers/gpu/drm/i915/intel_sdvo.c | |
parent | da4a1efab8be1e373c1ad31b14deb4e422dad6cb (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.c | 8 |
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)) { |