aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp_mst.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 43db2e9ac575..aa21742d8634 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -307,9 +307,8 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
307 struct edid *edid; 307 struct edid *edid;
308 int ret; 308 int ret;
309 309
310 if (!intel_dp) { 310 if (!READ_ONCE(connector->registered))
311 return intel_connector_update_modes(connector, NULL); 311 return intel_connector_update_modes(connector, NULL);
312 }
313 312
314 edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port); 313 edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
315 ret = intel_connector_update_modes(connector, edid); 314 ret = intel_connector_update_modes(connector, edid);
@@ -324,9 +323,10 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force)
324 struct intel_connector *intel_connector = to_intel_connector(connector); 323 struct intel_connector *intel_connector = to_intel_connector(connector);
325 struct intel_dp *intel_dp = intel_connector->mst_port; 324 struct intel_dp *intel_dp = intel_connector->mst_port;
326 325
327 if (!intel_dp) 326 if (!READ_ONCE(connector->registered))
328 return connector_status_disconnected; 327 return connector_status_disconnected;
329 return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr, intel_connector->port); 328 return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr,
329 intel_connector->port);
330} 330}
331 331
332static void 332static void
@@ -366,7 +366,7 @@ intel_dp_mst_mode_valid(struct drm_connector *connector,
366 int bpp = 24; /* MST uses fixed bpp */ 366 int bpp = 24; /* MST uses fixed bpp */
367 int max_rate, mode_rate, max_lanes, max_link_clock; 367 int max_rate, mode_rate, max_lanes, max_link_clock;
368 368
369 if (!intel_dp) 369 if (!READ_ONCE(connector->registered))
370 return MODE_ERROR; 370 return MODE_ERROR;
371 371
372 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 372 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
@@ -398,7 +398,7 @@ static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *c
398 struct intel_dp *intel_dp = intel_connector->mst_port; 398 struct intel_dp *intel_dp = intel_connector->mst_port;
399 struct intel_crtc *crtc = to_intel_crtc(state->crtc); 399 struct intel_crtc *crtc = to_intel_crtc(state->crtc);
400 400
401 if (!intel_dp) 401 if (!READ_ONCE(connector->registered))
402 return NULL; 402 return NULL;
403 return &intel_dp->mst_encoders[crtc->pipe]->base.base; 403 return &intel_dp->mst_encoders[crtc->pipe]->base.base;
404} 404}
@@ -499,7 +499,6 @@ static void intel_dp_register_mst_connector(struct drm_connector *connector)
499static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, 499static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
500 struct drm_connector *connector) 500 struct drm_connector *connector)
501{ 501{
502 struct intel_connector *intel_connector = to_intel_connector(connector);
503 struct drm_i915_private *dev_priv = to_i915(connector->dev); 502 struct drm_i915_private *dev_priv = to_i915(connector->dev);
504 503
505 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id, connector->name); 504 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id, connector->name);
@@ -508,10 +507,6 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
508 if (dev_priv->fbdev) 507 if (dev_priv->fbdev)
509 drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper, 508 drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper,
510 connector); 509 connector);
511 /* prevent race with the check in ->detect */
512 drm_modeset_lock(&connector->dev->mode_config.connection_mutex, NULL);
513 intel_connector->mst_port = NULL;
514 drm_modeset_unlock(&connector->dev->mode_config.connection_mutex);
515 510
516 drm_connector_put(connector); 511 drm_connector_put(connector);
517} 512}