1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter.git synced 2025-02-15 04:42:02 +00:00
openmptcprouter/root/target/linux/bcm27xx/patches-5.15/950-0177-Rename-HDMI-ALSA-device-names-check-for-enable-state.patch
Ycarus (Yannick Chabanois) 07d07219be Update bcm27xx 5.15 patches
2022-04-22 17:00:47 +02:00

139 lines
3.9 KiB
Diff

From 3a0c465116a10d93e406f1c11af9e74b1602945d Mon Sep 17 00:00:00 2001
From: James Hughes <james.hughes@raspberrypi.org>
Date: Tue, 24 Sep 2019 18:26:55 +0100
Subject: [PATCH 177/828] Rename HDMI ALSA device names, check for enable state
HDMI Alsa devices renamed to match names used by DRM, to
HDMI 1 and HDMI 2
Check for which HDMI devices are connected and only create
devices for those that are present.
The rename of the devices might cause some backwards compatibility
issues, but since this particular part of the driver needs to be
specifically enabled, I suspect the number of people who will see
the problem will be very small.
Signed-off-by: James Hughes <james.hughes@raspberrypi.org>
---
.../vc04_services/bcm2835-audio/bcm2835.c | 70 +++++++++++++++++--
1 file changed, 63 insertions(+), 7 deletions(-)
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c
@@ -9,8 +9,9 @@
#include <linux/of.h>
#include "bcm2835.h"
+#include <soc/bcm2835/raspberrypi-firmware.h>
-static bool enable_hdmi;
+static bool enable_hdmi, enable_hdmi0, enable_hdmi1;
static bool enable_headphones;
static bool enable_compat_alsa = true;
@@ -115,8 +116,8 @@ static struct bcm2835_audio_driver bcm28
.name = "bcm2835_hdmi",
.owner = THIS_MODULE,
},
- .shortname = "bcm2835 HDMI",
- .longname = "bcm2835 HDMI",
+ .shortname = "bcm2835 HDMI 1",
+ .longname = "bcm2835 HDMI 1",
.minchannels = 1,
.newpcm = bcm2835_audio_simple_newpcm,
.newctl = snd_bcm2835_new_hdmi_ctl,
@@ -128,8 +129,8 @@ static struct bcm2835_audio_driver bcm28
.name = "bcm2835_hdmi",
.owner = THIS_MODULE,
},
- .shortname = "bcm2835 HDMI 1",
- .longname = "bcm2835 HDMI 1",
+ .shortname = "bcm2835 HDMI 2",
+ .longname = "bcm2835 HDMI 2",
.minchannels = 1,
.newpcm = bcm2835_audio_simple_newpcm,
.newctl = snd_bcm2835_new_hdmi_ctl,
@@ -161,11 +162,11 @@ static struct bcm2835_audio_drivers chil
},
{
.audio_driver = &bcm2835_audio_hdmi0,
- .is_enabled = &enable_hdmi,
+ .is_enabled = &enable_hdmi0,
},
{
.audio_driver = &bcm2835_audio_hdmi1,
- .is_enabled = &enable_hdmi,
+ .is_enabled = &enable_hdmi1,
},
{
.audio_driver = &bcm2835_audio_headphones,
@@ -312,6 +313,53 @@ static int snd_add_child_devices(struct
return 0;
}
+static void set_hdmi_enables(struct device *dev)
+{
+ struct device_node *firmware_node;
+ struct rpi_firmware *firmware;
+ u32 num_displays, i, display_id;
+ int ret;
+
+ firmware_node = of_parse_phandle(dev->of_node, "brcm,firmware", 0);
+ firmware = rpi_firmware_get(firmware_node);
+
+ if (!firmware)
+ return;
+
+ of_node_put(firmware_node);
+
+ ret = rpi_firmware_property(firmware,
+ RPI_FIRMWARE_FRAMEBUFFER_GET_NUM_DISPLAYS,
+ &num_displays, sizeof(u32));
+
+ if (ret)
+ return;
+
+ for (i = 0; i < num_displays; i++) {
+ display_id = i;
+ ret = rpi_firmware_property(firmware,
+ RPI_FIRMWARE_FRAMEBUFFER_GET_DISPLAY_ID,
+ &display_id, sizeof(display_id));
+ if (!ret) {
+ if (display_id == 2)
+ enable_hdmi0 = true;
+ if (display_id == 7)
+ enable_hdmi1 = true;
+ }
+ }
+
+ if (!enable_hdmi0 && enable_hdmi1) {
+ /* Swap them over and reassign route. This means
+ * that if we only have one connected, it is always named
+ * HDMI1, irrespective of if its on port HDMI0 or HDMI1.
+ * This should match with the naming of HDMI ports in DRM
+ */
+ enable_hdmi0 = true;
+ enable_hdmi1 = false;
+ bcm2835_audio_hdmi0.route = AUDIO_DEST_HDMI1;
+ }
+}
+
static int snd_bcm2835_alsa_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -332,6 +380,14 @@ static int snd_bcm2835_alsa_probe(struct
numchans);
}
+ if (!enable_compat_alsa) {
+ set_hdmi_enables(dev);
+ // In this mode, always enable analog output
+ enable_headphones = true;
+ } else {
+ enable_hdmi0 = enable_hdmi;
+ }
+
err = bcm2835_devm_add_vchi_ctx(dev);
if (err)
return err;