diff --git a/packages/linux/patches/raspberrypi/linux-010-pr5052.patch b/packages/linux/patches/raspberrypi/linux-010-pr5052.patch new file mode 100644 index 0000000000..5b65b1a732 --- /dev/null +++ b/packages/linux/patches/raspberrypi/linux-010-pr5052.patch @@ -0,0 +1,60 @@ +From 00c2be0300d88d8c095921018306817650fe271b Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Wed, 1 Jun 2022 15:43:51 +0100 +Subject: [PATCH] drm/vc4_hdmi: Allow hotplug detect to be forced + +See: https://forum.libreelec.tv/thread/24783-tv-avr-turns-back-on-right-after-turning-them-off + +While the kernel provides a :D flag for assuming device is connected, +it doesn't stop this function from being called and generating a cec_phys_addr_invalidate +message when hotplug is deasserted. + +That message provokes a flurry of CEC messages which for many users results in the TV +switching back on again and it's very hard to get it to stay switched off. + +It seems to only occur with an AVR and TV connected but has been observed across a +number of manufacturers. + +The issue started with https://github.com/raspberrypi/linux/pull/4371 +and this provides an optional way of getting back the old behaviour + +Signed-off-by: Dom Cobley +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 5d37cd0741b6f..793dc56746ee6 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -40,6 +40,8 @@ + #include + #include + #include ++#include ++#include + #include + #include + #include +@@ -113,6 +115,10 @@ + + #define HDMI_14_MAX_TMDS_CLK (340 * 1000 * 1000) + ++/* bit field to force hotplug detection. bit0 = HDMI0 */ ++static int force_hotplug = 0; ++module_param(force_hotplug, int, 0644); ++ + static const char * const output_format_str[] = { + [VC4_HDMI_OUTPUT_RGB] = "RGB", + [VC4_HDMI_OUTPUT_YUV420] = "YUV 4:2:0", +@@ -248,7 +254,9 @@ vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) + + WARN_ON(pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev)); + +- if (vc4_hdmi->hpd_gpio) { ++ if (force_hotplug & BIT(vc4_hdmi->encoder.base.type - VC4_ENCODER_TYPE_HDMI0)) ++ connected = true; ++ else if (vc4_hdmi->hpd_gpio) { + if (gpiod_get_value_cansleep(vc4_hdmi->hpd_gpio)) + connected = true; + } else {