Re: [PATCH v3 1/2] drm/vc4: hdmi: Call HDMI hotplug helper on disconnect
Hi Maxime, Thanks for the reviews. On Fri, 14 Mar 2025 at 13:33, Maxime Ripard wrote: > I also think that it's wrong, it's not just about audio. It just needs > to be called as part of detect no matter what the status is. Audio is > one thing that it will possibly handle depending on the driver, but > EDIDs, CEC, etc. might also be dealt with. So I don't think it's right > to focus on audio there. Does this wording sound ok? * This function should be called as a part of the .detect() / .detect_ctx() * callbacks for all status changes in order to update the HDMI-specific * connector's data. Best regards, David
[PATCH v4 1/3] drm/display: Update comment on hdmi hotplug helper
Update the comment on drm_atomic_helper_connector_hdmi_hotplug() to clarify that it must be called for all status updates. Signed-off-by: David Turner --- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/drm/display/drm_hdmi_state_helper.c index c205f37da1e12b11c384670db83e43613e031340..cac819ac468de020e4e75b3bcb09c31f909bd61e 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -816,7 +816,7 @@ drm_atomic_helper_connector_hdmi_update(struct drm_connector *connector, * @status: Connection status * * This function should be called as a part of the .detect() / .detect_ctx() - * callbacks, updating the HDMI-specific connector's data. + * callbacks for all status changes. */ void drm_atomic_helper_connector_hdmi_hotplug(struct drm_connector *connector, enum drm_connector_status status) -- 2.34.1
[PATCH v4 3/3] drm/vc4: hdmi: Add jack detection to HDMI audio driver
Add ALSA jack detection to the vc4-hdmi audio driver so userspace knows when to add/remove HDMI audio devices. Signed-off-by: Stefan Wahren Reviewed-by: Maxime Ripard Signed-off-by: David Turner --- drivers/gpu/drm/vc4/vc4_hdmi.c | 18 ++ drivers/gpu/drm/vc4/vc4_hdmi.h | 7 +++ 2 files changed, 25 insertions(+) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 37a7d45695f236d3ab281d9a8676921fd434955c..a29a6ef266f9a5952af53030a9a2d313e2ecdfce 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -2175,6 +2176,22 @@ static const struct drm_connector_hdmi_audio_funcs vc4_hdmi_audio_funcs = { .shutdown = vc4_hdmi_audio_shutdown, }; +static int vc4_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd) +{ + struct vc4_hdmi *vc4_hdmi = snd_soc_card_get_drvdata(rtd->card); + struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; + int ret; + + ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, + &vc4_hdmi->hdmi_jack); + if (ret) { + dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret); + return ret; + } + + return snd_soc_component_set_jack(component, &vc4_hdmi->hdmi_jack, NULL); +} + static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) { const struct vc4_hdmi_register *mai_data = @@ -2288,6 +2305,7 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) dai_link->cpus->dai_name = dev_name(dev); dai_link->codecs->name = dev_name(&vc4_hdmi->connector.hdmi_audio.codec_pdev->dev); dai_link->platforms->name = dev_name(dev); + dai_link->init = vc4_hdmi_codec_init; card->dai_link = dai_link; card->num_links = 1; diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h index e3d989ca302b72533c374dfa3fd0d5bd7fe64a82..a31157c99bee6b33527c4b558fc72fff65d2a278 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "vc4_drv.h" @@ -211,6 +212,12 @@ struct vc4_hdmi { * KMS hooks. Protected by @mutex. */ enum hdmi_colorspace output_format; + + /** +* @hdmi_jack: Represents the connection state of the HDMI plug, for +* ALSA jack detection. +*/ + struct snd_soc_jack hdmi_jack; }; #define connector_to_vc4_hdmi(_connector) \ -- 2.34.1
[PATCH v4 2/3] drm/vc4: hdmi: Call HDMI hotplug helper on disconnect
From: Stefan Wahren drm_atomic_helper_connector_hdmi_hotplug() must be called regardless of the connection status, otherwise the HDMI audio disconnect event won't be notified. Fixes: 2ea9ec5d2c20 ("drm/vc4: hdmi: use drm_atomic_helper_connector_hdmi_hotplug()") Suggested-by: Dmitry Baryshkov Signed-off-by: Stefan Wahren Reviewed-by: Maxime Ripard Signed-off-by: David Turner --- drivers/gpu/drm/vc4/vc4_hdmi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 37238a12baa58a06a5d6f40d1ab64abc7fac60d7..37a7d45695f236d3ab281d9a8676921fd434955c 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -372,13 +372,13 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi, * the lock for now. */ + drm_atomic_helper_connector_hdmi_hotplug(connector, status); + if (status == connector_status_disconnected) { cec_phys_addr_invalidate(vc4_hdmi->cec_adap); return; } - drm_atomic_helper_connector_hdmi_hotplug(connector, status); - cec_s_phys_addr(vc4_hdmi->cec_adap, connector->display_info.source_physical_address, false); -- 2.34.1
[PATCH v4 0/3] drm/vc4: hdmi: Add jack detection to HDMI audio driver
This series enables jack detection for HDMI audio on vc4 devices. This means that userspace audio applications can detect when HDMI devices are connected or disconnected, for example to play/pause or switch to another audio device. Changes in v4: - Split the update of the comment on drm_atomic_helper_connector_hdmi_hotplug() into a separate patch - Update the wording of the comment - Add Reviewed-by tags - Link to v3: https://lore.kernel.org/r/20250312-vc4_hotplug-v3-0-d75878677...@raspberrypi.com Changes in V3: - Update comment on drm_atomic_helper_connector_hdmi_hotplug() to clarify that it must be called for disconnets too Changes in V2: - split initial patch into fix and jack detection feature as suggested by Dmitry Signed-off-by: David Turner --- David Turner (2): drm/display: Update comment on hdmi hotplug helper drm/vc4: hdmi: Add jack detection to HDMI audio driver Stefan Wahren (1): drm/vc4: hdmi: Call HDMI hotplug helper on disconnect drivers/gpu/drm/display/drm_hdmi_state_helper.c | 2 +- drivers/gpu/drm/vc4/vc4_hdmi.c | 22 -- drivers/gpu/drm/vc4/vc4_hdmi.h | 7 +++ 3 files changed, 28 insertions(+), 3 deletions(-) --- base-commit: eff0347e7c228335e9ff64aaf02c66957803af6a change-id: 20250312-vc4_hotplug-3ae4e783484a Best regards, -- David Turner
Re: [PATCH V2 2/2] drm/vc4: hdmi: Add jack detection to HDMI audio driver
Hi all, On Thu, 6 Mar 2025 at 13:39, Maxime Ripard wrote: > It looks fairly generic to me. Is there any reason you didn't put it in > the HDMI audio helpers? I originally wrote the downstream patch last year on 6.6, before the generic HDMI audio code existed. I just had a look at doing this. At the moment drm_hdmi_audio_helper doesn't manage the snd_soc_card (needed to setup the jack) at all, that still lives in vc4_hdmi_audio, so I can't see an easy way to move this over without a lot more reorganising. David
[PATCH v3 0/2] drm/vc4: hdmi: Add jack detection to HDMI audio driver
This series enables jack detection for HDMI audio on vc4 devices. This means that userspace audio applications can detect when HDMI devices are connected or disconnected, for example to play/pause or switch to another audio device. Changes in V3: - Update comment on drm_atomic_helper_connector_hdmi_hotplug() to clarify that it must be called for disconnets too Changes in V2: - split initial patch into fix and jack detection feature as suggested by Dmitry Signed-off-by: David Turner --- David Turner (1): drm/vc4: hdmi: Add jack detection to HDMI audio driver Stefan Wahren (1): drm/vc4: hdmi: Call HDMI hotplug helper on disconnect drivers/gpu/drm/display/drm_hdmi_state_helper.c | 3 ++- drivers/gpu/drm/vc4/vc4_hdmi.c | 22 -- drivers/gpu/drm/vc4/vc4_hdmi.h | 7 +++ 3 files changed, 29 insertions(+), 3 deletions(-) --- base-commit: eff0347e7c228335e9ff64aaf02c66957803af6a change-id: 20250312-vc4_hotplug-3ae4e783484a Best regards, -- David Turner
[PATCH v3 2/2] drm/vc4: hdmi: Add jack detection to HDMI audio driver
Add ALSA jack detection to the vc4-hdmi audio driver so userspace knows when to add/remove HDMI audio devices. Signed-off-by: Stefan Wahren Signed-off-by: David Turner --- drivers/gpu/drm/vc4/vc4_hdmi.c | 18 ++ drivers/gpu/drm/vc4/vc4_hdmi.h | 7 +++ 2 files changed, 25 insertions(+) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 37a7d45695f236d3ab281d9a8676921fd434955c..a29a6ef266f9a5952af53030a9a2d313e2ecdfce 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -2175,6 +2176,22 @@ static const struct drm_connector_hdmi_audio_funcs vc4_hdmi_audio_funcs = { .shutdown = vc4_hdmi_audio_shutdown, }; +static int vc4_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd) +{ + struct vc4_hdmi *vc4_hdmi = snd_soc_card_get_drvdata(rtd->card); + struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; + int ret; + + ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, + &vc4_hdmi->hdmi_jack); + if (ret) { + dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret); + return ret; + } + + return snd_soc_component_set_jack(component, &vc4_hdmi->hdmi_jack, NULL); +} + static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) { const struct vc4_hdmi_register *mai_data = @@ -2288,6 +2305,7 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) dai_link->cpus->dai_name = dev_name(dev); dai_link->codecs->name = dev_name(&vc4_hdmi->connector.hdmi_audio.codec_pdev->dev); dai_link->platforms->name = dev_name(dev); + dai_link->init = vc4_hdmi_codec_init; card->dai_link = dai_link; card->num_links = 1; diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h index e3d989ca302b72533c374dfa3fd0d5bd7fe64a82..a31157c99bee6b33527c4b558fc72fff65d2a278 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "vc4_drv.h" @@ -211,6 +212,12 @@ struct vc4_hdmi { * KMS hooks. Protected by @mutex. */ enum hdmi_colorspace output_format; + + /** +* @hdmi_jack: Represents the connection state of the HDMI plug, for +* ALSA jack detection. +*/ + struct snd_soc_jack hdmi_jack; }; #define connector_to_vc4_hdmi(_connector) \ -- 2.34.1
[PATCH v3 1/2] drm/vc4: hdmi: Call HDMI hotplug helper on disconnect
From: Stefan Wahren drm_atomic_helper_connector_hdmi_hotplug() must be called regardless of the connection status, otherwise the HDMI audio disconnect event won't be notified. Also update the comment on drm_atomic_helper_connector_hdmi_hotplug() to explain that this is necessary. Fixes: 2ea9ec5d2c20 ("drm/vc4: hdmi: use drm_atomic_helper_connector_hdmi_hotplug()") Suggested-by: Dmitry Baryshkov Signed-off-by: Stefan Wahren Signed-off-by: David Turner --- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 3 ++- drivers/gpu/drm/vc4/vc4_hdmi.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/drm/display/drm_hdmi_state_helper.c index c205f37da1e12b11c384670db83e43613e031340..d26d51902ba1a73175b23eec71562a30ceda1082 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -816,7 +816,8 @@ drm_atomic_helper_connector_hdmi_update(struct drm_connector *connector, * @status: Connection status * * This function should be called as a part of the .detect() / .detect_ctx() - * callbacks, updating the HDMI-specific connector's data. + * callbacks, updating the HDMI-specific connector's data. It also needs to be + * called for disconnects to notify audio users of the unplug. */ void drm_atomic_helper_connector_hdmi_hotplug(struct drm_connector *connector, enum drm_connector_status status) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 37238a12baa58a06a5d6f40d1ab64abc7fac60d7..37a7d45695f236d3ab281d9a8676921fd434955c 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -372,13 +372,13 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi, * the lock for now. */ + drm_atomic_helper_connector_hdmi_hotplug(connector, status); + if (status == connector_status_disconnected) { cec_phys_addr_invalidate(vc4_hdmi->cec_adap); return; } - drm_atomic_helper_connector_hdmi_hotplug(connector, status); - cec_s_phys_addr(vc4_hdmi->cec_adap, connector->display_info.source_physical_address, false); -- 2.34.1