diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 3ffbd69e4551..2fc9f81fdd41 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -37,6 +37,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
37 | struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); | 37 | struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); |
38 | struct intel_digital_port *intel_dig_port = intel_mst->primary; | 38 | struct intel_digital_port *intel_dig_port = intel_mst->primary; |
39 | struct intel_dp *intel_dp = &intel_dig_port->dp; | 39 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
40 | struct intel_connector *connector = | ||
41 | to_intel_connector(conn_state->connector); | ||
40 | struct drm_atomic_state *state; | 42 | struct drm_atomic_state *state; |
41 | int bpp; | 43 | int bpp; |
42 | int lane_count, slots; | 44 | int lane_count, slots; |
@@ -59,6 +61,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
59 | 61 | ||
60 | state = pipe_config->base.state; | 62 | state = pipe_config->base.state; |
61 | 63 | ||
64 | if (drm_dp_mst_port_has_audio(&intel_dp->mst_mgr, connector->port)) | ||
65 | pipe_config->has_audio = true; | ||
62 | mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp); | 66 | mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp); |
63 | 67 | ||
64 | pipe_config->pbn = mst_pbn; | 68 | pipe_config->pbn = mst_pbn; |
@@ -84,6 +88,7 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder, | |||
84 | struct intel_dp *intel_dp = &intel_dig_port->dp; | 88 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
85 | struct intel_connector *connector = | 89 | struct intel_connector *connector = |
86 | to_intel_connector(old_conn_state->connector); | 90 | to_intel_connector(old_conn_state->connector); |
91 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | ||
87 | int ret; | 92 | int ret; |
88 | 93 | ||
89 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); | 94 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); |
@@ -94,6 +99,10 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder, | |||
94 | if (ret) { | 99 | if (ret) { |
95 | DRM_ERROR("failed to update payload %d\n", ret); | 100 | DRM_ERROR("failed to update payload %d\n", ret); |
96 | } | 101 | } |
102 | if (old_crtc_state->has_audio) { | ||
103 | intel_audio_codec_disable(encoder); | ||
104 | intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO); | ||
105 | } | ||
97 | } | 106 | } |
98 | 107 | ||
99 | static void intel_mst_post_disable_dp(struct intel_encoder *encoder, | 108 | static void intel_mst_post_disable_dp(struct intel_encoder *encoder, |
@@ -206,6 +215,12 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder, | |||
206 | ret = drm_dp_check_act_status(&intel_dp->mst_mgr); | 215 | ret = drm_dp_check_act_status(&intel_dp->mst_mgr); |
207 | 216 | ||
208 | ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr); | 217 | ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr); |
218 | if (pipe_config->has_audio) { | ||
219 | DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n", | ||
220 | pipe_name(intel_mst->pipe)); | ||
221 | intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO); | ||
222 | intel_audio_codec_enable(encoder); | ||
223 | } | ||
209 | } | 224 | } |
210 | 225 | ||
211 | static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, | 226 | static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, |
@@ -228,6 +243,9 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder, | |||
228 | enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; | 243 | enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; |
229 | u32 temp, flags = 0; | 244 | u32 temp, flags = 0; |
230 | 245 | ||
246 | pipe_config->has_audio = | ||
247 | intel_ddi_is_audio_enabled(dev_priv, crtc); | ||
248 | |||
231 | temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); | 249 | temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); |
232 | if (temp & TRANS_DDI_PHSYNC) | 250 | if (temp & TRANS_DDI_PHSYNC) |
233 | flags |= DRM_MODE_FLAG_PHSYNC; | 251 | flags |= DRM_MODE_FLAG_PHSYNC; |