Files
LibreELEC.tv/projects/Amlogic/devices/AMLGX/patches/linux/amlogic-0009-LOCAL-ASoC-meson-assign-internal-PCM-chmap-ELD-IEC95.patch
Christian Hewitt 3e7432503e linux: update Amlogic patches for Linux 6.14.y
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
2025-05-11 12:15:17 +00:00

59 lines
2.2 KiB
Diff

From d5b5b93b0911f8efe1f31a66eb7b215ba56e4718 Mon Sep 17 00:00:00 2001
From: Anssi Hannula <anssi.hannula@iki.fi>
Date: Sun, 17 Apr 2022 04:37:48 +0000
Subject: [PATCH 09/55] LOCAL: ASoC: meson: assign internal PCM
chmap/ELD/IEC958 kctls to device 0
On SoC sound devices utilizing codec2codec DAI links with an HDMI codec the kctls
for chmap, ELD, IEC958 are created using internal PCM device numbers. This causes
userspace to not see the actual channel mapping. This affects all Amlogic devices
using the AIU and AXG audio drivers: currently all Amlogic devices.
The proper fix would be not create these kctls for internal PCMs and instead create
them for the real userspace-visible PCMs, somehow forwarding the controls between
the HDMI codec and the real PCM.
As a workaround, simply use device=0 for all channel map controls and SoC HDMI codec
controls for internal PCM devices.
Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
Tested-by: Christian Hewitt <christianshewitt@gmail.com>
---
sound/core/pcm_lib.c | 5 ++++-
sound/soc/codecs/hdmi-codec.c | 3 ++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index 6eaa950504cf..f2f05f1c4f98 100644
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -2612,7 +2612,10 @@ int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream,
knew.name = "Playback Channel Map";
else
knew.name = "Capture Channel Map";
- knew.device = pcm->device;
+ if (pcm->internal && pcm->device)
+ dev_info(pcm->card->dev, "workaround: internal PCM chmap controls mapped to device 0\n");
+ else
+ knew.device = pcm->device;
knew.count = pcm->streams[stream].substream_count;
knew.private_value = private_value;
info->kctl = snd_ctl_new1(&knew, info);
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
index 69f98975e14a..16f2e8511727 100644
--- a/sound/soc/codecs/hdmi-codec.c
+++ b/sound/soc/codecs/hdmi-codec.c
@@ -816,7 +816,8 @@ static int hdmi_codec_pcm_new(struct snd_soc_pcm_runtime *rtd,
if (!kctl)
return -ENOMEM;
- kctl->id.device = rtd->pcm->device;
+ if (!rtd->pcm->internal)
+ kctl->id.device = rtd->pcm->device;
ret = snd_ctl_add(rtd->card->snd_card, kctl);
if (ret < 0)
return ret;
--
2.34.1