Merge tag 'topic/drm-misc-2016-01-17' of git://anongit.freedesktop.org/drm-intel...
[deliverable/linux.git] / drivers / gpu / drm / i915 / intel_display.c
index 02f6ccb848a9f37a902a1439256c1888e13b2caf..ceaea7a3641a2aa2eb61bb5ee9a2cc639559e6b3 100644 (file)
@@ -6492,13 +6492,11 @@ static void intel_connector_check_state(struct intel_connector *connector)
 
 int intel_connector_init(struct intel_connector *connector)
 {
-       struct drm_connector_state *connector_state;
+       drm_atomic_helper_connector_reset(&connector->base);
 
-       connector_state = kzalloc(sizeof *connector_state, GFP_KERNEL);
-       if (!connector_state)
+       if (!connector->base.state)
                return -ENOMEM;
 
-       connector->base.state = connector_state;
        return 0;
 }
 
@@ -15446,6 +15444,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
                WARN_ON(drm_atomic_set_mode_for_crtc(crtc->base.state, NULL) < 0);
                crtc->base.state->active = crtc->active;
                crtc->base.enabled = crtc->active;
+               crtc->base.state->connector_mask = 0;
 
                /* Because we only establish the connector -> encoder ->
                 * crtc links if something is active, this means the
@@ -15648,7 +15647,21 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
        for_each_intel_connector(dev, connector) {
                if (connector->get_hw_state(connector)) {
                        connector->base.dpms = DRM_MODE_DPMS_ON;
-                       connector->base.encoder = &connector->encoder->base;
+
+                       encoder = connector->encoder;
+                       connector->base.encoder = &encoder->base;
+
+                       if (encoder->base.crtc &&
+                           encoder->base.crtc->state->active) {
+                               /*
+                                * This has to be done during hardware readout
+                                * because anything calling .crtc_disable may
+                                * rely on the connector_mask being accurate.
+                                */
+                               encoder->base.crtc->state->connector_mask |=
+                                       1 << drm_connector_index(&connector->base);
+                       }
+
                } else {
                        connector->base.dpms = DRM_MODE_DPMS_OFF;
                        connector->base.encoder = NULL;
@@ -15893,6 +15906,8 @@ void intel_modeset_cleanup(struct drm_device *dev)
        mutex_lock(&dev->struct_mutex);
        intel_cleanup_gt_powersave(dev);
        mutex_unlock(&dev->struct_mutex);
+
+       intel_teardown_gmbus(dev);
 }
 
 /*
This page took 0.027842 seconds and 5 git commands to generate.