drm: vc4: handle the case where there are no available displays
authorJonathan Bell <jonathan@raspberrypi.org>
Tue, 28 May 2019 12:56:06 +0000 (13:56 +0100)
committerpopcornmix <popcornmix@gmail.com>
Wed, 1 Jul 2020 15:33:00 +0000 (16:33 +0100)
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

index 0b0a155..04b929a 100644 (file)
@@ -1303,13 +1303,13 @@ static int vc4_fkms_bind(struct device *dev, struct device *master, void *data)
                                    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;
        }
 
@@ -1338,17 +1338,21 @@ static int vc4_fkms_bind(struct device *dev, struct device *master, void *data)
                                  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);