|
|
@@ -208,10 +208,35 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * drm_helper_probe_single_connector_modes() applies drm_mode_set_crtcinfo to
|
|
|
+ * all modes with flag CRTC_INTERLACE_HALVE_V. We don't want this, as it
|
|
|
+ * screws up vblank timestamping for interlaced modes, so fix it up.
|
|
|
+ */
|
|
|
+static int vc4_hdmi_connector_probe_modes(struct drm_connector *connector,
|
|
|
+ uint32_t maxX, uint32_t maxY)
|
|
|
+{
|
|
|
+ struct drm_display_mode *mode;
|
|
|
+ int count;
|
|
|
+
|
|
|
+ count = drm_helper_probe_single_connector_modes(connector, maxX, maxY);
|
|
|
+ if (count == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] probed adapted modes :\n",
|
|
|
+ connector->base.id, connector->name);
|
|
|
+ list_for_each_entry(mode, &connector->modes, head) {
|
|
|
+ drm_mode_set_crtcinfo(mode, 0);
|
|
|
+ drm_mode_debug_printmodeline(mode);
|
|
|
+ }
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
static const struct drm_connector_funcs vc4_hdmi_connector_funcs = {
|
|
|
.dpms = drm_atomic_helper_connector_dpms,
|
|
|
.detect = vc4_hdmi_connector_detect,
|
|
|
- .fill_modes = drm_helper_probe_single_connector_modes,
|
|
|
+ .fill_modes = vc4_hdmi_connector_probe_modes,
|
|
|
.destroy = vc4_hdmi_connector_destroy,
|
|
|
.reset = drm_atomic_helper_connector_reset,
|
|
|
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
|
|
|
@@ -246,7 +271,7 @@ static struct drm_connector *vc4_hdmi_connector_init(struct drm_device *dev,
|
|
|
connector->polled = (DRM_CONNECTOR_POLL_CONNECT |
|
|
|
DRM_CONNECTOR_POLL_DISCONNECT);
|
|
|
|
|
|
- connector->interlace_allowed = 0;
|
|
|
+ connector->interlace_allowed = 1;
|
|
|
connector->doublescan_allowed = 0;
|
|
|
|
|
|
drm_mode_connector_attach_encoder(connector, encoder);
|