mirror of https://gitee.com/openkylin/linux.git
drm/i915: Move DP port disable to post_disable for pch platforms
We need to turn the DP port off after the pipe, otherwise the pipe won't turn off properly on certain pch platforms at least (happens on my ILK for example). This also matches the BSpec modeset sequence better. We still don't match the spec exactly though (eg. audio disable should happen much earlier), but at last this eliminates the nasty wait_for_pipe_off() timeouts. We already did the port disable after the pipe for VLV/CHV and for CPU eDP. For g4x leave the port disable where it is since that matches the modeset sequence in the documentation and I don't have a suitable machine to test if the other order would work. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
7b13b58a80
commit
08aff3fe26
|
@ -2293,7 +2293,6 @@ void intel_edp_psr_init(struct drm_device *dev)
|
|||
static void intel_disable_dp(struct intel_encoder *encoder)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
enum port port = dp_to_dig_port(intel_dp)->port;
|
||||
struct drm_device *dev = encoder->base.dev;
|
||||
|
||||
/* Make sure the panel is off before trying to change the mode. But also
|
||||
|
@ -2303,21 +2302,19 @@ static void intel_disable_dp(struct intel_encoder *encoder)
|
|||
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
|
||||
intel_edp_panel_off(intel_dp);
|
||||
|
||||
/* cpu edp my only be disable _after_ the cpu pipe/plane is disabled. */
|
||||
if (!(port == PORT_A || IS_VALLEYVIEW(dev)))
|
||||
/* disable the port before the pipe on g4x */
|
||||
if (INTEL_INFO(dev)->gen < 5)
|
||||
intel_dp_link_down(intel_dp);
|
||||
}
|
||||
|
||||
static void g4x_post_disable_dp(struct intel_encoder *encoder)
|
||||
static void ilk_post_disable_dp(struct intel_encoder *encoder)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
enum port port = dp_to_dig_port(intel_dp)->port;
|
||||
|
||||
if (port != PORT_A)
|
||||
return;
|
||||
|
||||
intel_dp_link_down(intel_dp);
|
||||
ironlake_edp_pll_off(intel_dp);
|
||||
if (port == PORT_A)
|
||||
ironlake_edp_pll_off(intel_dp);
|
||||
}
|
||||
|
||||
static void vlv_post_disable_dp(struct intel_encoder *encoder)
|
||||
|
@ -5164,7 +5161,8 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
|
|||
} else {
|
||||
intel_encoder->pre_enable = g4x_pre_enable_dp;
|
||||
intel_encoder->enable = g4x_enable_dp;
|
||||
intel_encoder->post_disable = g4x_post_disable_dp;
|
||||
if (INTEL_INFO(dev)->gen >= 5)
|
||||
intel_encoder->post_disable = ilk_post_disable_dp;
|
||||
}
|
||||
|
||||
intel_dig_port->port = port;
|
||||
|
|
Loading…
Reference in New Issue