snd_bcm2835: disable HDMI audio when vc4 is used (#3640)
authorHristo Venev <hristo@venev.name>
Fri, 5 Jun 2020 09:22:49 +0000 (09:22 +0000)
committerpopcornmix <popcornmix@gmail.com>
Wed, 1 Jul 2020 15:34:09 +0000 (16:34 +0100)
Things don't work too well when both the vc4 driver and the firmware
driver are trying to control the same audio output:

[  763.569406] bcm2835_audio bcm2835_audio: vchi message timeout, msg=5

Hence, when the vc4 HDMI driver is used, let it control audio. This is done
by introducing a new device tree property to the audio node, and
extending the vc4-kms-v3d overlays to set it appropriately.

Signed-off-by: Hristo Venev <hristo@venev.name>
arch/arm/boot/dts/overlays/README
arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts
drivers/staging/vc04_services/bcm2835-audio/bcm2835.c

index 9060fe7..3c38fbe 100644 (file)
@@ -2745,6 +2745,7 @@ Params: cma-256                 CMA is 256MB (needs 1GB)
         cma-size                CMA size in bytes, 4MB aligned
         cma-default             Use upstream's default value
         audio                   Enable or disable audio over HDMI (default "on")
+        noaudio                 Disable all HDMI audio (default "off")
 
 
 Name:   vc4-kms-v3d-pi4
@@ -2761,6 +2762,7 @@ Params: cma-256                 CMA is 256MB
                                 "on")
         audio1                  Enable or disable audio over HDMI1 (default
                                 "on")
+        noaudio                 Disable all HDMI audio (default "off")
 
 
 Name:   vga666
index caa64bf..6d34a2b 100644 (file)
                };
        };
 
+       fragment@14 {
+               target = <&audio>;
+               __overlay__  {
+                   brcm,disable-hdmi;
+               };
+       };
+
        __overrides__ {
-               audio   = <0>,"!13";
+               audio   = <0>,"!13", <0>,"=14";
+               noaudio = <0>,"=13", <0>,"!14";
        };
 };
index 134ad9e..935e946 100644 (file)
                };
        };
 
+       fragment@19 {
+               target = <&audio>;
+               __overlay__  {
+                   brcm,disable-hdmi;
+               };
+       };
+
        __overrides__ {
                audio   = <0>,"!17";
                audio1   = <0>,"!18";
+               noaudio = <0>,"=17", <0>,"=18", <0>,"!19";
        };
 };
index 2f465db..a53c39d 100644 (file)
@@ -381,7 +381,9 @@ static int snd_bcm2835_alsa_probe(struct platform_device *pdev)
        }
 
        if (!enable_compat_alsa) {
-               set_hdmi_enables(dev);
+               if (!of_property_read_bool(dev->of_node, "brcm,disable-hdmi"))
+                       set_hdmi_enables(dev);
+
                // In this mode, always enable analog output
                enable_headphones = true;
        } else {