On Sat, Feb 22, 2025 at 11:29:21AM +0100, Stefan Wahren wrote:
> From: David Turner <david.tur...@raspberrypi.com>
> 
> Add ALSA jack detection to the vc4-hdmi audio driver so userspace knows
> when to add/remove HDMI audio devices.
> 
> Signed-off-by: David Turner <david.tur...@raspberrypi.com>
> Signed-off-by: Stefan Wahren <wahre...@gmx.net>
> ---
>  drivers/gpu/drm/vc4/vc4_hdmi.c | 26 ++++++++++++++++++++++++--
>  drivers/gpu/drm/vc4/vc4_hdmi.h |  7 +++++++
>  2 files changed, 31 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
> index 47d9ada98430..d24ae86d799e 100644
> --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
> +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
> @@ -51,6 +51,7 @@
>  #include <linux/reset.h>
>  #include <sound/dmaengine_pcm.h>
>  #include <sound/hdmi-codec.h>
> +#include <sound/jack.h>
>  #include <sound/pcm_drm_eld.h>
>  #include <sound/pcm_params.h>
>  #include <sound/soc.h>
> @@ -386,6 +387,12 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi 
> *vc4_hdmi,
>       struct drm_connector *connector = &vc4_hdmi->connector;
>       int ret;
> 
> +     /*
> +      * Needs to be called for both connects and disconnects for HDMI
> +      * audio hotplug to work correctly.
> +      */
> +     drm_atomic_helper_connector_hdmi_hotplug(connector, status);
> +
>       /*
>        * NOTE: This function should really be called with vc4_hdmi->mutex
>        * held, but doing so results in reentrancy issues since
> @@ -405,8 +412,6 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi 
> *vc4_hdmi,
>               return;
>       }
> 
> -     drm_atomic_helper_connector_hdmi_hotplug(connector, status);
> -
>       cec_s_phys_addr(vc4_hdmi->cec_adap,
>                       connector->display_info.source_physical_address, false);
> 
> @@ -2203,6 +2208,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);

PLease excuse my ignorance, but dows this work. In other words, how is
the driver exporting the plugged state through this jack?


> +}
> +
>  static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi)
>  {
>       const struct vc4_hdmi_register *mai_data =
> @@ -2316,6 +2337,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 e3d989ca302b..a31157c99bee 100644
> --- a/drivers/gpu/drm/vc4/vc4_hdmi.h
> +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
> @@ -4,6 +4,7 @@
>  #include <drm/drm_connector.h>
>  #include <media/cec.h>
>  #include <sound/dmaengine_pcm.h>
> +#include <sound/hdmi-codec.h>
>  #include <sound/soc.h>
> 
>  #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
> 

-- 
With best wishes
Dmitry

Reply via email to