2019-08-09 17:50:30 +00:00
|
|
|
From a39d6a00d02a2e1d1afce976ded233bc40bf6b33 Mon Sep 17 00:00:00 2001
|
2019-07-09 18:32:28 +00:00
|
|
|
From: Jonathan Bell <jonathan@raspberrypi.org>
|
|
|
|
Date: Tue, 28 May 2019 13:56:06 +0100
|
2019-08-09 17:50:30 +00:00
|
|
|
Subject: [PATCH 617/773] drm: vc4: handle the case where there are no
|
2019-07-09 18:32:28 +00:00
|
|
|
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);
|
|
|
|
|