Commit 4dcbca87 authored by Charlene Liu's avatar Charlene Liu Committed by Greg Kroah-Hartman

drm/amd/display: support spdif

[ Upstream commit b5a41620 ]

[Description]
port spdif fix to staging:
 spdif hardwired to afmt inst 1.
 spdif func pointer
 spdif resource allocation (reserve last audio endpoint for spdif only)
Signed-off-by: default avatarCharlene Liu <charlene.liu@amd.com>
Reviewed-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 38dfc974
...@@ -229,12 +229,10 @@ bool resource_construct( ...@@ -229,12 +229,10 @@ bool resource_construct(
DC_ERR("DC: failed to create audio!\n"); DC_ERR("DC: failed to create audio!\n");
return false; return false;
} }
if (!aud->funcs->endpoint_valid(aud)) { if (!aud->funcs->endpoint_valid(aud)) {
aud->funcs->destroy(&aud); aud->funcs->destroy(&aud);
break; break;
} }
pool->audios[i] = aud; pool->audios[i] = aud;
pool->audio_count++; pool->audio_count++;
} }
...@@ -1703,24 +1701,25 @@ static struct audio *find_first_free_audio( ...@@ -1703,24 +1701,25 @@ static struct audio *find_first_free_audio(
const struct resource_pool *pool, const struct resource_pool *pool,
enum engine_id id) enum engine_id id)
{ {
int i; int i, available_audio_count;
for (i = 0; i < pool->audio_count; i++) {
available_audio_count = pool->audio_count;
for (i = 0; i < available_audio_count; i++) {
if ((res_ctx->is_audio_acquired[i] == false) && (res_ctx->is_stream_enc_acquired[i] == true)) { if ((res_ctx->is_audio_acquired[i] == false) && (res_ctx->is_stream_enc_acquired[i] == true)) {
/*we have enough audio endpoint, find the matching inst*/ /*we have enough audio endpoint, find the matching inst*/
if (id != i) if (id != i)
continue; continue;
return pool->audios[i]; return pool->audios[i];
} }
} }
/* use engine id to find free audio */ /* use engine id to find free audio */
if ((id < pool->audio_count) && (res_ctx->is_audio_acquired[id] == false)) { if ((id < available_audio_count) && (res_ctx->is_audio_acquired[id] == false)) {
return pool->audios[id]; return pool->audios[id];
} }
/*not found the matching one, first come first serve*/ /*not found the matching one, first come first serve*/
for (i = 0; i < pool->audio_count; i++) { for (i = 0; i < available_audio_count; i++) {
if (res_ctx->is_audio_acquired[i] == false) { if (res_ctx->is_audio_acquired[i] == false) {
return pool->audios[i]; return pool->audios[i];
} }
......
...@@ -611,6 +611,8 @@ void dce_aud_az_configure( ...@@ -611,6 +611,8 @@ void dce_aud_az_configure(
AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1, AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1,
value); value);
DC_LOG_HW_AUDIO("\n\tAUDIO:az_configure: index: %u data, 0x%x, displayName %s: \n",
audio->inst, value, audio_info->display_name);
/* /*
*write the port ID: *write the port ID:
...@@ -922,7 +924,6 @@ static const struct audio_funcs funcs = { ...@@ -922,7 +924,6 @@ static const struct audio_funcs funcs = {
.az_configure = dce_aud_az_configure, .az_configure = dce_aud_az_configure,
.destroy = dce_aud_destroy, .destroy = dce_aud_destroy,
}; };
void dce_aud_destroy(struct audio **audio) void dce_aud_destroy(struct audio **audio)
{ {
struct dce_audio *aud = DCE_AUD(*audio); struct dce_audio *aud = DCE_AUD(*audio);
...@@ -953,7 +954,6 @@ struct audio *dce_audio_create( ...@@ -953,7 +954,6 @@ struct audio *dce_audio_create(
audio->regs = reg; audio->regs = reg;
audio->shifts = shifts; audio->shifts = shifts;
audio->masks = masks; audio->masks = masks;
return &audio->base; return &audio->base;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment