[PATCH] drm/amd/display: Always notify the HDA driver on connector disconnect

From: Nícolas F. R. A. Prado

Date: Fri Jun 26 2026 - 10:25:25 EST


amdgpu_dm_audio_eld_notify() is currently only called in atomic commits.
This results in the state of the HDA driver never getting updated when
an audio sink is removed and an atomic commit never comes. (eg the HDMI
audio jack switch in ALSA stays 'on' after the HDMI cable is
disconnected if no other display is connected to cause the compositor to
submit an atomic commit)

Call amdgpu_dm_audio_eld_notify() in
amdgpu_dm_update_connector_after_detect() when a sink is no longer
available to ensure that the HDA driver always gets notified on
disconnect regardless of atomic commits.

Assisted-by: Copilot:claude-sonnet-4.6
Signed-off-by: Nícolas F. R. A. Prado <nfraprado@xxxxxxxxxxxxx>
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.c | 2 +-
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.h | 2 +-
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c | 9 +++++++++
3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.c
index 13c9a9d145ba..c9da19335eac 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.c
@@ -168,7 +168,7 @@ void amdgpu_dm_audio_fini(struct amdgpu_device *adev)
}
EXPORT_IF_KUNIT(amdgpu_dm_audio_fini);

-STATIC_IFN_KUNIT void amdgpu_dm_audio_eld_notify(struct amdgpu_device *adev, int pin)
+void amdgpu_dm_audio_eld_notify(struct amdgpu_device *adev, int pin)
{
struct drm_audio_component *acomp = adev->dm.audio_component;

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.h
index 7acfc5ef69b3..d0361fd95f60 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_audio.h
@@ -40,6 +40,7 @@ void amdgpu_dm_commit_audio(struct drm_device *dev,
void amdgpu_dm_fill_audio_info(struct audio_info *audio_info,
const struct drm_connector *drm_connector,
const struct dc_sink *dc_sink);
+void amdgpu_dm_audio_eld_notify(struct amdgpu_device *adev, int pin);

#if IS_ENABLED(CONFIG_DRM_AMD_DC_KUNIT_TEST)
struct device;
@@ -48,7 +49,6 @@ int amdgpu_dm_audio_component_bind(struct device *kdev,
struct device *hda_kdev, void *data);
void amdgpu_dm_audio_component_unbind(struct device *kdev,
struct device *hda_kdev, void *data);
-void amdgpu_dm_audio_eld_notify(struct amdgpu_device *adev, int pin);
int amdgpu_dm_audio_get_param(void);
void amdgpu_dm_audio_set_param(int val);
#endif
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
index 300ee26f26ff..9286f86a20cd 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
@@ -464,6 +464,8 @@ void amdgpu_dm_update_connector_after_detect(
struct drm_connector *connector = &aconnector->base;
struct dc_sink *sink __free(sink_release) = NULL;
struct drm_device *dev = connector->dev;
+ struct amdgpu_device *adev = drm_to_adev(dev);
+ int inst;

/* MST handled by drm_mst framework */
if (aconnector->mst_mgr.mst_state == true)
@@ -601,6 +603,13 @@ void amdgpu_dm_update_connector_after_detect(
/* Set CP to DESIRED if it was ENABLED, so we can re-enable it again on hotplug */
if (connector->state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED)
connector->state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
+
+ mutex_lock(&adev->dm.audio_lock);
+ inst = aconnector->audio_inst;
+ aconnector->audio_inst = -1;
+ mutex_unlock(&adev->dm.audio_lock);
+ if (inst != -1)
+ amdgpu_dm_audio_eld_notify(adev, inst);
}

update_subconnector_property(aconnector);

---
base-commit: 30ffa8de54e5cc80d93fd211ca134d1764a7011f
change-id: 20260625-amdgpu-dm-always-eld-notify-on-disconnect-951e67fae8ed

Best regards,
--
Nícolas F. R. A. Prado <nfraprado@xxxxxxxxxxxxx>