Merge tag 'drm-intel-fixes-2015-08-14' into drm-intel-next-fixes
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / i915 / intel_dp_mst.c
index 600afdbef8c9a434f51d527c5d85e202c36bae2b..f4fe1183bae694fd8446611b400d2128bc7128a1 100644 (file)
@@ -328,7 +328,7 @@ intel_dp_mst_connector_destroy(struct drm_connector *connector)
 }
 
 static const struct drm_connector_funcs intel_dp_mst_connector_funcs = {
-       .dpms = intel_connector_dpms,
+       .dpms = drm_atomic_helper_connector_dpms,
        .detect = intel_dp_mst_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .set_property = intel_dp_mst_set_property,
@@ -452,10 +452,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;
 }
@@ -465,19 +464,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");