drm/amd/display: Disable audio stream only if it's currently enabled
authorEryk Brol <eryk.brol@amd.com>
Wed, 8 May 2019 13:08:03 +0000 (09:08 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 31 May 2019 15:39:30 +0000 (10:39 -0500)
[Why]
Previously there were 2 consecutive calls being made to disable
audio stream. The first one disabled the audio stream, and the second
one went through and also tried to disable the audio stream causing
BACO entry issues due to the ASIC appearing busy.

[How]
1. Add a status field to the audio struct which stores enabled/disabled
info
2. In the calls to enable/disable audio stream check if we're already
in the desired state before executing the function

Signed-off-by: Eryk Brol <eryk.brol@amd.com>
Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Leo Li <sunpeng.li@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/inc/hw/audio.h

index bb28b057a4c87fa94d11c34a8f18ae525df88fd5..f9ee77115a5d857a3b0c1b94fce2599fab5126a6 100644 (file)
@@ -961,6 +961,9 @@ void dce110_enable_audio_stream(struct pipe_ctx *pipe_ctx)
        struct pp_smu_funcs *pp_smu = NULL;
        unsigned int i, num_audio = 1;
 
+       if (pipe_ctx->stream_res.audio && pipe_ctx->stream_res.audio->enabled == true)
+               return;
+
        if (core_dc->res_pool->pp_smu)
                pp_smu = core_dc->res_pool->pp_smu;
 
@@ -980,6 +983,8 @@ void dce110_enable_audio_stream(struct pipe_ctx *pipe_ctx)
                /* TODO: audio should be per stream rather than per link */
                pipe_ctx->stream_res.stream_enc->funcs->audio_mute_control(
                                        pipe_ctx->stream_res.stream_enc, false);
+               if (pipe_ctx->stream_res.audio)
+                       pipe_ctx->stream_res.audio->enabled = true;
        }
 }
 
@@ -988,6 +993,9 @@ void dce110_disable_audio_stream(struct pipe_ctx *pipe_ctx, int option)
        struct dc *dc = pipe_ctx->stream->ctx->dc;
        struct pp_smu_funcs *pp_smu = NULL;
 
+       if (pipe_ctx->stream_res.audio && pipe_ctx->stream_res.audio->enabled == false)
+               return;
+
        pipe_ctx->stream_res.stream_enc->funcs->audio_mute_control(
                        pipe_ctx->stream_res.stream_enc, true);
        if (pipe_ctx->stream_res.audio) {
@@ -1021,6 +1029,8 @@ void dce110_disable_audio_stream(struct pipe_ctx *pipe_ctx, int option)
                /* dal_audio_disable_azalia_audio_jack_presence(stream->audio,
                 * stream->stream_engine_id);
                 */
+               if (pipe_ctx->stream_res.audio)
+                       pipe_ctx->stream_res.audio->enabled = false;
        }
 }
 
index 925204f49717e4ce113da35512a35464cc7d1fc0..6ed1fb8c930009a95842355af2181e8413999e6e 100644 (file)
@@ -57,6 +57,7 @@ struct audio {
        const struct audio_funcs *funcs;
        struct dc_context *ctx;
        unsigned int inst;
+       bool enabled;
 };
 
 #endif  /* __DAL_AUDIO__ */