drm/vc4: Support the VEC in FKMS
authorDave Stevenson <dave.stevenson@raspberrypi.org>
Fri, 24 May 2019 16:59:01 +0000 (17:59 +0100)
committerpopcornmix <popcornmix@gmail.com>
Thu, 13 Jun 2019 10:54:31 +0000 (11:54 +0100)
Extends the DPI/DSI support to also report the VEC output
which supports interlacing too.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
drivers/gpu/drm/vc4/vc4_firmware_kms.c

index 8c7d3df..d4e8f5e 100644 (file)
@@ -125,6 +125,7 @@ struct set_timings {
 #define  TIMINGS_FLAGS_H_SYNC_NEG      0
 #define  TIMINGS_FLAGS_V_SYNC_POS      BIT(1)
 #define  TIMINGS_FLAGS_V_SYNC_NEG      0
+#define  TIMINGS_FLAGS_INTERLACE       BIT(2)
 
 #define TIMINGS_FLAGS_ASPECT_MASK      GENMASK(7, 4)
 #define TIMINGS_FLAGS_ASPECT_NONE      (0 << 4)
@@ -1047,6 +1048,12 @@ static int vc4_fkms_lcd_connector_get_modes(struct drm_connector *connector)
                        fw_mode.flags |= DRM_MODE_FLAG_PVSYNC;
                else
                        fw_mode.flags |= DRM_MODE_FLAG_NVSYNC;
+               if (mb.timings.flags & TIMINGS_FLAGS_V_SYNC_POS)
+                       fw_mode.flags |= DRM_MODE_FLAG_PVSYNC;
+               else
+                       fw_mode.flags |= DRM_MODE_FLAG_NVSYNC;
+               if (mb.timings.flags & TIMINGS_FLAGS_INTERLACE)
+                       fw_mode.flags |= DRM_MODE_FLAG_INTERLACE;
 
                fw_mode.base.type = DRM_MODE_OBJECT_MODE;
 
@@ -1133,17 +1140,24 @@ vc4_fkms_connector_init(struct drm_device *dev, struct drm_encoder *encoder,
                                   DRM_MODE_CONNECTOR_DSI);
                drm_connector_helper_add(connector,
                                         &vc4_fkms_lcd_conn_helper_funcs);
+               connector->interlace_allowed = 0;
+       } else if (fkms_connector->display_type == DRM_MODE_ENCODER_TVDAC) {
+               drm_connector_init(dev, connector, &vc4_fkms_connector_funcs,
+                                  DRM_MODE_CONNECTOR_Composite);
+               drm_connector_helper_add(connector,
+                                        &vc4_fkms_lcd_conn_helper_funcs);
+               connector->interlace_allowed = 1;
        } else {
                drm_connector_init(dev, connector, &vc4_fkms_connector_funcs,
                                   DRM_MODE_CONNECTOR_HDMIA);
                drm_connector_helper_add(connector,
                                         &vc4_fkms_connector_helper_funcs);
+               connector->interlace_allowed = 0;
        }
 
        connector->polled = (DRM_CONNECTOR_POLL_CONNECT |
                             DRM_CONNECTOR_POLL_DISCONNECT);
 
-       connector->interlace_allowed = 0;
        connector->doublescan_allowed = 0;
 
        drm_connector_attach_encoder(connector, encoder);