From 5ff40397da36aa3b8b4c72f8bdfe5730e2008cac Mon Sep 17 00:00:00 2001 From: GamingTux <240287558+GamingTux@users.noreply.github.com> Date: Sun, 1 Nov 2026 21:10:07 +0100 Subject: [PATCH] drm/vc4: hdmi: Add Device Tree override for internal eDP panels on CM4/CM5 Compute Module 4 and 5 (CM4/CM5) carrier boards used in laptop and handheld form factors (such as the Argon ONE UP laptop, ClockworkPi u-Console, etc.) typically wire the internal LCD panel to one of the SoC HDMI controllers (commonly HDMI1). Because the VC4 HDMI driver unconditionally initializes all connectors as DRM_MODE_CONNECTOR_HDMIA: 1. Desktop environments (Cinnamon, GNOME/Mutter, KDE Plasma, XFCE) and systemd-logind treat the built-in screen as an external desktop monitor. This permanently breaks lid-switch clamshell logic (preventing suspend when closing the lid on a single screen, or inhibiting sleep when an external monitor is plugged into the secondary port). 2. Because the BCM2712/BCM2711 lacks native ACPI S3, laptop power management implementations (such as userspace standby daemons like rpi-fake-sleep) were previously forced into brittle workarounds (such as overriding EDID firmware, forcing vc4.force_hotplug, and reading debugfs registers) to prevent Wayland compositors (KWin, Mutter, Wayfire) from destroying the DrmOutput and crashing on lid close. Add a boolean Device Tree property "raspberrypi,is-internal-panel" to the HDMI controller nodes. When present, the connector type is set to DRM_MODE_CONNECTOR_eDP and the connector name is formatted as "eDP-%d". Expose this functionality in vc4-kms-v3d, vc4-kms-v3d-pi4, and vc4-kms-v3d-pi5 overlays via "hdmi0_edp" and "hdmi1_edp" parameters. Standard setups remain 100% unaffected when the property is omitted. Signed-off-by: GamingTux <240287558+GamingTux@users.noreply.github.com> --- arch/arm/boot/dts/overlays/README | 4 ++++ arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts | 2 ++ arch/arm/boot/dts/overlays/vc4-kms-v3d-pi5-overlay.dts | 2 ++ drivers/gpu/drm/vc4/vc4_hdmi.c | 8 ++++++++ 4 files changed, 16 insertions(+) diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README index 9f7578b8a9e83a..8b793b69f04deb 100644 --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -6368,6 +6368,10 @@ Params: cma-512 CMA is 512MB nohdmi Disable both HDMI 0 & 1 outputs nohdmi0 Disable HDMI 0 output nohdmi1 Disable HDMI 1 output + hdmi0_edp Configure HDMI 0 as an internal eDP panel + (for CM4/CM5 laptops and handhelds) + hdmi1_edp Configure HDMI 1 as an internal eDP panel + (for CM4/CM5 laptops and handhelds) Name: vc4-kms-v3d-pi5 diff --git a/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts index 02bbad743d772c..f49bd0791fb6df 100644 --- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts +++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts @@ -193,5 +193,7 @@ nohdmi0 = <0>, "-1-3-8"; nohdmi1 = <0>, "-2-4-10"; nohdmi = <0>, "-1-2-3-4-8-10"; + hdmi0_edp = <&hdmi0>, "raspberrypi,is-internal-panel?"; + hdmi1_edp = <&hdmi1>, "raspberrypi,is-internal-panel?"; }; }; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi5-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi5-overlay.dts index d469e717b5706c..fff9c5b63f3d79 100644 --- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi5-overlay.dts +++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi5-overlay.dts @@ -138,5 +138,7 @@ nohdmi0 = <0>, "-3-5-10"; nohdmi1 = <0>, "-4-6-11"; nohdmi = <0>, "-3-4-5-6-10-11"; + hdmi0_edp = <&hdmi0>, "raspberrypi,is-internal-panel?"; + hdmi1_edp = <&hdmi1>, "raspberrypi,is-internal-panel?"; }; }; diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index e858a5b878781a..018af3288f8ba9 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -567,6 +567,14 @@ static int vc4_hdmi_connector_init(struct drm_device *dev, if (ret) return ret; + /* CM4/CM5 internal panels: allow overriding connector type to eDP */ + if (of_property_read_bool(vc4_hdmi->pdev->dev.of_node, "raspberrypi,is-internal-panel")) { + connector->connector_type = DRM_MODE_CONNECTOR_eDP; + connector->connector_type_id = 1; + kfree(connector->name); + connector->name = kasprintf(GFP_KERNEL, "eDP-1"); + } + drm_connector_helper_add(connector, &vc4_hdmi_connector_helper_funcs); /*