From nobody Fri Oct 2 03:38:08 2026 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C3011420475 for ; Wed, 5 Aug 2026 15:21:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785943295; cv=none; b=rMZ6HF4kcy2t3N6i/B9EKFaSDvW9GlT9GTzj87srz8Fh5bQUPVWMfVnjFa1myMB+rMzIqZR6mdlLoukvWBTe+1Eo1Ae/qHB24PeMFgqg+f+x2+djEf3ODkN990TsMMDKhiJRxnwqhRgap0CK6FAwpONp+TCXuYk1IV/mUV0FpR8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785943295; c=relaxed/simple; bh=NfV0SlVaPidlAGxZmEk5LEpzJk2oH6CGZRZrGI95h50=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=JW8tash32TT4Ffa9oobnqrMypXxUqwU8xZnDL4QctQeOfRMOZg29WSYxMUZkAA8h+40sgAC6ysMPIyXdoKu//+LBchf4KJOV0cJzRYYWOdKuL/SSzHbrauonILlTcj0AaZTAF2GM+cxGSAfCiDo6RANl0TNYm4xrNtJ/lawhuxw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nXCxKl4Q; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nXCxKl4Q" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-47fd66a094eso455036f8f.3 for ; Wed, 05 Aug 2026 08:21:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785943292; x=1786548092; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=1tHs/lOwiC51EDTGm3DKHRbCU7WZ3b5D/5yvhxX37k4=; b=nXCxKl4Q3QmrY7rfO132VcitvDq8jEbb7+/zfx1/3ZuTtvJeNqIsoxMI6wJLZ+4UD4 lS7o+LFHfOFrWXAjDe6BSc4nI7CiS+EFMqsYoNHXQb9CA2W3DiD9XZlMW7sbumtwDOIt VtTRDE5fl+iJtXwGMGIB+bxy9srDQb/+uS4zpJQIZr6Kv9BmRgT1UxQb0rubpeLvEKEi 2PKGa8Br9dT+ZrFEdAcIhIpe1S2k5qhZX0dbBU6jl/KDWZLOhb9VKsj3hPwZp3kDGEO6 RAVuGw7/03cJhrnuVYjBo5FIhHoqEs1qzQmyKIybkgZwDnSCzbsEMnCME2stWdBR2IKM /vHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785943292; x=1786548092; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=1tHs/lOwiC51EDTGm3DKHRbCU7WZ3b5D/5yvhxX37k4=; b=UyjwJgqbNu82YOL8P3WeLymvzUXctyOkLPKhrsfeKqUP8DIST2OwEak+0V2827wFKj gZR2Hr0D7zxGveHss4LzKnjiP+Pp9oxwM13QL2XZDGf1GGOA7FAgId8VLbuyFB5H4izh DJW+ilVQ1zMp87Et/gogsOmbCASSrO2aW1v+6w9vE6OuP0UqL0C6bCkZosoH/K0o2t7w fkHdsh6HeeRIv/HkglLCtPunA7aXe16N3Ykh1eBDfeiDQk9MdDpYk6tCwcwPnQ60NKFA +ixvbizVrRKw/cmvbbSIvlNx/kORHijRAVhyKD2welJcJyz1e4AZsWDYAeJb/uZXNlf7 C7pQ== X-Forwarded-Encrypted: i=1; AHgh+RooZtZw9GHJy1+d4Ts9dMCRZ+0BxFep0C+2S15wIObw4wCeLJIw6Eo1b16tlZeV8sHUJuEkCWTK6civiU0=@vger.kernel.org X-Gm-Message-State: AOJu0YwN0KTLyqvFSq1gvDs2DIfmMcF4NXBXh5CwsyzcAf6iUvjArdys A2DMr6GnDjAX9+FTdqbsfizfKU/uvcH/YXFZFcaHJwXuXqXmVqndKhLY X-Gm-Gg: AR+sD12MQGlGO5ilE/JAjbRduGTrgU90QfdH9moks9BptMQL0ZpfcfLIQmhfUGMR29z blkTL8F3wY0S1mjerBmyyqYpA5GWaUnhdxVjoxvzBnhDgnPP0sB8mrjcoZczijM6Yn00mBOSfue cEDfrAMUUMjF8kwpLEv2fuVt4BAOFQjybO5a/gp8XulfK79LY0qDnsQOSu394hG6CsfYvf6TX8Z ehSBGK+tT5sXEGfnCuu5JCW14hTf/P16A3xOL5qjB1EPs6jhJk5g4pgYFOUPnUkBl02JFgNW4QT b9ryeXAc0ySndyy5eGGIbx9nqY3THs+AhuDMY1CiFeqbaQBXt3U/A5fw+IMKkqvPF0EgSTrYrFU TPmFvnmss/WwJ0jeq/8InYFvdTq+RTMjLgElF6fxfJnKZW4kK7Y88azLyeyZR/e+JP8gcF5lpdh Tb/gbyjpaANRXS8pERy6XpClWGms+vEYBXCceRUh6fVepC0yaQ3U28SorE8wjTU4RcuwHHX0SIW 4Q7db7q3lF0UrT/07+a X-Received: by 2002:a05:6000:4305:b0:47f:93b9:d071 with SMTP id ffacd0b85a97d-47fec62b7b2mr12850186f8f.19.1785943291837; Wed, 05 Aug 2026 08:21:31 -0700 (PDT) Received: from localhost.localdomain ([95.43.220.235]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fec24a23asm9884573f8f.37.2026.08.05.08.21.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Aug 2026 08:21:31 -0700 (PDT) From: Ivaylo Dimitrov To: Tomi Valkeinen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jaroslav Kysela , Takashi Iwai , Jarkko Nikula , Sen Wang , Liam Girdwood , Mark Brown , Jakub Kicinski , Alex Deucher Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-omap@vger.kernel.org, Ivaylo Dimitrov Subject: [PATCH] drm/omap: Report HDMI hotplug events to the ASoC HDMI codec Date: Wed, 5 Aug 2026 18:20:57 +0300 Message-Id: <20260805152057.1291659-1-ivo.g.dimitrov.75@gmail.com> X-Mailer: git-send-email 2.25.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The OMAP HDMI audio driver currently has no way of reporting HDMI cable hotplug events to ASoC. As a result, user space cannot detect HDMI audio availability through the standard jack mechanism and audio policy managers cannot automatically route audio to or from the HDMI output. Add an optional HPD callback to `omap_hdmi_audio_pdata` and invoke it from the DRM HDMI bridge whenever the connector status changes. The HDMI audio driver registers an ASoC jack and reports `SND_JACK_AVOUT` state changes in response to these notifications. Also fix the disconnect path by taking a runtime PM reference before updating the CEC physical address. Signed-off-by: Ivaylo Dimitrov --- drivers/gpu/drm/omapdrm/dss/hdmi4.c | 12 ++++++++++- include/sound/omap-hdmi-audio.h | 1 + sound/soc/ti/omap-hdmi.c | 33 +++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/= dss/hdmi4.c index e306247ed8a0..b466bbdae5cc 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c @@ -432,9 +432,19 @@ static void hdmi4_bridge_hpd_notify(struct drm_bridge = *bridge, enum drm_connector_status status) { struct omap_hdmi *hdmi =3D drm_bridge_to_hdmi(bridge); + struct device *dev =3D &hdmi->audio_pdev->dev; + struct omap_hdmi_audio_pdata *ha =3D dev_get_platdata(dev); + + if (ha->audio_hpd) + ha->audio_hpd(dev, status =3D=3D connector_status_connected); + + if (status =3D=3D connector_status_disconnected) { + if (hdmi_runtime_get(hdmi)) + return; =20 - if (status =3D=3D connector_status_disconnected) hdmi4_cec_set_phys_addr(&hdmi->core, CEC_PHYS_ADDR_INVALID); + hdmi_runtime_put(hdmi); + } } =20 static const struct drm_edid *hdmi4_bridge_edid_read(struct drm_bridge *br= idge, diff --git a/include/sound/omap-hdmi-audio.h b/include/sound/omap-hdmi-audi= o.h index e5f82044a404..8dca92360ee0 100644 --- a/include/sound/omap-hdmi-audio.h +++ b/include/sound/omap-hdmi-audio.h @@ -34,6 +34,7 @@ struct omap_hdmi_audio_pdata { phys_addr_t audio_dma_addr; =20 const struct omap_hdmi_audio_ops *ops; + void (*audio_hpd)(struct device *dev, bool connected); }; =20 #endif /* __OMAP_HDMI_AUDIO_H__ */ diff --git a/sound/soc/ti/omap-hdmi.c b/sound/soc/ti/omap-hdmi.c index e60f5b483fc5..333aa308979e 100644 --- a/sound/soc/ti/omap-hdmi.c +++ b/sound/soc/ti/omap-hdmi.c @@ -17,6 +17,7 @@ #include #include #include +#include #include =20 #include "sdma-pcm.h" @@ -35,6 +36,8 @@ struct hdmi_audio_data { =20 struct mutex current_stream_lock; struct snd_pcm_substream *current_stream; + struct snd_soc_jack jack; + atomic_t jack_state; }; =20 static @@ -262,6 +265,18 @@ static void hdmi_dai_shutdown(struct snd_pcm_substream= *substream, ad->current_stream =3D NULL; } =20 +static void hdmi_audio_hpd(struct device *dev, bool connected) +{ + struct hdmi_audio_data *ad =3D dev_get_drvdata(dev); + + if (atomic_xchg(&ad->jack_state, connected) =3D=3D connected) + return; + + snd_soc_jack_report(&ad->jack, + connected ? SND_JACK_AVOUT : 0, SND_JACK_AVOUT); + dev_dbg(dev, "HDMI %s\n", connected ? "CONNECTED" : "DISCONNECTED"); +} + static const struct snd_soc_dai_ops hdmi_dai_ops =3D { .startup =3D hdmi_dai_startup, .hw_params =3D hdmi_dai_hw_params, @@ -380,19 +395,37 @@ static int omap_hdmi_audio_probe(struct platform_devi= ce *pdev) return ret; } =20 + atomic_set(&ad->jack_state, -1); ad->card =3D card; snd_soc_card_set_drvdata(card, ad); =20 dev_set_drvdata(dev, ad); =20 + ret =3D snd_soc_card_jack_new( + card, "HDMI", SND_JACK_AVOUT, &ad->jack); + if (ret < 0) { + dev_err(dev, "Cannot create HDMI jack: %i\n", ret); + return ret; + } + + ha->audio_hpd =3D hdmi_audio_hpd; + return 0; } =20 +static void omap_hdmi_audio_remove(struct platform_device *pdev) +{ + struct omap_hdmi_audio_pdata *ha =3D pdev->dev.platform_data; + + ha->audio_hpd =3D NULL; +} + static struct platform_driver hdmi_audio_driver =3D { .driver =3D { .name =3D DRV_NAME, }, .probe =3D omap_hdmi_audio_probe, + .remove =3D omap_hdmi_audio_remove, }; =20 module_platform_driver(hdmi_audio_driver); --=20 2.39.5