ASoC: hdmi-codec: fix missing report for jack initial status
authorJerome Brunet <jbrunet@baylibre.com>
Mon, 18 Dec 2023 14:56:52 +0000 (15:56 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Jan 2024 12:42:34 +0000 (12:42 +0000)
[ Upstream commit 025222a9d6d25eee2ad9a1bb5a8b29b34b5ba576 ]

This fixes a problem introduced while fixing ELD reporting with no jack
set.

Most driver using the hdmi-codec will call the 'plugged_cb' callback
directly when registered to report the initial state of the HDMI connector.

With the commit mentionned, this occurs before jack is ready and the
initial report is lost for platforms actually providing a jack for HDMI.

Fix this by storing the hdmi connector status regardless of jack being set
or not and report the last status when jack gets set.

With this, the initial state is reported correctly even if it is
disconnected. This was not done initially and is also a fix.

Fixes: 15be353d55f9 ("ASoC: hdmi-codec: register hpd callback on component probe")
Reported-by: Zhengqiao Xia <xiazhengqiao@huaqin.corp-partner.google.com>
Closes: https://lore.kernel.org/alsa-devel/CADYyEwTNyY+fR9SgfDa-g6iiDwkU3MUdPVCYexs2_3wbcM8_vg@mail.gmail.com/
Cc: Hsin-Yi Wang <hsinyi@google.com>
Tested-by: Zhengqiao Xia <xiazhengqiao@huaqin.corp-partner.google.com>
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Link: https://msgid.link/r/20231218145655.134929-1-jbrunet@baylibre.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/codecs/hdmi-codec.c

index 20da1eaa4f1c7e9991a7b46901d1d38ada60dbce..0938671700c621d3d2e8d2cb2e7e107527b8f1b8 100644 (file)
@@ -850,8 +850,9 @@ static int hdmi_dai_probe(struct snd_soc_dai *dai)
 static void hdmi_codec_jack_report(struct hdmi_codec_priv *hcp,
                                   unsigned int jack_status)
 {
-       if (hcp->jack && jack_status != hcp->jack_status) {
-               snd_soc_jack_report(hcp->jack, jack_status, SND_JACK_LINEOUT);
+       if (jack_status != hcp->jack_status) {
+               if (hcp->jack)
+                       snd_soc_jack_report(hcp->jack, jack_status, SND_JACK_LINEOUT);
                hcp->jack_status = jack_status;
        }
 }
@@ -880,6 +881,13 @@ static int hdmi_codec_set_jack(struct snd_soc_component *component,
 
        if (hcp->hcd.ops->hook_plugged_cb) {
                hcp->jack = jack;
+
+               /*
+                * Report the initial jack status which may have been provided
+                * by the parent hdmi driver while the hpd hook was registered.
+                */
+               snd_soc_jack_report(jack, hcp->jack_status, SND_JACK_LINEOUT);
+
                return 0;
        }