diff options
author | Libin Yang <libin.yang@intel.com> | 2016-11-28 07:07:07 -0500 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2016-11-29 10:42:10 -0500 |
commit | 7f9e77545b92bcb894b8e2be5646535e8ba8da9e (patch) | |
tree | 75ce22a7c178e1e4ca9c8ed5ebaac8315fecfd8f /drivers/gpu/drm/i915/intel_dp_mst.c | |
parent | 9935f7fa2854355203e3976762eecfb218079aac (diff) |
drm/i915: enable dp mst audio
This patch adds support for DP MST audio in i915.
Enable audio codec when DP MST is enabled if has_audio flag is set.
Disable audio codec when DP MST is disabled if has_audio flag is set.
Another separated patches to support DP MST audio will be implemented
in audio driver.
This patch is ported from
commit 3708d5e082c3 ("drm/i915: start adding dp mst audio")
And because commit 3708d5e082c3 ("drm/i915: start adding dp mst audio")
breaks MST multi-monitor setups on some platforms, the orignal patch is
reverted by
commit be754b101f70 ("Revert "drm/i915: start adding dp mst audio"")
As the multi-monitor setups issue is fixed, let's port the patch and
enable the dp mst audio.
Signed-off-by: Libin Yang <libin.yang@intel.com>
Cc: Lyude <cpaul@redhat.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1480334827-112273-3-git-send-email-libin.yang@intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index b029d1026a28..1f98757f61e7 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; |
@@ -58,6 +60,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
58 | 60 | ||
59 | state = pipe_config->base.state; | 61 | state = pipe_config->base.state; |
60 | 62 | ||
63 | if (drm_dp_mst_port_has_audio(&intel_dp->mst_mgr, connector->port)) | ||
64 | pipe_config->has_audio = true; | ||
61 | mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp); | 65 | mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp); |
62 | 66 | ||
63 | pipe_config->pbn = mst_pbn; | 67 | pipe_config->pbn = mst_pbn; |
@@ -83,6 +87,7 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder, | |||
83 | struct intel_dp *intel_dp = &intel_dig_port->dp; | 87 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
84 | struct intel_connector *connector = | 88 | struct intel_connector *connector = |
85 | to_intel_connector(old_conn_state->connector); | 89 | to_intel_connector(old_conn_state->connector); |
90 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | ||
86 | int ret; | 91 | int ret; |
87 | 92 | ||
88 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); | 93 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); |
@@ -93,6 +98,10 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder, | |||
93 | if (ret) { | 98 | if (ret) { |
94 | DRM_ERROR("failed to update payload %d\n", ret); | 99 | DRM_ERROR("failed to update payload %d\n", ret); |
95 | } | 100 | } |
101 | if (old_crtc_state->has_audio) { | ||
102 | intel_audio_codec_disable(encoder); | ||
103 | intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO); | ||
104 | } | ||
96 | } | 105 | } |
97 | 106 | ||
98 | static void intel_mst_post_disable_dp(struct intel_encoder *encoder, | 107 | static void intel_mst_post_disable_dp(struct intel_encoder *encoder, |
@@ -205,6 +214,10 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder, | |||
205 | ret = drm_dp_check_act_status(&intel_dp->mst_mgr); | 214 | ret = drm_dp_check_act_status(&intel_dp->mst_mgr); |
206 | 215 | ||
207 | ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr); | 216 | ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr); |
217 | if (pipe_config->has_audio) { | ||
218 | intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO); | ||
219 | intel_audio_codec_enable(encoder, pipe_config, conn_state); | ||
220 | } | ||
208 | } | 221 | } |
209 | 222 | ||
210 | static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, | 223 | static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, |
@@ -227,6 +240,9 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder, | |||
227 | enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; | 240 | enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; |
228 | u32 temp, flags = 0; | 241 | u32 temp, flags = 0; |
229 | 242 | ||
243 | pipe_config->has_audio = | ||
244 | intel_ddi_is_audio_enabled(dev_priv, crtc); | ||
245 | |||
230 | temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); | 246 | temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); |
231 | if (temp & TRANS_DDI_PHSYNC) | 247 | if (temp & TRANS_DDI_PHSYNC) |
232 | flags |= DRM_MODE_FLAG_PHSYNC; | 248 | flags |= DRM_MODE_FLAG_PHSYNC; |