drm/i915: Update atomic state when removing mst connector, v3.
[linux-2.6-block.git] / drivers / gpu / drm / i915 / intel_dp_mst.c
index 6e4cc5334f47d7105b60c0bec72fccfb4875ddac..5e75d6f8ba8c7dc6c93ef589d04bb8e0d8494452 100644 (file)
@@ -441,10 +441,9 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
        drm_object_attach_property(&connector->base, dev->mode_config.tile_property, 0);
 
        drm_mode_connector_set_path_property(connector, pathprop);
-       drm_reinit_primary_mode_group(dev);
-       mutex_lock(&dev->mode_config.mutex);
+       drm_modeset_lock_all(dev);
        intel_connector_add_to_fbdev(intel_connector);
-       mutex_unlock(&dev->mode_config.mutex);
+       drm_modeset_unlock_all(dev);
        drm_connector_register(&intel_connector->base);
        return connector;
 }
@@ -454,19 +453,28 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
 {
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct drm_device *dev = connector->dev;
+
        /* need to nuke the connector */
-       mutex_lock(&dev->mode_config.mutex);
-       intel_connector_dpms(connector, DRM_MODE_DPMS_OFF);
-       mutex_unlock(&dev->mode_config.mutex);
+       drm_modeset_lock_all(dev);
+       if (connector->state->crtc) {
+               struct drm_mode_set set;
+               int ret;
+
+               memset(&set, 0, sizeof(set));
+               set.crtc = connector->state->crtc,
+
+               ret = drm_atomic_helper_set_config(&set);
+
+               WARN(ret, "Disabling mst crtc failed with %i\n", ret);
+       }
+       drm_modeset_unlock_all(dev);
 
        intel_connector->unregister(intel_connector);
 
-       mutex_lock(&dev->mode_config.mutex);
+       drm_modeset_lock_all(dev);
        intel_connector_remove_from_fbdev(intel_connector);
        drm_connector_cleanup(connector);
-       mutex_unlock(&dev->mode_config.mutex);
-
-       drm_reinit_primary_mode_group(dev);
+       drm_modeset_unlock_all(dev);
 
        kfree(intel_connector);
        DRM_DEBUG_KMS("\n");