Hi Jerome, After my testing, I found that this patch will cause the audio on the external display to not work properly after restart. You move the plugged_cb to run in hdmi_probe, at this time hcp- > jack = NULL, the driver cannot report `*SND_JACK_LINEOUT*` normally. static void hdmi_codec_jack_report(struct hdmi_codec_priv *hcp, unsigned int jack_status) { printk("xzq-866 hdmi_codec_jack_report: jack=%x, jack_status=%d", hcp->jack, jack_status != hcp->jack_status); if (hcp->jack && jack_status != hcp->jack_status) { snd_soc_jack_report(hcp->jack, jack_status, SND_JACK_LINEOUT); hcp->jack_status = jack_status; } } So we must call *plugged_cb* in *hdmi_codec_set_jack, *Can you make some changes? On Mon, Nov 6, 2023 at 6:40 PM Jerome Brunet <jbrunet@xxxxxxxxxxxx> wrote: > The HDMI hotplug callback to the hdmi-codec is currently registered when > jack is set. > > The hotplug not only serves to report the ASoC jack state but also to get > the ELD. It should be registered when the component probes instead, so it > does not depend on the card driver registering a jack for the HDMI to > properly report the ELD. > > Fixes: 25ce4f2b3593 ("ASoC: hdmi-codec: Get ELD in before reporting > plugged event") > Signed-off-by: Jerome Brunet <jbrunet@xxxxxxxxxxxx> > --- > sound/soc/codecs/hdmi-codec.c | 27 +++++++++++++++++++-------- > 1 file changed, 19 insertions(+), 8 deletions(-) > > diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c > index 09eef6042aad..20da1eaa4f1c 100644 > --- a/sound/soc/codecs/hdmi-codec.c > +++ b/sound/soc/codecs/hdmi-codec.c > @@ -877,18 +877,13 @@ static int hdmi_codec_set_jack(struct > snd_soc_component *component, > void *data) > { > struct hdmi_codec_priv *hcp = > snd_soc_component_get_drvdata(component); > - int ret = -ENOTSUPP; > > if (hcp->hcd.ops->hook_plugged_cb) { > hcp->jack = jack; > - ret = hcp->hcd.ops->hook_plugged_cb(component->dev->parent, > - hcp->hcd.data, > - plugged_cb, > - component->dev); > - if (ret) > - hcp->jack = NULL; > + return 0; > } > - return ret; > + > + return -ENOTSUPP; > } > > static int hdmi_dai_spdif_probe(struct snd_soc_dai *dai) > @@ -982,6 +977,21 @@ static int hdmi_of_xlate_dai_id(struct > snd_soc_component *component, > return ret; > } > > +static int hdmi_probe(struct snd_soc_component *component) > +{ > + struct hdmi_codec_priv *hcp = > snd_soc_component_get_drvdata(component); > + int ret = 0; > + > + if (hcp->hcd.ops->hook_plugged_cb) { > + ret = hcp->hcd.ops->hook_plugged_cb(component->dev->parent, > + hcp->hcd.data, > + plugged_cb, > + component->dev); > + } > + > + return ret; > +} > + > static void hdmi_remove(struct snd_soc_component *component) > { > struct hdmi_codec_priv *hcp = > snd_soc_component_get_drvdata(component); > @@ -992,6 +1002,7 @@ static void hdmi_remove(struct snd_soc_component > *component) > } > > static const struct snd_soc_component_driver hdmi_driver = { > + .probe = hdmi_probe, > .remove = hdmi_remove, > .dapm_widgets = hdmi_widgets, > .num_dapm_widgets = ARRAY_SIZE(hdmi_widgets), >