diff options
Diffstat (limited to 'target/linux/brcm2708/patches-4.19/950-0541-drm-vc4-handle-the-case-where-there-are-no-available.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.19/950-0541-drm-vc4-handle-the-case-where-there-are-no-available.patch | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.19/950-0541-drm-vc4-handle-the-case-where-there-are-no-available.patch b/target/linux/brcm2708/patches-4.19/950-0541-drm-vc4-handle-the-case-where-there-are-no-available.patch new file mode 100644 index 0000000000..346d32e2d6 --- /dev/null +++ b/target/linux/brcm2708/patches-4.19/950-0541-drm-vc4-handle-the-case-where-there-are-no-available.patch @@ -0,0 +1,67 @@ +From dd99aa50a3ea7f7fe1ddfd59b1a2e969c744b8a0 Mon Sep 17 00:00:00 2001 +From: Jonathan Bell <jonathan@raspberrypi.org> +Date: Tue, 28 May 2019 13:56:06 +0100 +Subject: [PATCH] drm: vc4: handle the case where there are no + available displays + +It's reasonable for the firmware to return zero as the number of +attached displays. Handle this case as otherwise drm thinks that +the DSI panel is attached, which is nonsense. + +Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org> +--- + drivers/gpu/drm/vc4/vc4_firmware_kms.c | 32 +++++++++++++++----------- + 1 file changed, 18 insertions(+), 14 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c ++++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c +@@ -1309,13 +1309,13 @@ static int vc4_fkms_bind(struct device * + RPI_FIRMWARE_FRAMEBUFFER_GET_NUM_DISPLAYS, + &num_displays, sizeof(u32)); + +- /* If we fail to get the number of displays, or it returns 0, then ++ /* If we fail to get the number of displays, then + * assume old firmware that doesn't have the mailbox call, so just + * set one display + */ +- if (ret || num_displays == 0) { ++ if (ret) { + num_displays = 1; +- DRM_WARN("Unable to determine number of displays's. Assuming 1\n"); ++ DRM_WARN("Unable to determine number of displays - assuming 1\n"); + ret = 0; + } + +@@ -1344,17 +1344,21 @@ static int vc4_fkms_bind(struct device * + display_num); + } + +- /* Map the SMI interrupt reg */ +- crtc_list[0]->regs = vc4_ioremap_regs(pdev, 0); +- if (IS_ERR(crtc_list[0]->regs)) +- DRM_ERROR("Oh dear, failed to map registers\n"); +- +- writel(0, crtc_list[0]->regs + SMICS); +- ret = devm_request_irq(dev, platform_get_irq(pdev, 0), +- vc4_crtc_irq_handler, 0, "vc4 firmware kms", +- crtc_list); +- if (ret) +- DRM_ERROR("Oh dear, failed to register IRQ\n"); ++ if (num_displays > 0) { ++ /* Map the SMI interrupt reg */ ++ crtc_list[0]->regs = vc4_ioremap_regs(pdev, 0); ++ if (IS_ERR(crtc_list[0]->regs)) ++ DRM_ERROR("Oh dear, failed to map registers\n"); ++ ++ writel(0, crtc_list[0]->regs + SMICS); ++ ret = devm_request_irq(dev, platform_get_irq(pdev, 0), ++ vc4_crtc_irq_handler, 0, ++ "vc4 firmware kms", crtc_list); ++ if (ret) ++ DRM_ERROR("Oh dear, failed to register IRQ\n"); ++ } else { ++ DRM_WARN("No displays found. Consider forcing hotplug if HDMI is attached\n"); ++ } + + platform_set_drvdata(pdev, crtc_list); + |