mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-29 10:08:59 +00:00
7d7aa2fd92
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Despite, since subtargets range from bcm2708 to bcm2711, it seems appropriate to use bcm27xx instead of bcm2708 (again, as already done for BOARDNAME). This also renames the packages brcm2708-userland and brcm2708-gpu-fw. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
140 lines
3.9 KiB
Diff
140 lines
3.9 KiB
Diff
From 1ed6ab5bf2180bd96a78f27fde848f57f4d6b636 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] 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;
|