diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 17 |
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 | ||
332 | static void | 332 | static 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) | |||
499 | static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | 499 | static 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 | } |